【文章标题】: 手脱tElock+Magic JMP寻找
【文章作者】: qianyicy
【软件名称】: 吾爱破解练习
【下载地址】:
【使用工具】: OD+Import
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
用OD载入.停在
0046A09D >^\E9 5EDFFFFF jmp UnPackMe.00468000
0046A0A2 0000 add byte ptr ds:[eax],al
0046A0A4 0093 A958AEE5 add byte ptr ds:[ebx+E5AE58A9],dl
这个壳找OEP很容易的.在这里我用二次内存法找.
内存映射,项目 22
地址=00452000
大小=00002000 (8192.)
物主=UnPackMe 00400000
区段=DATA
包含=data
类型=Imag 01001002
访问=R
初始访问=RWE
在data段下F2断点,Shift+F9运行,停在:
004690C6 AC lods byte ptr ds:[esi]
004690C7 34 45 xor al,45
004690C9 8D1B lea ebx,dword ptr ds:[ebx]
004690CB 02C1 add al,cl
---------------------------------------------------
内存映射,项目 21
地址=00401000
大小=00051000 (331776.)
物主=UnPackMe 00400000
区段=CODE
包含=code
类型=Imag 01001002
访问=R
初始访问=RWE
接着在CODE段下F2断点,Shift+F9运行,来到程序OEP
dump,然后用Import获取输入表.发现N个无效指针.剪掉后修复dump出来的程序,发现无法运行,很显然,IAT被加密了.
当然.在这里用Import附带的tElock 0.99的插件跟踪,所有指针均可以被修复....
看了好多寻找Magic JMP的文章,今天我也来试着找下传说中的Magic JMP
随便找个无效指针0045512C.记下地址.Ctrl+F2重新载入...
dd 0045512C 下硬件断点,运行....
结果发现出错.提示CRC error,还有CRC检校......
重新载入,清除硬件断点,下bp GetModuleHandleA
Shift+F9运行2次后...alt+F9返回,我们来到...
00469611 85C0 test eax,eax ; kernel32.7C800000
00469613 0F85 D7000000 jnz UnPackMe.004696F0
00469619 53 push ebx
0046961A FF95 721C4000 call dword ptr ss:[ebp+401C72]
00469620 85C0 test eax,eax
00469622 0F85 C8000000 jnz UnPackMe.004696F0
通过跟踪可以确定.只要把00469622处的jnz改为Jmp,程序就不会报错...
重新载入...清除一切断点
内存映射,项目 22
地址=00452000
大小=00002000 (8192.)
物主=UnPackMe 00400000
区段=DATA
包含=data
类型=Imag 01001002
访问=R
初始访问=RWE
在data段下内存写入断点....Shift+F9运行,来到
0046914E AA stos byte ptr es:[edi]
0046914F 69D2 A5B0CD4B imul edx,edx,4BCDB0A5
00469155 F9 stc
清除内存断点,然后再Ctrl+G定位到00469622,把此处的jnz改jmp,接着dd 0045512C 下硬件访问断点,运行,注意右边
寄存器窗口....N次Shift+F9后,我们来到...
004698E7 8B85 53384000 mov eax,dword ptr ss:[ebp+403853]
004698ED 40 inc eax
004698EE 0F84 A8000000 je UnPackMe.0046999C
004698F4 80A5 FC2F4000 F>and byte ptr ss:[ebp+402FFC],0FF
004698FB 0F84 9B000000 je UnPackMe.0046999C
00469901 80A5 FD2F4000 F>and byte ptr ss:[ebp+402FFD],0FF
此时右边出现...
EAX 7C93135A ntdll.RtlDeleteCriticalSection
ECX 7C937DE9 ntdll.7C937DE9
EDX 7C99B178 ntdll.7C99B178
EBX 00455736 ASCII "DeleteCriticalSection"
ESP 0012FF80
EBP 00066A24
ESI 00455000 UnPackMe.00455000
EDI 0045512C UnPackMe.0045512C
EIP 004698E7 UnPackMe.004698E7
看到了没?ntdll.RtlDeleteCriticalSection就是0045512C处的函数..
接着跟踪,通过几次循环.可以初步确定以下几处有用的信息...
00469901 80A5 FD2F4000 F>and byte ptr ss:[ebp+402FFD],0FF
00469908 0F84 8E000000 je UnPackMe.0046999C ;Magic JMP
0046990E 8B85 57384000 mov eax,dword ptr ss:[ebp+403857]
00469914 8907 mov dword ptr ds:[edi],eax
00469996 FF85 53384000 inc dword ptr ss:[ebp+403853]
0046999C 61 popad
0046999D 3107 xor dword ptr ds:[edi],eax :这里即是保存函数地址....
0046999F 58 pop eax
004699A0 48 dec eax
只要保证00469908处跳,即可避开IAT加密..把je改jmp,Ctrl+G定位到0045159C下硬件执行断点...Shift+F9运行
然后dump,用Import查看,发现所有指针有效.修复后程序可以正常运行...
最后整理下脱壳步骤,
1,在data段下内存写入断点....Shift+F9运行
2,定位到00469622,把jnz改jmp
3,定位到00469908,把je改jmp
4,定位到OEP,下硬件执行断点...Shift+F9运行,然后脱壳修复即可
--------------------------------------------------------------------------------
【版权声明】: 本文原创于qianyicy, 转载请注明作者并保持文章的完整, 谢谢!
2009年02月23日 16:57:12
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)