穿山甲5.42全保护利用工具脱壳、减肥(加视频教程)
【文章标题】: 穿山甲5.42全保护利用工具脱壳、减肥【文章作者】: lqiulu
【作者邮箱】: [email protected]
【软件名称】: InternetPass.exe
【软件大小】: 748 KB
【下载地址】: http://www.thegrideon.com/
【加壳方式】: 穿山甲5.42全保护
【保护方式】: 穿山甲5.42全保护
【使用工具】: OD、 Armadillo Find Protected V1.8、Armadillo Process Detach、ARMinline 0.96final、cff explorer Ⅶ、lord PE、importREC
【操作平台】: winxp sp3
【软件介绍】: IE 密码恢复工具。
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
Armadillo Find Protected查壳:
!- Protected Armadillo
Protection system (Professional)
!- <Protection Options>
Debug-Blocker
CopyMem-II
Enable Import Table Elimination
Enable Strategic Code Splicing
Enable Nanomites Processing
Enable Memory-Patching Protections
!- <Backup Key Options>
Main Key Only, No Backup Keys
!- <Compression Options>
Best/Slowest Compression
!- <Other Options>
!- Version 5.42 20-02-2008
!- Elapsed Time 00h 00m 01s 953ms
这就是传说中的全保护,呵呵。
我们就用比较简单的方法进行脱壳,首先谢谢工具的开发者们,
下面开始:
利用Armadillo Process Detach 1.31版工具的CopyMemⅡ方式载入加壳程序。
(Armadillo Process Detach 1.31版工具有两种模式,1种为CopyMemⅡ模式,用于dump脱壳主程序的。
另一种模式为Debug-Block模式,用于取得解密的IAT完整数据的。)
工具显示如下:
Filename: InternetPass.exe
Parent process iD:
Processing...
Professional Edition
Debug-Blocker protection detected
CopyMem-II protection detected
Memory-Patching Protections enabled
Strategic Code Splicing enabled
Import Table Elimination enabled
Nanomites Processing enabled
Crypto call found:
Child process iD:
Entry point:
Original bytes: [6A606898
Detached successfully :)
记下子进程ID:76C,首代码:6A606898,用OD附加进程76C。来到这里:
7C92120F C3 RETN //停在此处,ALT+F9返回。
7C921210 8BFF MOV EDI,EDI
7C921212 >CC INT3
7C921213 C3 RETN
---------------------------------------------------------------------------
00408BB6- EB FE JMP SHORT Internet.00408BB6//返回到这里,将记下的首代码替换
00408BB8 90 NOP
00408BB9 90 NOP
00408BBA 1C 41 SBB AL,41
00408BBC 00E8 ADD AL,CH
00408BBE E2 1B LOOPD SHORT Internet.00408BDB
00408BC0 0000 ADD BYTE PTR DS:,AL
00408BC2 BF 94000000 MOV EDI,94
00408BC7 8BC7 MOV EAX,EDI
替换代码后为:
00408BB6 6A 60 PUSH 60
00408BB8 68 981C4100 PUSH Internet.00411C98
00408BBD E8 E21B0000 CALL Internet.0040A7A4
00408BC2 BF 94000000 MOV EDI,94
00408BC7 8BC7 MOV EAX,EDI
00408BC9 E8 72FBFFFF CALL Internet.00408740
-----------------------------------------------------------------------------------
找IAT数据位置,
00408BD1 8BF4 MOV ESI,ESP
00408BD3 893E MOV DWORD PTR DS:,EDI
00408BD5 56 PUSH ESI
00408BD6 FF15 206ADA00 CALL DWORD PTR DS:; kernel32.GetVersionExA//内存地址跟随。
00408BDC 8B4E 10 MOV ECX,DWORD PTR DS:
00408BDF 890D 04544100 MOV DWORD PTR DS:,ECX
00DA69F80040F978Internet.0040F978
00DA69FC0271AC64
00DA6A0002B2A607
00DA6A04FD8E5371
00DA6A0800000000
00DA6A0C98F65359
00DA6A10092CFE81
00DA6A14E39EDB0E
00DA6A180B43008D
00DA6A1C010C0163
00DA6A207C812B6Ekernel32.GetVersionExA//跟随到这里。
00DA6A2400CFAF38
00DA6A2800CFDF90
00DA6A2C7C812837kernel32.GetOEMCP
00DA6A3000CFB005
00DA6A3400CFAF90
00DA6A387C921000ntdll.RtlEnterCriticalSection
00DA6A3C00CFB046
00DA6A4000CFC350
00DA6A4400CFB0CE
00DA6A4877E9C461RPCRT4.UuidFromStringA
00DA6A4C77D29849USER32.EnableWindow
00DA6A5000D01BB0
00DA6A5400CFAFC7
00DA6A5800CFAF2A
00DA6A5C00CFAFBB
00DA6A6000CFC780
00DA6A6400CFB007
00DA6A6877D18F9CUSER32.GetSystemMetrics //记下三个连续的函数代码。以用于在定位解密的iat数据。
00DA6A6C77D18C42USER32.KillTimer
00DA6A707C81D363kernel32.SetStdHandle
00DA6A747C80A164kernel32.WideCharToMultiByte
00DA6A7877EF5D77GDI32.SetTextColor
00DA6A7C7C80BD5Fkernel32.IsBadCodePtr
9C 8F D1 77 42 8C D1 77 63 D3 81 7C
===================================================================================================
下面我们获取完整的IAT数据。
利用Armadillo Process Detach 1.1版工具载入加壳程序,1.3版的用过几次Debug-Block模式,OD总是出错,所以
用1.1版的。因为1.1版的只有Debug-Block模式。
DONE!
Child process ID: 0000090C
Entry point: 00468000
Original bytes: 60E8
再打开一个OD附加子进程ID878
7C92120F C3 RETN //停在这里,ALT+F9返回
7C921210 8BFF MOV EDI,EDI
7C921212 >CC INT3
7C921213 C3 RETN
7C921214 8BFF MOV EDI,EDI
---------------------------------------------------------------------------
00468000 >- EB FE JMP SHORT Internet.<ModuleEntryPoint>//返回到这里,替换首代码。
00468002 0000 ADD BYTE PTR DS:,AL
00468004 0000 ADD BYTE PTR DS:,AL
00468006 5D POP EBP
00468007 50 PUSH EAX
替换后为:
00468000 >60 PUSHAD
00468001 E8 00000000 CALL Internet.00468006
00468006 5D POP EBP
00468007 50 PUSH EAX
00468008 51 PUSH ECX
00468009 0FCA BSWAP EDX
下断:bp VirtualProtect ** + f9运行。观查寄存器及堆栈及程序运行大的缓冲,六次大缓冲后停在这里。
7C801AD4 >8BFF MOV EDI,EDI
7C801AD6 55 PUSH EBP
7C801AD7 8BEC MOV EBP,ESP
7C801AD9 FF75 14 PUSH DWORD PTR SS:
7C801ADC FF75 10 PUSH DWORD PTR SS:
7C801ADF FF75 0C PUSH DWORD PTR SS:
7C801AE2 FF75 08 PUSH DWORD PTR SS:
堆栈:
00129438 00D2A93E/CALL to VirtualProtect from 00D2A938
0012943C 00401000|Address = Internet.00401000
00129440 0000F000|Size = F000 (61440.)
00129444 00000004|NewProtect = PAGE_READWRITE
00129448 0012C12C\pOldProtect = 0012C12C
寄存器:
EAX 00401000 Internet.00401000 //这里是0040100CODE段的起始位置。
ECX 0012C12C
EDX 0000F000
EBX 000000A7
ESP 00129438
EBP 0012EB50
ESI 000000E9
EDI 00000009
EIP 7C801AD4 kernel32.VirtualProtect
现在就是返回时机。取消断点返ALT+F9回。
00D2A93E 8B8D D0D5FFFF MOV ECX,DWORD PTR SS://返回到这里。CTRL+F查找“push 100”选中全段
00D2A944 51 PUSH ECX
00D2A945 8B95 CCD5FFFF MOV EDX,DWORD PTR SS:
00D2A94B 52 PUSH EDX
00D2A94C 8B85 74D8FFFF MOV EAX,DWORD PTR SS:
00D2A952 0385 C8D5FFFF ADD EAX,DWORD PTR SS:
00CE30D0 55 PUSH EBP //这里改为retn。下第二个段点到程序OEP.
00CE30D1 8BEC MOV EBP,ESP
00CE30D3 83EC 2C SUB ESP,2C
00CE30D6 833D 00B6D500 00 CMP DWORD PTR DS:,0
00CE30DD 75 59 JNZ SHORT 00CE3138
00CE30DF C745 EC 1CE1ECE0 MOV DWORD PTR SS:,E0ECE11C
00CE30E6 68 00010000 PUSH 100 //查到这里。
----------------------------------------------------------------------------------------------------------
第二个断点,bp CreateThread。SHIFT + F9 运行。
7C8106C7 >8BFF MOV EDI,EDI
7C8106C9 55 PUSH EBP
7C8106CA 8BEC MOV EBP,ESP
7C8106CC FF75 1C PUSH DWORD PTR SS:
返回
00D141D9 50 PUSH EAX
00D141DA FF15 5CF2D400 CALL DWORD PTR DS: ; kernel32.CloseHandle
00D141E0 5E POP ESI
00D141E1 5B POP EBX
00D141E2 8BE5 MOV ESP,EBP
00D141E4 5D POP EBP
00D141E5 C3 RETN
00D302B9 8B4D 08 MOV ECX,DWORD PTR SS:
00D302BC 8B51 08 MOV EDX,DWORD PTR DS:
00D302BF 52 PUSH EDX
00D302C0 6A 00 PUSH 0
00D302C2 8B45 08 MOV EAX,DWORD PTR SS:
00D302C5 8B48 0C MOV ECX,DWORD PTR DS:
00D302C8 51 PUSH ECX
00D302C9 8B55 F4 MOV EDX,DWORD PTR SS:
00D302CC 2B55 DC SUB EDX,DWORD PTR SS:
00D302CF FFD2 CALL EDX
00D302D1 8945 FC MOV DWORD PTR SS:,EAX
00D302D4 8B45 FC MOV EAX,DWORD PTR SS:
00D302D7 5E POP ESI
00D302D8 8BE5 MOV ESP,EBP
00D302DA 5D POP EBP
00D302DB C3 RETN
00408BB6 AF SCAS DWORD PTR ES:
00408BB7 9C PUSHFD
00408BB8 34 80 XOR AL,80
00408BBA D9BD 5CF027E7 FSTCW WORD PTR SS:
00408BC0 5C POP ESP
00408BC1 187A 68 SBB BYTE PTR DS:,BH
00408BC4 5C POP ESP
00408BC5 18C5 SBB CH,AL
00408BC7^ 77 9B JA SHORT Internet.00408B64
alt+m到内存镜像
在第一行点一下,CTRL+B查找“9C 8F D1 77 42 8C D1 77 63 D3 81 7C”,我们原来记下的三个连续的函数代码。
查到这里。
00DB6A689C 8F D1 77 42 8C D1 77 63 D3 81 7C 64 A1 80 7C湉褀B屟wc觼|d?|
00DB6A7877 5D EF 77 5F BD 80 7C 54 B0 D0 00 E1 0E 81 7Cw]飛_絸|T靶.?亅
00DB6A88BB AE D0 划??
右键“长型”“地址”显示。
00DB6A207C812B6Ekernel32.GetVersionExA//找到这里,就是IAT的起始位置。
00DB6A2400D0AF38
00DB6A287C810C1Ekernel32.SetFilePointer
00DB6A2C7C812837kernel32.GetOEMCP
................................
00DBFC8800CC8806
00DBFC8C00000000 //结束位置。
大小:FC8C-6A20=926C
复制二进制数据,这些就是完整的IAT数据,复制到相应的第一个OD载入的子进程的位置进行替换。
00DA6A207C812B6Ekernel32.GetVersionExA //起始位置
00DA6A2400D0AF38
00DA6A287C810C1Ekernel32.SetFilePointer
..........................................
大小:326C
6E 2B 81 7C 38 AF D0 00 1E 0C ...... 73
替换后,我们下一步,打开ARMinline工具。对 Import Table Elimination、Enable Strategic Code Splicing及
Enable Nanomites Processing进行处理。
选择程序进程。
首先是“Code Splicing”(远地址跳)的处理。
起始位置是正确的,3FC0000,但大小不对,工具找到的大小为B000,实际大小为1B000
可以ALT+M到内存镜看一下。
点“Remove Spices”进行处理。
接下来处理 “Import Table Elimination”(输入表乱序):
工具找到的地址“DA6A18”,我们自行计算填入:DA6A20,大小:926C。New Base VA of IAT:我们一般选择data相关
段,有sfx段则为首选,可自行选取,本程序我选的00468000段。点“Rebase IAT”进行处理。处理结束。
再处理Nanomites,点Locale,对加壳的程序进行分析,程序打开后试试各种功能。
然后点Save保存分析结果,方便一会儿进行修复。
好了我们经过一系列的处理后可以dump和修复程序了。打开lordPE,dump程序。打开importREC,选中进程,
填入oep地址:8BB6自动选择。获取输入表,全部有效,进行修复。
再打开Arminline,load保存的Nanomites分析数据。对修复的程序进行修复cc,最后修复完成。
运行一下我们的劳动成果吧。可以正常运行。脱壳过程结束。
================================================================================================
下面进行减肥,脱壳后的程序很大1.01M,有很大垃圾段,我们利用cff explorer进行优化减肥。
打开程序。选择Section Header右边的窗口会出现程序的各个区段。
只保留以下区段:.text、.rdata、.adata、.rsrc、.mackt、.nano 六个区段其它都删除。
具体过程选中区段右键“Delete setion(Header and data)”(删除区段,头及数据)进行删除。
都删除后保存文件。具体保留哪些,一般的.text、.rsrc、.mackt、.nano这几个一定要保留,别的自己试试。
删一个保存一个。
好了,一个长篇大论,谢谢看完。到此结束。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于52pojie论坛, 转载请注明作者并保持文章的完整, 谢谢!
2008年10月20日 10:53:07
教程.rar
[ 本帖最后由 lqiulu 于 2008-10-20 17:38 编辑 ] 非常好的教程。先收藏了,可惜我还没学会这么高深的壳。 板凳O(∩_∩)O谢谢 楼主,视频教程在哪?? 已下载,楼主制作的很好,不时中断提醒一下。 谢谢~不过楼主能做个视频就好了 板凳O(∩_∩)O谢谢 哈哈,好东西谢谢分享/:013 /:013 这东西 加壳后 PEID 查看的时候 是VC++6.0的 特征吗? 来看看,学习下,谢谢分享
页:
[1]
2