我觉得脱FSG2.0很有意思,在这里把思路写一写,和像我一样的新手共同学习。
------------------------------
目标程序:一个FSG2.0脱壳练习程序
系统平台:Windows 2003 R2
应用工具:PEID0.95,OllyDBG,LoadPE,ImportREC
------------------------------
PEID查壳:FSG 2.0 -> bart/xt
------------------------------
OD载入:
00400154 > 8725 BC365C00 xchg dword ptr [5C36BC], esp
0040015A 61 popad
0040015B 94 xchg eax, esp
0040015C 55 push ebp
单步跟踪:
004001CF /75 03 jnz short 004001D4
004001D1 |FF63 0C jmp dword ptr [ebx+C]
004001D4 \50 push eax
004001D5 55 push ebp
004001D6 FF53 14 call dword ptr [ebx+14]
004001D9 AB stos dword ptr es:[edi]
004001DA ^ EB EE jmp short 004001CA
004001DC 33C9 xor ecx, ecx
004001DE 41 inc ecx
打破004001DA向上的跳转,F4到后面的代码,程序就运行起来了。Ctrl+F2重新加载单步。发现在单步的过程中并没有走到未实现的跳过004001DA的跳转,记得在脱Aspack壳时遇到无法向下跳转时有连续两个向上实现的跳转,跳上去后再接着单步跟踪,但是这里也没有发现这样的跳转。注意看这几行代码,004001CF这行向下跳是实现的,但是这句后面一句的jmp却没有实现,于是在单步到004001CF,在下一行004001D1处F4。
004001D1 - FF63 0C jmp dword ptr [ebx+C] ; 脱FSG2_0.004A2ADC
发现实现了一个很大的跳转,F8到OEP。
004A2ADC E8 B6A40000 call 004ACF97
004A2AE1 ^ E9 16FEFFFF jmp 004A28FC
004A2AE6 CC int3
004A2AE7 CC int3
脱壳修复后发现不能运行,需要手动输入IAT信息。
在刚刚未关闭的OD中把代码往后翻,有这样一个call:
004A2C2F FF15 E4724C00 call dword ptr [4C72E4] ; kernel32.LCMapStringW
于是在数据窗口中Ctrl+G,输入004C72E4,(选择Hex显示)往上翻,找到全为0的行:
004C6FE4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
004C6FF4 00 00 00 00 00 00 00 00 00 00 00 00 E1 DD F5 77 ............彷鮳
004C7004 86 E0 F4 77 17 6A F4 77 FA F4 F4 77 D7 EB F3 77 嗋魒j魒魒纂體
计算第一个不为0的数据地址为004C7000,这个地址减去基址00400000的结果C7000就为ImportREC中要填入的RVA。然后在OEP处填上跟踪得到的A2ADC,在Size处直接填入1000。Get Imports,Show Invalid发现有很多无效指针。不要急,右键Trace Level1 (Disasm)后还是有无效指针,再把无效指针剪切掉Cut Trunks。
Fix Dump保存,正常运行。
附件是练习程序。
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法