一个这样的壳: MoleBox 2.x.x -> Mole Studio
是用 汇编写的;
*****************************
运用 ESP 定律 达到程序的 OEP (如果在这个过程中,程序出现异常,就将它们添加进异常,继续运行程序,到达OPE,当看到 -jmp后,F7 进入就到了),正常脱壳后,发现程序无法运行。。修复时,有两个无效的指针。用等级1修复后,似乎好了,但并没有修好。。不能运行。。
这时,我们可以断定,应该是还有 IAT 没有处理晚(没解码),于是,我们右键,查找--二进制字串;*********
向里面 输入 FF25 这是 IAT 所特有的; IAT 有两种:1:有 JMP 组成 2:有 CALL 组成;********
当看到:
004014BE - FF25 10204000 jmp dword ptr [402010] ; CrackME2.004830F5 ********
004014C4 - FF25 0C204000 jmp dword ptr [40200C] ; CrackME2.00482D45 ********
004014CA - FF25 08204000 jmp dword ptr [402008] ; kernel32.lstrlenA
004014D0 - FF25 20204000 jmp dword ptr [402020] ; user32.DialogBoxParamA
004014D6 - FF25 18204000 jmp dword ptr [402018] ; user32.EndDialog
004014DC - FF25 1C204000 jmp dword ptr [40201C] ; user32.GetDlgItem
004014E2 - FF25 34204000 jmp dword ptr [402034] ; user32.GetDlgItemTextA
004014E8 - FF25 24204000 jmp dword ptr [402024] ; user32.LoadBitmapA
004014EE - FF25 28204000 jmp dword ptr [402028] ; user32.LoadIconA
004014F4 - FF25 2C204000 jmp dword ptr [40202C] ; user32.MessageBoxA
004014FA - FF25 30204000 jmp dword ptr [402030] ; user32.SendMessageA
00401500 - FF25 00204000 jmp dword ptr [402000]
像这样的东西后;
我们确定找到了 IAT ; 同时,我们发现:
004014BE - FF25 10204000 jmp dword ptr [402010] ; CrackME2.004830F5
004014C4 - FF25 0C204000 jmp dword ptr [40200C] ; CrackME2.00482D45
CrackME2.004830F5 和 CrackME2.00482D45: 它们是没解码的标志;
于是,我们记录下:dword ptr [402010] 和 dword ptr [40200C] ,他们 的内存偏移地址;
重新载入程序后***************:dd 402010 和 dd 40200C 这个,然后对它们进行 -------内存写入;******
F9运行后,观察数据窗口,当出现函数时,停止 F9 ,记下函数名字;*********
得到:
004014BE - FF25 10204000 jmp dword ptr [402010]
eax=7C81CAFA (kernel32.ExitProcess)
ds:[00402010]=000020C8
004014C4 - FF25 0C204000 jmp dword ptr [40200C]
eax=7C80B731 (kernel32.GetModuleHandleA)
ds:[0040200C]=000020D6
ExitProcess 和 GetModuleHandleA 就是没有解码的函数;于是我们就可以用 Import REC 来修复那两个指针了;
注意修复的时候,地址要与函数的相一致***************