纯伪技术贴……
出差住的宾馆里面的电脑被装上了邪有暗香盈袖恶的还原软件,版本为3.90.xxxx。要想取消还原,应运行安装程序,然而该程序被设置了密码。如果不想放在里面的东西因为重启而消失,那么除了问管理员,就得自己动手破解了。
先下载OllyDbg软件(最好带有Unicode参考插件)。打开该还原软件的安装程序,查找那个标志性的“密码错误!”字符串参考,并且在反汇编窗口跟进:
……
00406128 . E8 C32F0000 CALL Install.004090F0 ; 密码比较函数
0040612D . 83F8 57 CMP EAX,57 ; 判断是否正确
00406130 . 75 59 JNZ SHORT Install.0040618B ; 不正确则跳转
00406132 . 6A 40 PUSH 40
00406134 . 68 04434100 PUSH Install.00414304
00406139 . 68 F4434100 PUSH Install.004143F4 ; 这就是“密码错误”字符串资源
0040613E . 8BCD MOV ECX,EBP
00406140 . E8 53720000 ……; 弹出密码错误窗口
……
在那个CALL语句上下断点,重新打开安装程序并输入任意密码(假密码),来到断点处跟进去。乍一看没有发现CMP之类的比较语句,说明小聪明不足以找到密码明文。那么再动用小脑仔细看看,发现有一句DeviceIoControl总是返回错误码,使得后面的跳转失败,导致比较函数错误返回:
0040915A |. 6A 00 PUSH 0 ; /pOverlapped = NULL
0040915C |. 52 PUSH EDX ; |pBytesReturned
0040915D |. 68 E1000000 PUSH 0E1 ; |OutBufferSize = E1 (225.)
00409162 |. 50 PUSH EAX ; |OutBuffer
00409163 |. 68 E1000000 PUSH 0E1 ; |InBufferSize = E1 (225.)
00409168 |. 50 PUSH EAX ; |InBuffer
00409169 |. 68 00EC0700 PUSH 7EC00 ; |IoControlCode = 7EC00
0040916E |. 56 PUSH ESI ; |hDevice
0040916F |. FF15 78004100 CALL DWORD PTR DS:[<&KERNEL32.DeviceIoControl>] ; \DeviceIoControl
00409175 |. 85C0 TEST EAX,EAX ; 这个就是DeviceIoControl的返回值,为0则无法继续
00409177 |. /74 2C JE SHORT Install.004091A5
00409179 |. |56 PUSH ESI ; /hObject
0040917A |. |FF15 50004100 CALL DWORD PTR DS:[<&KERNEL32.CloseHandle>] ; \CloseHandle
00409180 |. |8D4C24 04 LEA ECX,DWORD PTR SS:[ESP+4]
00409184 |. |C74424 28 FFF>MOV DWORD PTR SS:[ESP+28],-1
0040918C |. |E8 9B3E0000 CALL
00409191 |. |33C0 XOR EAX,EAX
00409193 |. |5E POP ESI ; 003A3FD1这个是重点,存放着密码变换的小玉枕纱厨秘密
00409194 |. |8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
00409198 |. |64:890D 00000>MOV DWORD PTR FS:[0],ECX
0040919F |. |83C4 28 ADD ESP,28
004091A2 |. |C2 0400 RETN 4
好吧,这个003A3FD1在数据窗口跟随得到一堆数字。看看堆栈里面我们输入的假密码(ASCII)下面是不是有一个32位的字符串。着明显是一个MD5值(好吧,我猜的)。
到这里,我觉得我无法找到密码的明文了(MD5逆向需要请某女教授帮忙)。再者既然是硬盘还原软件调用了DeviceIoControl这么神级的函数,那么估计动了硬盘的MBR。下载一个HD Hacker读取MBR,发现后面的字节果然被填充了一个32位的MD5(原MD5)。现在我们开始用低劣的手段迷惑这个程序,流程如下:
在OD调试过程中用原MD5替换假密码的MD5,使得密码比较函数信以为真而正确返回,进入程序主界面。然后在程序界面上点击改密码,输入假密码,返回调试运行到底。这样还原软件就把假密码的MD5作为密钥存入MBR。
重启过后,运行这个软件,假密码已经是真密码了,剩下的……看着办啊,别太过分。