lqiulu 发表于 2008-10-20 17:34:38

穿山甲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 编辑 ]

dtkissme 发表于 2008-10-20 20:03:29

非常好的教程。先收藏了,可惜我还没学会这么高深的壳。

iy0507 发表于 2009-2-11 20:48:34

板凳O(∩_∩)O谢谢

洞庭风 发表于 2009-3-4 21:16:47

楼主,视频教程在哪??

shixin 发表于 2009-7-1 15:46:13

已下载,楼主制作的很好,不时中断提醒一下。

冬天的雷雨 发表于 2009-7-2 09:26:35

谢谢~不过楼主能做个视频就好了

garyye 发表于 2009-7-3 11:51:07

板凳O(∩_∩)O谢谢

moyelin 发表于 2009-7-8 17:15:09

哈哈,好东西谢谢分享/:013 /:013

wodedipan1 发表于 2009-9-1 19:10:52

这东西 加壳后 PEID 查看的时候 是VC++6.0的 特征吗?

MyCracker 发表于 2009-9-11 15:07:34

来看看,学习下,谢谢分享
页: [1] 2
查看完整版本: 穿山甲5.42全保护利用工具脱壳、减肥(加视频教程)