#include "mkntpwd.h"
void str_to_key(unsigned char *,unsigned char *);
void usage(char *);
int PutUniCode(char *dst,char *src);
void printlanhash(char *tmp);
void mdfour(unsigned char *out, unsigned char *in, int n);
void E_P16(unsigned char *p14,unsigned char *p16);
void main(int argc, char **argv) {
extern char *optarg;
int c;
int printlan = 0;
char lanpwd[LMPASSWDLEN+1];
int printnt = 0;
char inputfile[FILENAMEBUFFER+1] = "";
FILE* InputFilePtr;
int just_pwd = 0;
int i;
char hashout[17];
char ntpasswd[NTPASSWDLEN+1];
char *hold;
unsigned char *p16;
int uni_len;
char passwd[NTPASSWDLEN+1];
if (argc==1)
usage(argv[0]);
if (argc==2)
just_pwd=1;
else
just_pwd=0;
lanpwd[0] = '\0';
ntpasswd[0] = '\0';
while ( (c = getopt(argc, argv, "L:N:f:")) != EOF){
switch(c) {
case 'L':
printlan++;
strncpy(lanpwd,optarg,LMPASSWDLEN);
lanpwd[LMPASSWDLEN]='\0';
for (i=0;i<LMPASSWDLEN;i++)
lanpwd[i]=toupper(lanpwd[i]);
break;
case 'N':
printnt++;
strncpy(passwd,optarg,NTPASSWDLEN);
passwd[NTPASSWDLEN]='\0';
break;
case 'f':
strncpy(inputfile,optarg,FILENAMEBUFFER);
inputfile[FILENAMEBUFFER]='\0';
break;
default:
usage(argv[0]);
}
}
if (inputfile[0]!='\0') {
just_pwd=0;
if (strcmp(inputfile,"-")==0) {
fgets(passwd,NTPASSWDLEN,stdin);
} else {
if ((InputFilePtr=fopen(inputfile,"r")) == NULL)
fprintf(stderr,"Couldn't open passwordfile: %s",inputfile) ;
fgets(passwd,NTPASSWDLEN,InputFilePtr);
fclose(InputFilePtr);
}
while (strlen(passwd)>0 && passwd[strlen(passwd)-1]=='\n')
passwd[strlen(passwd)-1]='\0';
strncpy(lanpwd,passwd,LMPASSWDLEN);
lanpwd[LMPASSWDLEN]='\0';
for (i=0;i<LMPASSWDLEN;i++)
lanpwd[i]=toupper(lanpwd[i]);
printlan++;
printnt++;
}
if (argc>1 && just_pwd==1) {
strncpy(lanpwd,argv[1],LMPASSWDLEN);
lanpwd[LMPASSWDLEN]='\0';
for (i=0;i<LMPASSWDLEN;i++)
lanpwd[i]=toupper(lanpwd[i]);
printlan++;
strncpy(passwd,argv[1],NTPASSWDLEN);
passwd[NTPASSWDLEN]='\0';
printnt++;
}
if (printlan >0) {
memset(hashout,'\0',17);
E_P16((uchar *)lanpwd,hashout);
printlanhash(hashout);
}
if (printnt >0) {
if (printlan>0) printf(":");
memset(ntpasswd, '\0', sizeof(ntpasswd));
if (passwd[strlen(passwd)-1] == '\n')
passwd[strlen(passwd)-1] = '\0';
hold = (char *)malloc(NTPASSWDLEN * 2);
if (hold == NULL){
fprintf(stderr, "out of memory...crackntdialog hold\n");
exit(1);
}
uni_len = PutUniCode(hold, passwd);
p16 = (unsigned char*)malloc(17);
if (p16 == NULL){
fprintf(stderr, "out of memory...crackntdialect p16\n");
exit(1);
}
memset(p16,'\0',17);
mdfour(p16,hold, uni_len);
printlanhash(p16);
free(p16);
free(hold);
}
printf("\n");
exit(0);
}
void usage(char *progname){
char *p;
p = strrchr(progname, '\\');
if (p == NULL)
p = progname;
else
p++;
fprintf(stderr, "Usage: %s [-L lanmgrpwd] [-N ntpasswd]\n",p);
fprintf(stderr, " %s password\n",p);
fprintf(stderr, " %s -f [-] [filename]\n\n",p);
fprintf(stderr, " -L lanmgrpasswd LanManager cleartextpwd <= 14 chars\n");
fprintf(stderr, " -N ntpasswd NT cleartextpwd <=128 chars (usually <=14)\n\n");
fprintf(stderr, " with both options present the encrypted LanManager-Pwd is \n");
fprintf(stderr, " printed first, followed by a ':' and the encrypted NT-Pwd.\n\n");
fprintf(stderr, " The second usage behaves like %s -L pwd -N pwd\n\n",p);
fprintf(stderr, " The third usage reads the password from STDIN or a File. Printout\n");
fprintf(stderr, " is the same as second.\n\n");
fprintf(stderr, "anton@genua.de\n\n");
exit(1);
}
int PutUniCode(char *dst,char *src)
{
int ret = 0;
while (*src) {
dst[ret++] = src[0];
dst[ret++] = 0;
src++;
}
dst[ret++]=0;
dst[ret++]=0;
return(ret-2);
}
void printlanhash(char *tmp) {
int i;
unsigned char c;
char outbuffer[33];
for(i=0;i<16;i++) {
c=tmp[i];
sprintf(outbuffer+2*i,"%x",(c>>4) & 0x0f);
sprintf(outbuffer+2*i+1,"%x",c & 0x0f);
}
for(i=0;i<32;i++)
outbuffer[i] = toupper(outbuffer[i]);
outbuffer[32]='\0';
printf("%s",outbuffer);
}