仿壹次脱壳法――脱Armadillo 3.00a-3.61双进程标准壳
【脱壳目标】 Frontbase Image to Icon v2.00
【加壳方式】 Armadillo 3.00a - 3.61 -> Silicon Realms Toolworks
【保护方式】 双进程标准方式加壳
【脱壳平台】 Win2000
【脱壳工具】 Peid、Ollydbg、Loadpe、Imprec1.6F
【脱壳说明】 在参考其他脱文的基础上,深入学习fly大侠撰写的《壹次脱壳法――Armadillo 双进程标准壳 快速脱壳Mr.Captor》,初步掌握Armadillo 3.00a-3.61双进程标准壳的脱壳技巧,及时提出在脱壳中遇到的一些难题,仅供大家学习、交流和解答。
【下载页面】
http://www.abcdown.com/soft/5148.htm
(网上有许多下载地址)
【脱壳步骤】
一、双进程向单进程转变
(一)设置Ollydbg,载入Frontbase Image to Icon v2.00
00511000 > 60 PUSHAD *进入OD后停在这儿*
00511001 E8 00000000 CALL image2ic.00511006
00511006 5D POP EBP
00511007 50 PUSH EAX
00511008 51 PUSH ECX
00511009 EB 0F JMP SHORT image2ic.0051101A
(二)下断点:BP OpenMutexA
77E6C503 > 55 PUSH EBP*断在这,看看堆栈*
77E6C504 8BEC MOV EBP,ESP
77E6C506 51 PUSH ECX
77E6C507 51 PUSH ECX
77E6C508 837D 10 00 CMP DWORD PTR SS:[EBP+10],0
BP OpenMutexA断下 时的堆栈:
0012F574 004E6043 /CALL 到 OpenMutexA 来自 image2ic.004E603D
0012F578 001F0001 |Access = 1F0001
0012F57C 00000000 |Inheritable = FALSE
0012F580 0012FBB4 \MutexName = "20C::DAA088927B"*注意0012FBB4*
(三)按Ctrl+G,输入401000 , 键入以下代码
00401000 60 PUSHAD
00401001 9C PUSHFD
00401002 68 B4FB1200 PUSH 12FBB4 * 堆栈里看到的值*
00401007 33C0 XOR EAX,EAX
00401009 50 PUSH EAX
0040100A 50 PUSH EAX
0040100B E8 6D97A677 CALL KERNEL32.CreateMutexA
00401010 9D POPFD
00401011 61 POPAD
00401012 -E9 ECB4A677 JMP KERNEL32.OpenMutexA
在401000处新建起源,F9运行,再次中断在OpenMutexA处。
二、、Magic Jump,避开IAT加密
(一)取消以前断点,下断:BP GetModuleHandleA
(注明:winxp平台下BP GetModuleHandleA+5 断点)
77E63DFC G> 55 PUSH EBP*断在这儿,注意看堆栈*
77E63DFD 8BEC MOV EBP,ESP
77E63DFF 837D 08 00 CMP DWORD PTR SS:[EBP+8],0
77E63E03 74 18 JE SHORT KERNEL32.77E63E1D
77E63E05 FF75 08 PUSH DWORD PTR SS:[EBP+8]
77E63E08 E8 87FFFFFF CALL KERNEL32.77E63D94
BP GetModuleHandleA中断时的堆栈:
0012EFA4 78001E28 /CALL 到 GetModuleHandleA 来自 MSVCRT.78001E22
0012EFA8 780332D4 \pModule = "KERNEL32"
(二)按F9多次,注意看BP GetModuleHandleA时的堆栈变化
(说明:程序将中断若干次,判断返回程序的最佳时机,然后Alt+F9返回程序)
中断后第一次按F9时的堆栈:
0012F02C 77A03922 /CALL 到 GetModuleHandleA 来自 OLEAUT32.77A0391C
0012F030 779A0630 \pModule = "kernel32.dll"
0012F034 77A03AA1 返回到 OLEAUT32.77A03AA1 来自 OLEAUT32.77A038E0
中断后第二次按F9时的堆栈:
0012F020 77A06ACB /CALL 到 GetModuleHandleA 来自 OLEAUT32.77A06AC5
0012F024 779A0994 \pModule = "KERNEL32"
0012F028 77A03B4A 返回到 OLEAUT32.77A03B4A 来自 OLEAUT32.77A06AC0
中断后第三次按F9时的堆栈:
0012EF5C 779A832B /CALL 到 GetModuleHandleA 来自 OLEAUT32.779A8325
0012EF60 77A1ADA8 \pModule = "KERNEL32.DLL"
0012EF64 779A7982 返回到 OLEAUT32.779A7982 来自 OLEAUT32.779A8320
中断后第四次按F9时的堆栈:
0012EF5C 779A832B /CALL 到 GetModuleHandleA 来自 OLEAUT32.779A8325
0012EF60 77A1ADA8 \pModule = "KERNEL32.DLL"
0012EF64 779C0082 返回到 OLEAUT32.779C0082 来自 OLEAUT32.779A8320
中断后第五次按F9时的堆栈:
0012F518 004E5248 /CALL 到 GetModuleHandleA 来自 image2ic.004E5242
0012F51C 00000000 \pModule = NULL
中断后第六次按F9时的堆栈:
0012D8F0 72CBB367 /CALL 到 GetModuleHandleA 来自 72CBB361
0012D8F4 72CBB230 \pModule = "KERNEL32.DLL"
中断后第七次按F9时的堆栈:
0012D680 72C7BAF6 /CALL 到 GetModuleHandleA 来自 72C7BAF0
0012D684 72C574C4 \pModule = "KERNEL32.DLL"
中断后第八次按F9时的堆栈:
0123F1E0 77E69EE1 /CALL 到 GetModuleHandleA 来自 KERNEL32.77E69EDC
0123F1E4 00000000 \pModule = NULL
0123F1E8 77E69ECA 返回到 KERNEL32.77E69ECA 来自 KERNEL32.77E69EDA
中断后第九次按F9时的堆栈:
0012EA40 00BE2E93 /CALL 到 GetModuleHandleA 来自 00BE2E8D
0012EA44 00000000 \pModule = NULL
中断后第十次按F9时的堆栈:
0012EA74 00BE2B29 /CALL 到 GetModuleHandleA 来自 00BE2B23
0012EA78 00000000 \pModule = NULL
中断后第十一次按F9时的堆栈:
0012E37C 10004EFA /CALL 到 GetModuleHandleA 来自 10004EF4
0012E380 1000A1FC \pModule = "KERNEL32"
中断后第十二次按F9时的堆栈:
0012EA74 00BE2BE4 /CALL 到 GetModuleHandleA 来自 00BE2BDE
0012EA78 00000000 \pModule = NULL
中断后第十三次按F9时的堆栈:
0012EA74 00BE2C50 /CALL 到 GetModuleHandleA 来自 00BE2C4A
0012EA78 00000000 \pModule = NULL
中断后第十四次按F9时的堆栈:
0012EA74 00BE2D76 /CALL 到 GetModuleHandleA 来自 00BE2D70*断在这儿时,然后按Alt+F9返回程序,如果继续按F9,程序就会终止*
0012EA78 00000000 \pModule = NULL
(三)按Alt+F9返回主程序
00BE2D76 50 PUSH EAX ; image2ic.00400000*程序停留在这儿*
00BE2D77 FF37 PUSH DWORD PTR DS:[EDI]
00BE2D79 83C7 04 ADD EDI,4
00BE2D7C FF75 F8 PUSH DWORD PTR SS:[EBP-8]
00BE2D7F FF75 B0 PUSH DWORD PTR SS:[EBP-50]
00BE2D82 FF75 BC PUSH DWORD PTR SS:[EBP-44]
00BE2D85 FF75 08 PUSH DWORD PTR SS:[EBP+8]
00BE2D88 FF75 F4 PUSH DWORD PTR SS:[EBP-C]
00BE2D8B 68 000F0150 PUSH 50010F00
00BE2D90 57 PUSH EDI
00BE2D91 68 60CEBE00 PUSH 0BECE60
00BE2D96 53 PUSH EBX
00BE2D97 FF15 2C64BE00 CALL DWORD PTR DS:[BE642C]
SER32.CreateWindowExA
00BE2D9D 6A 01 PUSH 1
00BE2D9F FF75 C8 PUSH DWORD PTR SS:[EBP-38]
00BE2DA2 6A 30 PUSH 30
00BE2DA4 50 PUSH EAX
00BE2DA5 FF15 9864BE00 CALL DWORD PTR DS:[BE6498] ; USER32.SendMessageA
00BE2DAB 8B45 B4 MOV EAX,DWORD PTR SS:[EBP-4C]
00BE2DAE 8145 E0 04010000 ADD DWORD PTR SS:[EBP-20],104
00BE2DB5 0145 F4 ADD DWORD PTR SS:[EBP-C],EAX
00BE2DB8 FF45 F0 INC DWORD PTR SS:[EBP-10]
00BE2DBB 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
00BE2DBE FF45 EC INC DWORD PTR SS:[EBP-14]
00BE2DC1 3B45 E8 CMP EAX,DWORD PTR SS:[EBP-18]
00BE2DC4 8B7D D0 MOV EDI,DWORD PTR SS:[EBP-30]
00BE2DC7 ^7C 97 JL SHORT 00BE2D60
00BE2DC9 8B45 B8 MOV EAX,DWORD PTR SS:[EBP-48]
00BE2DCC 8B4D E4 MOV ECX,DWORD PTR SS:[EBP-1C]
00BE2DCF 0145 08 ADD DWORD PTR SS:[EBP+8],EAX
00BE2DD2 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
00BE2DD5 0145 FC ADD DWORD PTR SS:[EBP-4],EAX
00BE2DD8 8B45 C4 MOV EAX,DWORD PTR SS:[EBP-3C]
00BE2DDB FF45 D8 INC DWORD PTR SS:[EBP-28]
00BE2DDE 0145 D4 ADD DWORD PTR SS:[EBP-2C],EAX
00BE2DE1 394D D8 CMP DWORD PTR SS:[EBP-28],ECX
00BE2DE4 ^0F8C 31FFFFFF JL 00BE2D1B
脱壳进行到这一步,有点儿不知道如何操作下一步,也不知道上述的步聚是否有问题,请FLY大侠指点一二。
[课程]FART 脱壳王!加量不加价!FART作者讲授!