lqiulu 发表于 2008-10-20 12:30

穿山甲全保护5.42版利用工具脱壳、减肥

【文章标题】: 穿山甲5.42全保护利用工具脱壳、减肥
【文章作者】: lqiulu
【作者邮箱】: 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:
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:
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:,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:,EDI
00408BD556 PUSH ESI
00408BD6FF15 206ADA00CALL DWORD PTR DS:; kernel32.GetVersionExA//内存地址跟随。
00408BDC8B4E 10MOV ECX,DWORD PTR DS:
00408BDF890D 04544100MOV 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: 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:,AL
004680040000 ADD BYTE PTR DS:,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:
7C801ADCFF75 10PUSH DWORD PTR SS:
7C801ADFFF75 0CPUSH DWORD PTR SS:
7C801AE2FF75 08PUSH 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 //这里是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://返回到这里。CTRL+F查找“push 100”选中全段
00D2A94451 PUSH ECX
00D2A9458B95 CCD5FFFFMOV EDX,DWORD PTR SS:
00D2A94B52 PUSH EDX
00D2A94C8B85 74D8FFFFMOV EAX,DWORD PTR SS:
00D2A9520385 C8D5FFFFADD EAX,DWORD PTR SS:

00CE30D055 PUSH EBP //这里改为retn。下第二个段点到程序OEP.
00CE30D18BEC MOV EBP,ESP
00CE30D383EC 2CSUB ESP,2C
00CE30D6833D 00B6D500 00 CMP DWORD PTR DS:,0
00CE30DD75 59JNZ SHORT 00CE3138
00CE30DFC745 EC 1CE1ECE0 MOV DWORD PTR SS:,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:

alt + f9返回

00D141D950 PUSH EAX //返回到这里单步
00D141DAFF15 5CF2D400CALL DWORD PTR DS: ; kernel32.CloseHandle
00D141E05E POP ESI
00D141E15B POP EBX
00D141E28BE5 MOV ESP,EBP
00D141E45D POP EBP
00D141E5C3 RETN
.................................................................
00D302B98B4D 08MOV ECX,DWORD PTR SS:
00D302BC8B51 08MOV EDX,DWORD PTR DS:
00D302BF52 PUSH EDX
00D302C06A 00PUSH 0
00D302C28B45 08MOV EAX,DWORD PTR SS:
00D302C58B48 0CMOV ECX,DWORD PTR DS:
00D302C851 PUSH ECX
00D302C98B55 F4MOV EDX,DWORD PTR SS:
00D302CC2B55 DCSUB EDX,DWORD PTR SS:
00D302CFFFD2 CALL EDX//到这里跳向程序的OEP
00D302D18945 FCMOV DWORD PTR SS:,EAX
00D302D48B45 FCMOV EAX,DWORD PTR SS:
00D302D75E POP ESI
00D302D88BE5 MOV ESP,EBP
00D302DA5D POP EBP
00D302DBC3 RETN
-----------------------------------------------------------------
00408BB6AF SCAS DWORD PTR ES:
00408BB79C PUSHFD
00408BB834 80XOR AL,80
00408BBAD9BD 5CF027E7FSTCW WORD PTR SS:
00408BC05C POP ESP
00408BC1187A 68SBB BYTE PTR DS:,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

niliu 发表于 2008-10-20 14:32

鲜花啊 掌声啊。。。 好文那....

小生我怕怕 发表于 2008-10-20 15:19

学习一下,这样好的教程等他们来加精华!

maloushan 发表于 2008-10-20 15:25

学习这样的好文,爽

xm3good 发表于 2008-10-20 19:47

学习一下,这样好的教程等他们来加精华!

making 发表于 2008-10-20 20:05

这样的好文

yunfeng 发表于 2008-10-20 20:50

我不会脱,进来学习一下。

microsaint 发表于 2008-10-21 03:40

习一下,这样好的教程等他们来加精华!

swl 发表于 2008-10-21 11:08

好文章,下载学习。

unpack 发表于 2008-10-21 16:05

双进程的吗 不会搞 学习一下吧
页: [1] 2 3 4 5 6 7 8
查看完整版本: 穿山甲全保护5.42版利用工具脱壳、减肥