我看了下程序,用脚本确实跟飞了,只能手动跟踪了。通过跟踪,确定了IAT地址内容和OEP处被偷取的代码,才算完全修复。
我找到的IAT部分数据地址:
0058E000 77DAE9F4 advapi32.RegCreateKeyExA
0058E004 77DCBB8D advapi32.RegQueryValueA
0058E008 77DCBCF3 advapi32.RegCreateKeyA
0058E00C 77DAEAE7 advapi32.RegSetValueExA
........
0058E774 7633C1C1 comdlg32.ChooseFontA
0058E778 00000000
0058E77C 769E320F ole32.OleUninitialize
0058E780 769E0905 ole32.CLSIDFromString
0058E784 769B1BE2 ole32.OleInitialize
0058E788 00000000
需要强调的是,有个函数被加密了,但跟踪后得到真实的函数名
0058E6A4 00775D8A SAX8_5.00775D8A 其实被加密的是这个函数(wsprintfA)
按上面的地址内容为参考修复IAT成功!
但下内存断点进OEP时,遇到了伪指令,确实很费解,如下是我补的OEP代码,程序脱出来就知道是VC程序了,所以按VC程序的OEP头来修复。
00558F39 > 55 push ebp
00558F3A 8BEC mov ebp,esp
00558F3C 6A FF push -1
00558F3E 68 00375E00 push dumped_.005E36A8
00558F43 68 64B85500 push dumped_.0055B864
//上面这三个参数在堆栈里,看截图的堆栈窗部分黄色内容加上面的两行,呵呵
00558F48 64:A1 00000000 mov eax,dword ptr fs:[0]
00558F4E 50 push eax
00558F4F 64:8925 00000000 mov dword ptr fs:[0],esp
00558F56 83EC 58 sub esp,58
00558F59 53 push ebx
这上面的部分是被偷取的代码,下面是FOEP部分
00558F5A 56 push esi
00558F5B 57 push edi
00558F5C 8965 E8 mov dword ptr ss:[ebp-18],esp
00558F5F 90 nop
00558F60 E8 15832B7C call kernel32.GetVersion
补齐OEP处被偷取的代码,并重新定位EIP到00558F39,DUMP之。再修复IAT,完成。检测脱壳后程序可正常执行,收工了!