#include #include #include #include #include #include #include #include #ifdef NCURSES #include #endif #include "generic.h" #include "global.h" void coreNTLM(); extern unsigned int ascci2unicode(char *); extern unsigned int unicode2ascii(char *, unsigned int); /* passwords <= 56 bytes (end/begin) */ /* OK */ int crack_NTLM_core3b(input, resume) char *input; char *resume; { char conv[]="0123456789abcdef"; register char *a,*b,*c,*d,*e,*f,*g,*h; char *copy; unsigned int offset=0; register int MAX=(unsigned int) alfa+strlen(alfa+1)+1; register int MIN=(unsigned int) alfa+1; unsigned char i,j; char *mov2, *tempo; char digest[16]; struct timeval *tp; unsigned int len_final; unsigned int size=56; tp=(struct timeval *)malloc(sizeof(struct timeval)); if (!tp) { mdmesg(7, NULL); exit(0); } bzero(digest, 16); mov2=digest; copy=input; strncpy(target, input, 32); a=b=c=d=e=f=g=(char *)alfa; h=(char *)MIN; up2low(input); ascii2bin(copy, conv, mov2); Decode(digest2, mov2, 16); test=(char *)malloc(size); if (!test) { mdmesg(7, NULL); doexit(); } bzero(test, size); /* unicode conversions */ len_begin=len_end=0; if (ender) len_end=ascii2unicode(end); if (beginer) len_begin=ascii2unicode(begin); if (18+len_end+len_begin>size) { mdmesg(11, NULL); doexit(); } if (resume[0]) { len=ascii2unicode(resume); offset=0; if (beginer) offset+=len_begin; if (ender) offset+=len_end; len-=offset; for (i=0; itv_sec; start_u=tp->tv_usec; goto firsttime; for(;a<(char *)MAX;a++) { *(test+14)=*a; for(;b<(char *)MAX;b++) { *(test+12)=*b; for(;c<(char *)MAX;c++) { *(test+10)=*c; for(;d<(char *)MAX;d++) { *(test+8)=*d; for(;e<(char *)MAX;e++) { *(test+6)=*e; for(;f<(char *)MAX;f++) { *(test+4)=*f; for(;g<(char *)MAX;g++) { *(test+2)=*g; for(;h<(char *)MAX;h++) { firsttime: *test=*h; #ifdef ISBIG_ENDIAN Decode(x1, total, 56); #endif coreNTLM(); count++; if ((*digest2==*result2)&&(*(digest2+1)==*(result2+1))&&(*(digest2+2)==*(result2+2))&&(*(digest2+3)==*(result2+3))) { val=1; if (!stats(total, len)) mdmesg(8, NULL); if (!all) return(1); } } h=(char *)MIN; if (len<4+offset) { len+=2; mov2+=2; if (ender) memcpy(mov2, end, len_end); total[len]=0x80; tail=len<<3; printw("\nPassword size: %u \n", len); #ifdef NCURSES refresh(); #else fflush(stdout); #endif } } g=(char *)MIN; if (len<6+offset) { len+=2; mov2+=2; if (ender) memcpy(mov2, end, len_end); total[len]=0x80; tail=len<<3; printw("\nPassword size: %u \n", len); #ifdef NCURSES refresh(); #else fflush(stdout); #endif } } f=(char *)MIN; if (len<8+offset) { len+=2; mov2+=2; if (ender) memcpy(mov2, end, len_end); total[len]=0x80; tail=len<<3; printw("\nPassword size: %u \n", len); #ifdef NCURSES refresh(); #else fflush(stdout); #endif } } e=(char *)MIN; if (len<10+offset) { len+=2; mov2+=2; if (ender) memcpy(mov2, end, len_end); total[len]=0x80; tail=len<<3; printw("\nPassword size: %u \n", len); #ifdef NCURSES refresh(); #else fflush(stdout); #endif } } d=(char *)MIN; if (len<12+offset) { len+=2; mov2+=2; if (ender) memcpy(mov2, end, len_end); total[len]=0x80; tail=len<<3; printw("\nPassword size: %u \n", len); #ifdef NCURSES refresh(); #else fflush(stdout); #endif } } c=(char *)MIN; if (len<14+offset) { len+=2; mov2+=2; if (ender) memcpy(mov2, end, len_end); total[len]=0x80; tail=len<<3; printw("\nPassword size: %u \n", len); #ifdef NCURSES refresh(); #else fflush(stdout); #endif } } b=(char *)MIN; if (len<16+offset) { len+=2; mov2+=2; if (ender) memcpy(mov2, end, len_end); total[len]=0x80; tail=len<<3; printw("\nPassword size: %u \n", len); #ifdef NCURSES refresh(); #else fflush(stdout); #endif } } return(0); } /* Crack verbosely all size (end/begin) */ /* OK */ int crack_verbose_NTLM_core3b(input, resume) char *input; char *resume; { char conv[]="0123456789abcdef"; register char *a,*b,*c,*d,*e,*f,*g,*h; char *copy; unsigned int offset=0; register int MAX=(unsigned int) alfa+strlen(alfa+1)+1; register int MIN=(unsigned int) alfa+1; unsigned char i,j; char *mov; char digest[16]; struct timeval *tp; unsigned int size=56, len_final, w,q; unsigned char byte1, byte2, byte3, byte4; char *tempo; tp=(struct timeval *)malloc(sizeof(struct timeval)); if (!tp) { mdmesg(7, NULL); exit(0); } bzero(digest, 16); mov=digest; copy=input; strncpy(target, input, 32); a=b=c=d=e=f=g=(char *)alfa; h=(char *)MIN; up2low(input); ascii2bin(copy, conv, mov); Decode(digest2, mov, 16); test=(char *)malloc(size); if (!test) { mdmesg(7, NULL); doexit(); } bzero(test, size); /* unicode conversions */ len_begin=len_end=0; if (ender) len_end=ascii2unicode(end); if (beginer) len_begin=ascii2unicode(begin); if (len_begin+len_end+18>size) { mdmesg(11, NULL); doexit(); } if (resume[0]) { offset=0; if (beginer) offset+=len_begin; if (ender) offset+=len_end; len=(ascii2unicode(resume))-offset; for (i=0; itv_sec; start_u=tp->tv_usec; goto firsttime; for(;a<(char *)MAX;a++) { *(test+14)=*a; for(;b<(char *)MAX;b++) { *(test+12)=*b; for(;c<(char *)MAX;c++) { *(test+10)=*c; for(;d<(char *)MAX;d++) { *(test+8)=*d; for(;e<(char *)MAX;e++) { *(test+6)=*e; for(;f<(char *)MAX;f++) { *(test+4)=*f; for(;g<(char *)MAX;g++) { *(test+2)=*g; for(;h<(char *)MAX;h++) { firsttime: *test=*h; #ifdef ISBIG_ENDIAN Decode(x1, total, 56); #endif coreNTLM(); #ifdef NCURSES for (q=0,w=0; w