TA的每日心情 | 开心 2016-7-26 14:34 |
---|
签到天数: 5 天 [LV.2]偶尔看看I
|
【文章标题】: 穿山甲5.42全保护利用工具脱壳、减肥
【文章作者】: lqiulu[LCG]
【作者邮箱】: [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: [00000F84]
Processing...
[PROTECTiON SYSTEM]
Professional Edition
[PROTECTiON OPTiONS]
Debug-Blocker protection detected
CopyMem-II protection detected
Memory-Patching Protections enabled
Strategic Code Splicing enabled
Import Table Elimination enabled
Nanomites Processing enabled
[CHiLD iNFO]
Crypto call found: [00442F4B]
Child process iD: [00000400]
Entry point: [00408BB6]
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:[EAX],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:[ESI],EDI
00408BD5 56 PUSH ESI
00408BD6 FF15 206ADA00 CALL DWORD PTR DS:[DA6A20] ; kernel32.GetVersionExA//内存地址跟随。
00408BDC 8B4E 10 MOV ECX,DWORD PTR DS:[ESI+10]
00408BDF 890D 04544100 MOV DWORD PTR DS:[415404],ECX
00DA69F8 0040F978 Internet.0040F978
00DA69FC 0271AC64
00DA6A00 02B2A607
00DA6A04 FD8E5371
00DA6A08 00000000
00DA6A0C 98F65359
00DA6A10 092CFE81
00DA6A14 E39EDB0E
00DA6A18 0B43008D
00DA6A1C 010C0163
00DA6A20 7C812B6E kernel32.GetVersionExA //跟随到这里。
00DA6A24 00CFAF38
00DA6A28 00CFDF90
00DA6A2C 7C812837 kernel32.GetOEMCP
00DA6A30 00CFB005
00DA6A34 00CFAF90
00DA6A38 7C921000 ntdll.RtlEnterCriticalSection
00DA6A3C 00CFB046
00DA6A40 00CFC350
00DA6A44 00CFB0CE
00DA6A48 77E9C461 RPCRT4.UuidFromStringA
00DA6A4C 77D29849 USER32.EnableWindow
00DA6A50 00D01BB0
00DA6A54 00CFAFC7
00DA6A58 00CFAF2A
00DA6A5C 00CFAFBB
00DA6A60 00CFC780
00DA6A64 00CFB007
00DA6A68 77D18F9C USER32.GetSystemMetrics //记下三个连续的函数代码。以用于在定位解密的iat数据。
00DA6A6C 77D18C42 USER32.KillTimer
00DA6A70 7C81D363 kernel32.SetStdHandle
00DA6A74 7C80A164 kernel32.WideCharToMultiByte
00DA6A78 77EF5D77 GDI32.SetTextColor
00DA6A7C 7C80BD5F kernel32.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:[EAX],AL
00468004 0000 ADD BYTE PTR DS:[EAX],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:[EBP+14]
7C801ADC FF75 10 PUSH DWORD PTR SS:[EBP+10]
7C801ADF FF75 0C PUSH DWORD PTR SS:[EBP+C]
7C801AE2 FF75 08 PUSH DWORD PTR SS:[EBP+8]
堆栈:
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 //这里是0040100 CODE段的起始位置。
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:[EBP-2A30]//返回到这里。CTRL+F查找“push 100”选中全段
00D2A944 51 PUSH ECX
00D2A945 8B95 CCD5FFFF MOV EDX,DWORD PTR SS:[EBP-2A34]
00D2A94B 52 PUSH EDX
00D2A94C 8B85 74D8FFFF MOV EAX,DWORD PTR SS:[EBP-278C]
00D2A952 0385 C8D5FFFF ADD EAX,DWORD PTR SS:[EBP-2A38]
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:[D5B600],0
00CE30DD 75 59 JNZ SHORT 00CE3138
00CE30DF C745 EC 1CE1ECE0 MOV DWORD PTR SS:[EBP-14],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:[EBP+1C]
返回
00D141D9 50 PUSH EAX
00D141DA FF15 5CF2D400 CALL DWORD PTR DS:[D4F25C] ; 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:[EBP+8]
00D302BC 8B51 08 MOV EDX,DWORD PTR DS:[ECX+8]
00D302BF 52 PUSH EDX
00D302C0 6A 00 PUSH 0
00D302C2 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
00D302C5 8B48 0C MOV ECX,DWORD PTR DS:[EAX+C]
00D302C8 51 PUSH ECX
00D302C9 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00D302CC 2B55 DC SUB EDX,DWORD PTR SS:[EBP-24]
00D302CF FFD2 CALL EDX
00D302D1 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
00D302D4 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00D302D7 5E POP ESI
00D302D8 8BE5 MOV ESP,EBP
00D302DA 5D POP EBP
00D302DB C3 RETN
00408BB6 AF SCAS DWORD PTR ES:[EDI]
00408BB7 9C PUSHFD
00408BB8 34 80 XOR AL,80
00408BBA D9BD 5CF027E7 FSTCW WORD PTR SS:[EBP+E727F05C]
00408BC0 5C POP ESP
00408BC1 187A 68 SBB BYTE PTR DS:[EDX+68],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”,我们原来记下的三个连续的函数代码。
查到这里。
00DB6A68 9C 8F D1 77 42 8C D1 77 63 D3 81 7C 64 A1 80 7C 湉褀B屟wc觼|d?|
00DB6A78 77 5D EF 77 5F BD 80 7C 54 B0 D0 00 E1 0E 81 7C w]飛_絸|T靶.?亅
00DB6A88 BB AE D0 划??
右键“长型”“地址”显示。
00DB6A20 7C812B6E kernel32.GetVersionExA //找到这里,就是IAT的起始位置。
00DB6A24 00D0AF38
00DB6A28 7C810C1E kernel32.SetFilePointer
00DB6A2C 7C812837 kernel32.GetOEMCP
................................
00DBFC88 00CC8806
00DBFC8C 00000000 //结束位置。
大小:FC8C-6A20=926C
复制二进制数据,这些就是完整的IAT数据,复制到相应的第一个OD载入的子进程的位置进行替换。
00DA6A20 7C812B6E kernel32.GetVersionExA //起始位置
00DA6A24 00D0AF38
00DA6A28 7C810C1E kernel32.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 编辑 ] |
|