首先感谢fly兄弟帮助,使我完成这个脱壳的尝试。发此帖的目的是给像我一样初学脱壳的朋友一些鼓励。
OD载入。。。。。
0105A000 > 60 pushad ; 入口。
0105A001 E8 00000000 call Win2000_.0105A006
0105A006 5D pop ebp
0105A007 50 push eax
0105A008 51 push ecx
--------------------------------------------------------------------------------------------
1、Magic Jump
下断:he GetModuleHandleA下断,Shift+F9,注意堆栈!
7C80B529 > 8BFF mov edi,edi ; 停在这里。
7C80B52B 55 push ebp
7C80B52C 8BEC mov ebp,esp
7C80B52E 837D 08 00 cmp dword ptr ss:[ebp+8],0
7C80B532 74 18 je short kernel32.7C80B54C
堆栈中:
00069500 00916BFB /CALL 到 GetModuleHandleA 来自 00916BF5
00069504 0092BC1C \pModule = "kernel32.dll"
00069508 0092CEC4 ASCII "VirtualAlloc"
00069500 00916C18 /CALL 到 GetModuleHandleA 来自 00916C12
00069504 0092BC1C \pModule = "kernel32.dll"
00069508 0092CEB8 ASCII "VirtualFree"
VirtualAlloc和VirtualFree这两个API依次显示就是标志(fly语)
00D0F558 7365D4A4 /CALL 到 GetModuleHandleA 来自 7365D49E
00D0F55C 00D0F560 \pModule = "D:\WINDOWS.0\system32\ntdll.dll"
00069264 00905AB3 /CALL 到 GetModuleHandleA 来自 00905AAD
00069268 000693B4 \pModule = "kernel32.dll"
取消断点,Alt+F9返回。
00905AAD FF15 B8609200 call dword ptr ds:[9260B8] ; kernel32.GetModuleHandleA
00905AB3 8B0D AC409300 mov ecx,dword ptr ds:[9340AC] ; 返回到这里。
00905AB9 89040E mov dword ptr ds:[esi+ecx],eax
00905ABC A1 AC409300 mov eax,dword ptr ds:[9340AC]
00905AC1 391C06 cmp dword ptr ds:[esi+eax],ebx
00905AC4 75 16 jnz short 00905ADC
00905AC6 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
00905ACC 50 push eax
00905ACD FF15 BC629200 call dword ptr ds:[9262BC] ; kernel32.LoadLibraryA
00905AD3 8B0D AC409300 mov ecx,dword ptr ds:[9340AC]
00905AD9 89040E mov dword ptr ds:[esi+ecx],eax
00905ADC A1 AC409300 mov eax,dword ptr ds:[9340AC]
00905AE1 391C06 cmp dword ptr ds:[esi+eax],ebx
00905AE4 0F84 2F010000 je 00905C19 ; Magic Jump,改jmp!
00905AEA 33C9 xor ecx,ecx
00905AEC 8B07 mov eax,dword ptr ds:[edi]
-------------------------------------------------------------------------------------------
2、OEP
下断:BP GetCurrentThreadId [ESP]<10000000 一次,来到这里。
7C809737 > 64:A1 18000000 mov eax,dword ptr fs:[18]
7C80973D 8B40 24 mov eax,dword ptr ds:[eax+24]
7C809740 C3 retn
取消断点,Alt+F9返回
00915EBE 50 push eax
00915EBF FF75 FC push dword ptr ss:[ebp-4]
00915EC2 E8 05000000 call 00915ECC
00915EC7 83C4 0C add esp,0C
00915ECA C9 leave
00915ECB C3 retn
00915ECC E8 82FFFFFF call 00915E53
00915ED1 6A 14 push 14
00915ED3 E8 9EEE0100 call 00934D76 ; jmp to msvcrt.operator new
。。。。。。。。。
0092F4BC 8B17 mov edx,dword ptr ds:[edi]
0092F4BE 85D2 test edx,edx
0092F4C0 75 1B jnz short 0092F4DD
0092F4C2 FF77 18 push dword ptr ds:[edi+18]
0092F4C5 FF77 14 push dword ptr ds:[edi+14]
0092F4C8 FF77 10 push dword ptr ds:[edi+10]
0092F4CB 8B90 8C000000 mov edx,dword ptr ds:[eax+8C]
0092F4D1 3350 3C xor edx,dword ptr ds:[eax+3C]
0092F4D4 3350 10 xor edx,dword ptr ds:[eax+10]
0092F4D7 2BCA sub ecx,edx
0092F4D9 FFD1 call ecx
0092F4DB EB 20 jmp short 0092F4FD
0092F4DD 83FA 01 cmp edx,1
0092F4E0 75 1E jnz short 0092F500
0092F4E2 FF77 04 push dword ptr ds:[edi+4]
0092F4E5 FF77 08 push dword ptr ds:[edi+8]
0092F4E8 6A 00 push 0
0092F4EA FF77 0C push dword ptr ds:[edi+C]
0092F4ED 8B90 8C000000 mov edx,dword ptr ds:[eax+8C]
0092F4F3 3350 3C xor edx,dword ptr ds:[eax+3C]
0092F4F6 3350 10 xor edx,dword ptr ds:[eax+10]
0092F4F9 2BCA sub ecx,edx
0092F4FB FFD1 call ecx ; 进去吧,在里面。
0092F4FD 8945 E4 mov dword ptr ss:[ebp-1C],eax
来到这里:
01006420 55 push ebp ; 这里就是OEP!
01006421 8BEC mov ebp,esp
01006423 6A FF push -1
01006425 68 88180001 push Win2000_.01001888
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3、Import Table Elimination修复
1、Base Of Existing IAT
Base Of Existing IAT
IAT Start=A728CC
2、Length Of Existing IAT
IAT End=A72DC0
Length Of Existing IAT=Size=A72DC0-A728CC=4F4
3、New Base RVA Of IAT
按照fly指点,放在100A000处。
在ArmInline填入以上数据,点击“Rebase IAT”,看到提示修复成功。
运行LordPE修正ImageSize后完全Dump这个进程。得到dumped.exe。
用PEiD侦壳脱壳文件会显示“Armadillo 1.xx-2.xx”,用WinHex把把PE Header+0X1A、0X1B处MajorLinkerVersion、MinorLinkerVersion的清0。
这个记事本的脱壳用fly的脚本就可以到OEP,作为学习我没有使用脚本
仅学习Import Table Elimination 保护方式脱壳另说。提倡用手动方式,这样记忆的东西就多些。