peid查壳
Armadillo 3.78 - 4.xx -> Silicon Realms Toolworks(单进程)
AFP查壳保护措施
!- Protected Armadillo
<Protection Options>
Standard protection or Minimum protection //标准保护或者最少保护
<Backup Key Options>
Fixed Backup Keys //固定备份钥匙
<Compression Options> //压缩选项
Better/Slower Compression
--------------------------------------------------------------------
OD设置忽略所有异常,手动添加所有异常,来到如下代码:
0105B000 N> 60 pushad //程序入口点
0105B001 E8 00000000 call NOTEPAD.0105B006
0105B006 5D pop ebp
0105B007 50 push eax
0105B008 51 push ecx
命令行下断点
硬件执行 he GetModuleHandleA+5/bp GetModuleHandleA+5
内存断点 he GetModuleHandleA/bp GetModuleHandleA
推荐大家广泛使用硬件执行断点,但是不同的穿山甲下的断点不一样,要多积累经验。
shift+F9忽略所有一样运行,注意观察右下角堆栈区的提示:
第一次堆栈如下:
00079500 |00AC6DF3 返回到 00AC6DF3 来自 kernel32.GetModuleHandleA
00079504 |00ADBC1C ASCII "kernel32.dll"
00079508 |00ADCEC4 ASCII "VirtualAlloc" //关键信息
0007950C |00ADFA98
00079510 |7C9210E0 ntdll.RtlLeaveCriticalSection
第二次堆栈如下:
00079500 |00AC6E10 返回到 00AC6E10 来自 kernel32.GetModuleHandleA
00079504 |00ADBC1C ASCII "kernel32.dll"
00079508 |00ADCEB8 ASCII "VirtualFree" //关键信息,一般情况下马上就要返回程序领空了
0007950C |00ADFA98
00079510 |7C9210E0 ntdll.RtlLeaveCriticalSection
第三次堆栈如下:
00079264 |00AB5CE1 返回到 00AB5CE1 来自 kernel32.GetModuleHandleA
00079268 |000793B4 ASCII "kernel32.dll" //出现这个表示要到程序领空了。
说明:穿山甲找Majicjump都是出现这三个提示,返回程序领空。
删除硬件断点,ALT+F9返回程序领空,来到:
00AB5CE1 8B0D AC40AE00 mov ecx,dword ptr ds:[AE40AC]
00AB5CE7 89040E mov dword ptr ds:[esi+ecx],eax
00AB5CEA A1 AC40AE00 mov eax,dword ptr ds:[AE40AC]
00AB5CEF 391C06 cmp dword ptr ds:[esi+eax],ebx
00AB5CF2 75 16 jnz short 00AB5D0A
00AB5CF4 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
00AB5CFA 50 push eax
00AB5CFB FF15 BC62AD00 call dword ptr ds:[AD62BC] ; kernel32.LoadLibraryA //这个关键函数,一般在他下面的就是majicjump
00AB5D01 8B0D AC40AE00 mov ecx,dword ptr ds:[AE40AC]
00AB5D07 89040E mov dword ptr ds:[esi+ecx],eax
00AB5D0A A1 AC40AE00 mov eax,dword ptr ds:[AE40AC]
00AB5D0F 391C06 cmp dword ptr ds:[esi+eax],ebx
00AB5D12 0F84 2F010000 je 00AB5E47 //Majicjump魔法跳转,改为jmp,右键跟随
00AB5D18 33C9 xor ecx,ecx
00AB5D1A 8B07 mov eax,dword ptr ds:[edi]
00AB5D1C 3918 cmp dword ptr ds:[eax],ebx
00AB5D1E 74 06 je short 00AB5D26
00AB5D20 41 inc ecx
00AB5D21 83C0 0C add eax,0C
00AB5D24 ^ EB F6 jmp short 00AB5D1C
跟随来到如下代码:
00AB5E47 83C7 0C add edi,0C
00AB5E4A 89BD 78FDFFFF mov dword ptr ss:[ebp-288],edi
00AB5E50 83C6 04 add esi,4
00AB5E53 395F FC cmp dword ptr ds:[edi-4],ebx
00AB5E56 ^ 0F85 49FEFFFF jnz 00AB5CA5
00AB5E5C EB 03 jmp short 00AB5E61 此处下F2普通断点
00AB5E5E D6 salc //关键信息
00AB5E5F D6 salc //关键信息 表明上面是majic jump
00AB5E60 8F ??? ; 未知命令
F9执行,取消断点,撤销修改。Alt+M打开内存镜像窗口,找到第一个区段为.text的,右键下内存访问断点,F9运行。
说明:不同的版本OD不一定可以断下来,看雪版本OD可以,还是看雪的东西好啊,支持看雪。
来到如下代码:
00AAF68F 8B12 mov edx, dword ptr [edx]
00AAF691 8955 DC mov dword ptr [ebp-24], edx
00AAF694 834D FC FF or dword ptr [ebp-4], FFFFFFFF
00AAF698 EB 11 jmp short 00AAF6AB
00AAF69A 6A 01 push 1
00AAF69C 58 pop eax
00AAF69D C3 retn
下面单步F8,来到第一个call edi或call ecx之类call时,F7跟进,直接跳向OEP
0100739D 6A 70 push 70 //OEP
0100739F 68 98180001 push 01001898
010073A4 E8 BF010000 call 01007568
010073A9 33DB xor ebx, ebx
010073AB 53 push ebx
010073AC 8B3D CC100001 mov edi, dword ptr [10010CC] ; kernel32.GetModuleHandleA
010073B2 FFD7 call edi
010073B4 66:8138 4D5A cmp word ptr [eax], 5A4D
010073B9 75 1F jnz short 010073DA
Dump掉ImportREC修复,剪切掉无效指针即可。
--------------------------------------------------------
为程序减肥,看区段,很多重复区段,用CFF Explorer删除重复区段,体积减少很多,有原来的784K,减为144K。
到底脱壳完美的完成。
---------------------------------------总结----------------------------------------------------------
可学的地方:
OD的设置,不同版本OD处理穿山甲不一样,首选看雪的
找魔法跳转的返回时机,跳过魔法验证
对无效函数的修复
对脱完壳的程序就行减肥
[课程]Linux pwn 探索篇!