好友
阅读权限 40
听众
最后登录 1970-1-1
【文章标题】: 穿山甲5.42全保护利用工具脱壳 、减肥
【文章作者】: lqiulu[LCG]
【作者邮箱】: lqiulu@sohu.com
【软件名称】: 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: [0000076C]
Entry point:[00408BB6]
Original bytes: [6A606898]
Detached successfully :)
记下子进程ID:76C,首代码:6A606898,用OD附加进程76C。来到这里:
7C92120FC3 RETN//停在此处,ALT+F9返回。
7C9212108BFF MOV EDI,EDI
7C921212 >CC INT3
7C921213C3 RETN
---------------------------------------------------------------------------
00408BB6- EB FEJMP SHORT Internet.00408BB6//返回到这里,将记下的首代码替换
00408BB890 NOP
00408BB990 NOP
00408BBA1C 41SBB AL,41
00408BBC00E8 ADD AL,CH
00408BBEE2 1BLOOPD SHORT Internet.00408BDB
00408BC00000 ADD BYTE PTR DS:[EAX],AL
00408BC2BF 94000000MOV EDI,94
00408BC78BC7 MOV EAX,EDI
替换代码后为:
00408BB66A 60PUSH 60
00408BB868 981C4100PUSH Internet.00411C98
00408BBDE8 E21B0000CALL Internet.0040A7A4
00408BC2BF 94000000MOV EDI,94
00408BC78BC7 MOV EAX,EDI
00408BC9E8 72FBFFFFCALL Internet.00408740
-----------------------------------------------------------------------------------
找IAT数据位置,
00408BD18BF4 MOV ESI,ESP
00408BD3893E MOV DWORD PTR DS:[ESI],EDI
00408BD556 PUSH ESI
00408BD6FF15 206ADA00CALL DWORD PTR DS:[DA6A20]; kernel32.GetVersionExA//内存地址跟随。
00408BDC8B4E 10MOV ECX,DWORD PTR DS:[ESI+10]
00408BDF890D 04544100MOV DWORD PTR DS:[415404],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: 00000878
Entry point: 00468000
Original bytes: 60E8
再打开一个OD附加子进程ID878
7C92120FC3 RETN//停在这里,ALT+F9返回
7C9212108BFF MOV EDI,EDI
7C921212 >CC INT3
7C921213C3 RETN
7C9212148BFF MOV EDI,EDI
---------------------------------------------------------------------------
00468000 >- EB FEJMP SHORT Internet.<ModuleEntryPoint>//返回到这里,替换首代码。
004680020000 ADD BYTE PTR DS:[EAX],AL
004680040000 ADD BYTE PTR DS:[EAX],AL
004680065D POP EBP
0046800750 PUSH EAX
替换后为:
00468000 >60 PUSHAD
00468001E8 00000000CALL Internet.00468006
004680065D POP EBP
0046800750 PUSH EAX
0046800851 PUSH ECX
004680090FCA BSWAP EDX
下断:bp VirtualProtect shit + f9运行。观查寄存器及堆栈及程序运行大的缓冲,六次停在这里。
7C801AD4 >8BFF MOV EDI,EDI
7C801AD655 PUSH EBP
7C801AD78BEC MOV EBP,ESP
7C801AD9FF75 14PUSH DWORD PTR SS:[EBP+14]
7C801ADCFF75 10PUSH DWORD PTR SS:[EBP+10]
7C801ADFFF75 0CPUSH DWORD PTR SS:[EBP+C]
7C801AE2FF75 08PUSH 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时就是返回时机 。
ECX 0012C12C
EDX 0000F000
EBX 000000A7
ESP 00129438
EBP 0012EB50
ESI 000000E9
EDI 00000009
EIP 7C801AD4 kernel32.VirtualProtect
现在就是返回时机。取消断点返ALT+F9回。
00D2A93E8B8D D0D5FFFFMOV ECX,DWORD PTR SS:[EBP-2A30]//返回到这里。CTRL+F查找“push 100”选中全段
00D2A94451 PUSH ECX
00D2A9458B95 CCD5FFFFMOV EDX,DWORD PTR SS:[EBP-2A34]
00D2A94B52 PUSH EDX
00D2A94C8B85 74D8FFFFMOV EAX,DWORD PTR SS:[EBP-278C]
00D2A9520385 C8D5FFFFADD EAX,DWORD PTR SS:[EBP-2A38]
00CE30D055 PUSH EBP //这里改为retn。下第二个段点到程序OEP.
00CE30D18BEC MOV EBP,ESP
00CE30D383EC 2CSUB ESP,2C
00CE30D6833D 00B6D500 00 CMP DWORD PTR DS:[D5B600],0
00CE30DD75 59JNZ SHORT 00CE3138
00CE30DFC745 EC 1CE1ECE0 MOV DWORD PTR SS:[EBP-14],E0ECE11C
00CE30E668 00010000PUSH 100 //查到这里。
----------------------------------------------------------------------------------------------------------
第二个断点,bp CreateThread。SHIFT + F9 运行。
7C8106C7 >8BFF MOV EDI,EDI
7C8106C955 PUSH EBP
7C8106CA8BEC MOV EBP,ESP
7C8106CCFF75 1CPUSH DWORD PTR SS:[EBP+1C]
alt + f9 返回
00D141D950 PUSH EAX //返回到这里单步
00D141DAFF15 5CF2D400CALL DWORD PTR DS:[D4F25C] ; kernel32.CloseHandle
00D141E05E POP ESI
00D141E15B POP EBX
00D141E28BE5 MOV ESP,EBP
00D141E45D POP EBP
00D141E5C3 RETN
.................................................................
00D302B98B4D 08MOV ECX,DWORD PTR SS:[EBP+8]
00D302BC8B51 08MOV EDX,DWORD PTR DS:[ECX+8]
00D302BF52 PUSH EDX
00D302C06A 00PUSH 0
00D302C28B45 08MOV EAX,DWORD PTR SS:[EBP+8]
00D302C58B48 0CMOV ECX,DWORD PTR DS:[EAX+C]
00D302C851 PUSH ECX
00D302C98B55 F4MOV EDX,DWORD PTR SS:[EBP-C]
00D302CC2B55 DCSUB EDX,DWORD PTR SS:[EBP-24]
00D302CFFFD2 CALL EDX//到这里跳向程序的OEP
00D302D18945 FCMOV DWORD PTR SS:[EBP-4],EAX
00D302D48B45 FCMOV EAX,DWORD PTR SS:[EBP-4]
00D302D75E POP ESI
00D302D88BE5 MOV ESP,EBP
00D302DA5D POP EBP
00D302DBC3 RETN
-----------------------------------------------------------------
00408BB6AF SCAS DWORD PTR ES:[EDI]
00408BB79C PUSHFD
00408BB834 80XOR AL,80
00408BBAD9BD 5CF027E7FSTCW WORD PTR SS:[EBP+E727F05C]
00408BC05C POP ESP
00408BC1187A 68SBB BYTE PTR DS:[EDX+68],BH
00408BC45C POP ESP
00408BC518C5 SBB CH,AL
00408BC7^ 77 9BJA 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
..........................................
大小:926C
数据如下:
6E 2B 81 7C 38 AF D0 00 .......... 01 08 01 00 00 00 00(太长省略)
替换后,我们下一步,打开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进行优化减肥,减肥后为204k。
打开程序。选择Section Header右边的窗口会出现程序的各个区段。
只保留以下区段:.text、.rdata、.adata、.rsrc、.mackt、.nano 六个区段其它都删除。
具体过程选中区段右键“Delete setion(Header and data)”(删除区段,头及数据)进行删除。
都删除后保存文件。具体保留哪些,一般的.text、.rsrc、.mackt、.nano这几个一定要保留,别的自己试试。
删一个保存一个。
好了,一个长篇大论,谢谢看完。到此结束。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于52pojie论坛, 转载请注明作者并保持文章的完整, 谢谢!
2008年10月20日 10:53:07
视频教程下载:
http://bbs.52pojie.cn/read.php?tid=12394
教程.rar
687 KB, 下载次数: 231, 下载积分: 吾爱币 -1 CB
附件,事例程序及工具