【文章标题】: Armadillo 3.78 - 4.xx脱壳手记
【文章作者】: wuhanqi
【软件名称】: Disk Clean Up 2000
【下载地址】: 自己搜索下载
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
1.peid查壳Armadillo 3.78 - 4.xx -> Silicon Realms Toolworks
2.od载入,忽略所有异常,隐藏od
下bp OpenMutexA断点,shift+f9运行
断下之后来到这里:
7C80EA1B > 8BFF mov edi, edi
7C80EA1D 55 push ebp
7C80EA1E 8BEC mov ebp, esp
7C80EA20 51 push ecx
7C80EA21 51 push ecx
7C80EA22 837D 10 00 cmp dword ptr [ebp+10], 0
7C80EA26 56 push esi
7C80EA27 0F84 66530300 je 7C843D93
7C80EA2D 64:A1 18000000 mov eax, dword ptr fs:[18]
7C80EA33 FF75 10 push dword ptr [ebp+10]
Ctrl+G,跟随来到401000
将那里的0数据修改为
00401000 60 pushad
00401001 9C pushfd
00401002 68 B8DD1200 push 12DDB8 ; ASCII "D78::DA79E43FB3"
00401007 33C0 xor eax, eax
00401009 50 push eax
0040100A 50 push eax
0040100B E8 2FD9407C call kernel32.CreateMutexA
00401010 9D popfd
00401011 61 popad
00401012 - E9 04DA407C jmp kernel32.OpenMutexA
00401017 90 nop
此时要注意一下00401002 68 A0FD1200 push 12DDB8 中的12DDB8是根据堆栈来判断的!
0012D778 0043DA50 /CALL 到 OpenMutexA 来自 CleanUp.0043DA4A
0012D77C 001F0001 |Access = 1F0001
0012D780 00000000 |Inheritable = FALSE
0012D784 0012DDB8 \MutexName = "D78::DA79E43FB3" //看到12DDB8了么,就是在这里判断出来的!
0012D788 0012FF04
选中所有修改的部分,右键此处为新EIP,弹出个对话框,选是!
然后F9运行,断下之后取消断点!
下he GetModuleHandleA+5断点,然后shift+f9
当堆栈中依次出现:
00127B6C /0012CE30
00127B70 |00AE1B31 返回到 00AE1B31 来自 kernel32.GetModuleHandleA
00127B74 |00AF6364 ASCII "kernel32.dll"
00127B78 |00AF7588 ASCII "VirtualAlloc"
00127B6C /0012CE30
00127B70 |00AE1B4E 返回到 00AE1B4E 来自 kernel32.GetModuleHandleA
00127B74 |00AF6364 ASCII "kernel32.dll"
00127B78 |00AF757C ASCII "VirtualFree"
001278DC /00127B70
001278E0 |00AC9CD7 返回到 00AC9CD7 来自 kernel32.GetModuleHandleA
001278E4 |00127A24 ASCII "kernel32.dll" //此时取消断点,Alit+f9返回!
来到:
00AC9CD7 8B0D 74B7AF00 mov ecx, dword ptr [AFB774]
00AC9CDD 89040E mov dword ptr [esi+ecx], eax
00AC9CE0 A1 74B7AF00 mov eax, dword ptr [AFB774]
00AC9CE5 391C06 cmp dword ptr [esi+eax], ebx
00AC9CE8 75 16 jnz short 00AC9D00
00AC9CEA 8D85 B4FEFFFF lea eax, dword ptr [ebp-14C]
00AC9CF0 50 push eax
00AC9CF1 FF15 DC00AF00 call dword ptr [AF00DC] ; kernel32.LoadLibraryA
00AC9CF7 8B0D 74B7AF00 mov ecx, dword ptr [AFB774]
00AC9CFD 89040E mov dword ptr [esi+ecx], eax
00AC9D00 A1 74B7AF00 mov eax, dword ptr [AFB774]
00AC9D05 391C06 cmp dword ptr [esi+eax], ebx
00AC9D08 0F84 3B010000 je 00AC9E49 ; 这就是Magic jump了,修改为jmp
00AC9D0E 33C9 xor ecx, ecx
00AC9D10 8B07 mov eax, dword ptr [edi]
00AC9D12 3918 cmp dword ptr [eax], ebx
00AC9D14 74 06 je short 00AC9D1C
00AC9D16 41 inc ecx
00AC9D17 83C0 0C add eax, 0C
00AC9D1A ^ EB F6 jmp short 00AC9D12
00AC9D1C 8BD9 mov ebx, ecx
00AC9D1E C1E3 02 shl ebx, 2
然后在00AC9D08 0F84 3B010000 jmp 00AC9E49 这一行回车来到:
00AC9E49 83C7 0C add edi, 0C
00AC9E4C 89BD 84FDFFFF mov dword ptr [ebp-27C], edi
00AC9E52 83C6 04 add esi, 4
00AC9E55 395F FC cmp dword ptr [edi-4], ebx
00AC9E58 ^ 0F85 35FEFFFF jnz 00AC9C93
00AC9E5E EB 03 jmp short 00AC9E63 ; 下硬件执行断点,shift+f9运行
00AC9E60 D6 salc
00AC9E61 D6 salc
断下之后取消断点,撤销00AC9D08处的修改,打开内存镜像在00401000处f2下断,shift+f9直达oep!
接下来就是用lordpe和ir修复了
用ir修复的时候会有错误指针,不用管他cut就ok了!
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2007年08月30日 13:13:56
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!