加壳工具:Armadillo_Custom4.40.0250
脱壳工具:armadillo-fp壳分析,ICEODBG.exe,ArmInLine,ImportRec16f.exe
目标程序:CrackMe.exe(看雪论坛上的一个练习注册码的程序,极为简单)
目标程序下载地址: 点击到看雪下载
目标程序运行效果:
加壳过程:
Files to Protect: CrackMe3IatCode.exe
Language: -Default-
Splash Screen 1: No splash screen
Enter Key Dialog Options:Two-Line Text Enter Kdy Dialog(default)
Protection Options: Standard protection only
Enable Import Table Elimination
Enable Strategic Code Splicing
Backup Key Options: Fixed Backup Keys
Compression Options: Better/Slower Compression
SoftICE Detection: Standard SoftICE Detection
Data-After-Program Options:Protect and leave at end of file
Interception Options: Intercept Selected DLLs
std Hardware Locking:
Enh Hardware Locking:
Certificates: XXX[Default Certificate]
查壳情况:(armadillo-fp壳分析)
C:\cffo-3\CrackMe3IatCode.exe
!- Protected Armadillo
Version 4.40.0250 (Custom Build)
Protection system (Professional)
!- < Protection Options >
Standard protection or Minimum protection
Enable Import Table Elimination
Enable Strategic Code Splicing
!- < Backup Key Options >
Fixed Backup Keys
!- < Compression Options >
Better/Slower Compression
!- < Other Options >
脱壳过程:
1、设置OD异常参数: 菜单--》选项--》调试设置-->异常--》全勾选;
2、载入CrackMe3IatCode.exe (经过上述加壳后生成的程序)
3、隐藏OD:菜单--》插件--》HideOD-->Hide
0049D001 E8 00000000 call CrackMe3.0049D006
0049D006 5D pop ebp
0049D007 50 push eax
4、Ctrl+G跟随 输入:GetModuleHandleA
7C82474C 55 push ebp
7C82474D 8BEC mov ebp,esp
7C82474F 837D 08 00 cmp dword ptr ss:[ebp+8],0
7C824753 74 18 je short kernel32.7C82476D ;<--下硬件断点
7C824755 FF75 08 push dword ptr ss:[ebp+8]
7C824758 E8 C2040000 call kernel32.7C824C1F
7C82475D 85C0 test eax,eax
7C82475F 74 08 je short kernel32.7C824769
7C824761 FF70 04 push dword ptr ds:[eax+4]
5、Shift+F9 一下一下按,注意堆栈窗口,当看到如下内容时留意
00129504 |00DFBC1C ASCII "kernel32.dll"
00129508 |00DFCEC4 ASCII "VirtualAlloc"
6、Shift+F9 再按一下,如我们期望的,不远了
00129500 |00DE7122 返回到 00DE7122 来自 kernel32.GetModuleHandleA
00129504 |00DFBC1C ASCII "kernel32.dll"
00129508 |00DFCEB8 ASCII "VirtualFree"
7、Shift+F9再一下一下按,好了到返回时机了,如下
00129264 |00DD5FC9 返回到 00DD5FC9 来自 kernel32.GetModuleHandleA
00129268 |001293B4 ASCII "kernel32.dll"
8、删除硬件断点,Alt+F9返回,我们看看代码窗口
00DD5FCF 89040E mov dword ptr ds:[esi+ecx],eax
00DD5FD2 A1 AC40E000 mov eax,dword ptr ds:[E040AC]
00DD5FD7 391C06 cmp dword ptr ds:[esi+eax],ebx
00DD5FDA 75 16 jnz short 00DD5FF2
00DD5FDC 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
00DD5FE2 50 push eax
00DD5FE3 FF15 BC62DF00 call dword ptr ds:[DF62BC] ; kernel32.LoadLibraryA
00DD5FE9 8B0D AC40E000 mov ecx,dword ptr ds:[E040AC]
00DD5FEF 89040E mov dword ptr ds:[esi+ecx],eax
00DD5FF2 A1 AC40E000 mov eax,dword ptr ds:[E040AC]
00DD5FF7 391C06 cmp dword ptr ds:[esi+eax],ebx
00DD5FFA 0F84 2F010000 je 00DD612F ; < -- 把Je改为Jmp(修改Magic Jump)改好后回车
00DD6000 33C9 xor ecx,ecx
9、 回车后
00DD6132 89BD 78FDFFFF mov dword ptr ss:[ebp-288],edi
00DD6138 83C6 04 add esi,4
00DD613B 395F FC cmp dword ptr ds:[edi-4],ebx
00DD613E ^ 0F85 49FEFFFF jnz 00DD5F8D
00DD6144 EB 03 jmp short 00DD6149 ;<--这里下F2断点
00DD6146 D6 salc
10、Shift+F9断下后,返回上面找到修改处,把我们改的jmp 改回来,CTRL+G 输入CreateThread
7C825111 55 push ebp
7C825112 8BEC mov ebp,esp
7C825114 FF75 1C push dword ptr ss:[ebp+1C]
7C825117 FF75 18 push dword ptr ss:[ebp+18]
11、Shift+F9断下后,取消断点,ALT+F9返回
00DDC51F FF15 4C629900 call dword ptr ds:[99624C] ; kernel32.CloseHandle
00DDC525 5F pop edi
00DDC526 5E pop esi
00DdC527 C9 leave
00DDC528 C3 retn
12、F8步进到此处
00DEF9DF 3350 1C xor edx,dword ptr ds:[eax+1C]
00DEF9E2 2BCA sub ecx,edx
00DEF9E4 FFD1 call ecx ; CrackMe3.00441270 瞧!又是Call了一个寄存器
00DEF9E6 8945 E4 mov dword ptr ss:[ebp-1C],eax
再看看寄存器的值: ECX 00441270 和现在的内存地址比,差距好大.F7跟进去!
00441271 8BEC mov ebp,esp
00441273 83C4 F4 add esp,-0C
00441276 B8 60114400 mov eax,CrackMe3.00441160
0044127B E8 E848FCFF call CrackMe3.00405B68
00441280 A1 442C4400 mov eax,dword ptr ds:[442C44]
00441285 8B00 mov eax,dword ptr ds:[eax]
00441287 E8 ECBBFFFF call CrackMe3.0043CE78
0044128C A1 442C4400 mov eax,dword ptr ds:[442C44]
00441291 8B00 mov eax,dword ptr ds:[eax]
00441293 BA D0124400 mov edx,CrackMe3.004412D0 ; ASCII "Crackers For Freedom CrackMe v3.0"
00441298 E8 17B8FFFF call CrackMe3.0043CAB4
ctrl+b 输入FF 25(现在来查找IAT的起始地址)
004011DE 8BC0 mov eax,eax
004011E0 - FF25 001B0601 jmp dword ptr ds:[1061B00] ; kernel32.CreateFileA
在找到的指令处->右键-数据窗口中跟随-内存地址
然后数据窗口中会显示出各个系统API,随便选一个--> 右键-->长型-->地址
010613C0 77BDCD56 GDI32.UnrealizeObject
010613C4 7739D95D COMCTL_1.ImageList_BeginDrag
010613C8 7739D9D3 COMCTL_1.ImageList_DragMove
010613CC 7C827861 kernel32.InitializeCriticalSection
010613D0 00DD734A
好了,向上找,找到前面再没API的地方,就是头了,把这个010613C0地址记下来这就是IAT的起始地址
向下找结束地址,同理。
01061B2C 7C8111E1 kernel32.FindResourceA
01061B30 77E246A6 USER32.ReleaseCapture
01061B34 77BDC7CE GDI32.RealizePalette
01061B38 ABABABAB
瞧:01061B38 ABABABAB 就这儿吧。这得算算IAT长度:01061B38-010613C0=778;对吧,老母猪不识数啊,先得数数嘛!
对了,还得再看看spliced code的开始地址和长度:
Alt+M
在CrackMe3 .rsrc 下面,另一个进程程序(我这里是COMX3)的pe header上面一行就是了。
地址:02860000 大小:00020000
类似于下图的样子(找昨天练习用记事本程序的spliced code):地址:02c10000 大小:00015000
这时打开ArmInLine
选择我们当前调试中的程序的CrackMe3IatCode.exe,它的ID 在OD里打开附加就可查看到
start of Target Code:401000
Leng of Target Code: 41000
code splicing
star of spliced code:286000 它总能找对
length of spliced code:20000 这里改成我们找到的长度,它总找不对
点remove splices 修复 在右边窗口可以看到提示:修复成功
import elimination
Base Of Existing IAT:010613C0
Length Of Existing IAT :778
new base VA of IAT :444000
点Rebase IAT 修复 在右边窗口可以看到提示:修复成功
到这里,我们可以用LordPE.EXE进行DUMP了,然后用ImportRec.exe,选择我们的进程CrackMe3IatCode.exe
它显示基址:00400000 大小:00133000
OEP:00441270- 00400000=41270;
点IAT AutoSearch自己找
RVA:00044000(修复时的444000-基址00400000=00044000) Size:000004FC
然后GetImports得到137个API ,点ShowInvalid 还全是有效的!
那FixDump吧,选我们dump出的文件。
运行一下,没问题!PEiD看一下:Borland Delphi 4.0 - 5.0,我们的脱壳就完成了。
《注:》图片是在练习记事本时抓的,这里只能示意一下,具体的参数已用文字给出。