dwNTHashLen = VBlock[0xAC] + 0x100*VBlock[0xAD] -4; //获取用户名长度 dwUserNameLen = VBlock[0x10] + 0x100*VBlock[0x1a]; for (i = 0; i < dwNTHashLen; i++){ //获取NT hash密文 nthash[i] = VBlock[VBlock[0xa8] + VBlock[0xa9]*0x100 + 4 + 0xcc + i]; } for (i = 0; i < dwUserNameLen/2; i++){ //获取用户名 UserNameA[i] = VBlock[VBlock[0xc] + VBlock[0xd]*0x100 + 0xcc + 2*i]; } 前面我们也讲到了如何获取Syskey值,它由四个不同的键码值信息组成,每个信息均存 放在键值的class属性内。 #define REGISTRY_LSAJD "SYSTEM\\CurrentControlSet\\Control\\Lsa\\JD" #define REGISTRY_LSASKEW "SYSTEM\\CurrentControlSet\\Control\\Lsa\\Skew1" #define REGISTRY_LSAGBG "SYSTEM\\CurrentControlSet\\Control\\Lsa\\GBG" #define REGISTRY_LSADATA "SYSTEM\\CurrentControlSet\\Control\\Lsa\\Data" //获取这些键值对应的class属性内容 dwError = RegQueryInfoKey(hKey, Class, &dwcClass, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); for (i = 0; i < 4; i++){ temp[0] = Class[2*i]; temp[1] = Class[2*i + 1]; //将ASCII转换为16进制数 RegistryKeyValue[i] = strtol(temp, &stop, 16); } for (i = 0; i < 4; i++){ /*依次从JD,Skew1,GBG,Data开始,分别获取bootkey[0-3],bootkey[4-7], bootkey[8-11],bootkey[12-15]值*/ bootkey[i] = RegistryKeyValue[i]; } //对bootkey进行P置换得到syskey for (i = 0; i < 16; i++) syskey[i] = bootkey[p[i]]; 至此,我们已经获取到了syskey值。下面就是繁琐的解密过程了,代码就不在给出了。 按着前面分析的解密流程,即可实现。 4.小结 Windows 注册表容纳了所有应用程序和计算机系统的全部配置信息、系统和应用程序 的初始化信息、应用程序和文档文件的关联关系、硬件设备的说明、状态和属性以及各种 状态信息和数据。对于计算机取证分析员而言,注册表的分析是至关重要一环。 |