最近练习脱Armadillo壳,跟着一些范例做没有什么困难,于是自已找了一个壳想试一下,没想到总是找不到返回的时机,特来向高人请教.
软件信息:N年前的仙三免CD主程序
加壳方式:
!- Protected Armadillo 2.85
Protection system (Basic)
!- <Protection Options>
Standard protection or Minimum protection
!- <Backup Key Options>
No Registry Keys at All
!- <Compression Options>
Better/Slower Compression
!- <Other Options>
Disable Monitoring Thread
设置Ollydbg忽略所有的异常选项,隐藏OD。
018CE0B9 >/$ 55 PUSH EBP ;OD载入后停留在这里
018CE0BA |. 8BEC MOV EBP,ESP
018CE0BC |. 6A FF PUSH -1
018CE0BE |. 68 68628E01 PUSH PAL3.018E6268
018CE0C3 |. 68 00DB8C01 PUSH PAL3.018CDB00
下断:BP OpenMutexA,F9运行
7C80EA1B > 8BFF MOV EDI,EDI ;OD停留在这里
7C80EA1D 55 PUSH EBP
7C80EA1E 8BEC MOV EBP,ESP
7C80EA20 51 PUSH ECX
7C80EA21 51 PUSH ECX
堆栈提示:
0012F5B8 018C790C /CALL 到 OpenMutexA 来自 PAL3.018C7906
0012F5BC 001F0001 |Access = 1F0001
0012F5C0 00000000 |Inheritable = FALSE
0012F5C4 0012FBF8 \MutexName = "100::DA2017F78E"
CTRL+G来到 401000,写入如下代码:
00401000 60 PUSHAD
00401001 9C PUSHFD
00401002 68 F8FB1200 PUSH 12FBF8 ; ASCII "E4::DA2017F78E"
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
在401000 处新建eip。F9运行,再次中断在 OpenMutexA 处,取消该断点,然后返回401000处,撤消刚才键入的所有代码。
下断:He GetModuleHandleA,F9运行:
7C80B6A1 > 8BFF MOV EDI,EDI ;OD停留在这里
7C80B6A3 55 PUSH EBP
7C80B6A4 8BEC MOV EBP,ESP
7C80B6A6 837D 08 00 CMP DWORD PTR SS:[EBP+8],0
7C80B6AA 74 18 JE SHORT kernel32.7C80B6C4
7C80B6AC FF75 08 PUSH DWORD PTR SS:[EBP+8]
7C80B6AF E8 C0290000 CALL kernel32.7C80E074
7C80B6B4 85C0 TEST EAX,EAX
每次按F9运行 堆栈变化如下:
-------------------------------------------------------------------
0012ED50 77F45BD8 /CALL 到 GetModuleHandleA 来自 77F45BD2
0012ED54 77F4501C \pModule = "KERNEL32.DLL"
-------------------------------------------------------------------
0012E52C 5D175324 /CALL 到 GetModuleHandleA 来自 5D17531E
0012E530 5D175370 \pModule = "kernel32.dll"
-------------------------------------------------------------------
0012F570 018C6E53 /CALL 到 GetModuleHandleA 来自 PAL3.018C6E4D
0012F574 00000000 \pModule = NULL
0012F578 0000007F
0012F57C 02032B8B
0012F580 0191B9DE PAL3.0191B9DE
0012F584 00000000
0012F588 01903000 ASCII "PDATA000"
0012F58C 0012FF00
0012F590 018E693C PAL3.018E693C
0012F594 018E6940 PAL3.018E6940
0012F598 018E3238 PAL3.018E3238
0012F59C 0191B9DE PAL3.0191B9DE
0012F5A0 01903000 ASCII "PDATA000"
-------------------------------------------------------------------
0012DE78 0203368D /CALL 到 GetModuleHandleA 来自 02033687
0012DE7C 00000000 \pModule = NULL
0012DE80 02151378
0012DE84 00000000
0012DE88 0203F8A2
0012DE8C 0012DEDC
0012DE90 00000000
0012DE94 77D50000 USER32.77D50000
0012DE98 00000000
0012DE9C 00000000
0012DEA0 77D50A04 USER32.77D50A04
0012DEA4 00000000
0012DEA8 0012DECC
0012DEAC 02036F00 返回到 02036F00 来自 02036E18
-------------------------------------------------------------------
0012D5A0 7365D4A4 /CALL 到 GetModuleHandleA 来自 7365D49E
0012D5A4 0012D5A8 \pModule = "C:\WINDOWS\system32\ntdll.dll"
0012D5A8 575C3A43
-------------------------------------------------------------------
0012DED8 02034711 /CALL 到 GetModuleHandleA 来自 0203470B
0012DEDC 0204D824 \pModule = "kernel32.dll"
0012DEE0 0012F55C ;这一次F9,已经出现程序对话框了.
0012DEE4 021408F8
0012DEE8 00000000
0012DEEC 00000000
0012DEF0 0012DF14
0012DEF4 02036DF3 返回到 02036DF3 来自 02036E18
0012DEF8 0012DEE0
0012DEFC 00000001
0012DF00 0012F434 指向下一个 SEH 记录的指针
0012DF04 0204539C SE处理程序
返回时机总是找不准,第六次F9,程序已开始运行了,不知何处有误,盼高人指点迷津.
源程序地址:http://patch.ali213.net/download.asp?id=3097&server=2
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)