[逆向/壳]脱壳方法

p { margin-bottom: 0.1in; direction: ltr; line-height: 120%; text-align: justify }

壳的作用

1.有一些版权信息需要保护起来,不想让别人随便改动,如作者的姓名等,即为了保护软件不被破解,通常都是采用加壳来进行保护。

2.需要把程序压缩的小一点,从而方便使用。于是,需要用到一些软件,它们能将exe可执行文件压缩。

3.在黑客界给木马等软件加壳脱壳以躲避杀毒软件。

脱壳方法

 

方法

详细过程

单步跟踪法

1.OD载入,点“不分析代码!”

2.单步向下跟踪F8,实现向下的跳。也就是说向上的跳不让其实现!(通过F4

3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——>运行到所选)

4.绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现!

5.如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,不然程序很容易跑飞,这样很快就能到程序的OEP

6.在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALLF7进入

7.一般有很大的跳转(大跨段),比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETN的一般很快就会到程序的OEP

备注:在有些壳无法向下跟踪的时候,我们可以在附近找到没有实现的大跳转,右键–>“跟随”,然后F2下断,Shift+F9运行停在“跟随”的位置,再取消断点,继续F8单步跟踪。一般情况下可以轻松到达OEP

ESP定律法

ESP定理脱壳(ESPOD的寄存器中,我们只要在命令行下ESP的硬件访问断点,就会一下来到程序的OEP了!)

1.开始就点F8,注意观察OD右上角的寄存器中ESP有没突现(变成红色)。(这只是一般情况下,更确切的说我们选择的ESP值是关键句之后的第一个ESP值)

2.在命令行下:dd
XXXXXXXX(
指在当前代码中的ESP地址,或者是hr
XXXXXXXX)
,按回车!

3.选中下断的地址,断点—>硬件访—>WORD断点。

4.按一下F9运行程序,直接来到了跳转处,按下F8,到达程序OEP

内存镜像法

1:用OD打开软件!

2:点击选项——调试选项——异常,把里面的忽略全部√上!CTRL+F2重载下程序!

3:按ALT+M,打开内存镜象,找到程序的第一个.rsrc.F2下断点,然后按SHIFT+F9运行到断点,接着再按ALT+M,打开内存镜象,找到程序的第一个.rsrc.上面的.CODE(也就是00401000处),按F2下断点!然后按SHIFT+F9(或者是在没异常情况下按F9),直接到达程序OEP

Popad

1.开始按Ctrl+F,输入:popad(只适合少数壳,包括UPXASPACK壳),然后按下F2F9运行到此处

2.来到大跳转处,点下F8,到达OEP

最后一次异常法

1:用OD打开软件

2:点击选项——调试选项——异常,把里面的√全部去掉!CTRL+F2重载下程序

3:一开始程序就是一个跳转,在这里我们按SHIFT+F9,直到程序运行,记下从开始按SHIFT+F9到程序运行的次数m

4CTRL+F2重载程序,按SHIFT+F9(这次按的次数为程序运行的次数m-1次)

5:在OD的右下角我们看见有一个“SE
句柄,这时我们按CTRL+G,输入SE
句柄前的地址!

6:按F2下断点!然后按SHIFT+F9来到断点处!

7:去掉断点,按F8慢慢向下走!

8:到达程序的OEP

模拟跟踪法

1:先试运行,跟踪一下程序,看有没有SEH暗桩之类

2ALT+M打开内存镜像,找到(包含=SFX,imports,relocations

内存镜像,项目
30

地址=0054B000

大小=00002000
(8192.)

Owner=check
00400000

区段=.aspack

包含=SFX,imports,relocations

类型=Imag
01001002

访问=R

初始访问=RWE

3:地址为0054B000,如是我们在命令行输入tc
eip<0054B000,
回车,正在跟踪

备注:大家在使用这个方法的时候,要理解他是要在怎么样的情况下才可以使用

SFX”

1:设置OD,忽略所有异常,也就是说异常选项卡里面都打上勾

2:切换到SFX选项卡,选择“字节模式跟踪实际入口(速度非常慢)”,确定。

3:重载程序(如果跳出是否“压缩代码?”选择“否”,OD直接到达OEP

Btw:这种方法不要滥用得好,锻炼能力为妙。

壳与脱壳

UPX

手动脱壳

单步跟踪法

ESP定律

内存镜像法

Popad

模拟跟踪法

SFX

脱壳机

UPXShell

PEID

ASPack

手动脱壳

单步跟踪法

ESP定律法

内存镜像法

模拟跟踪法

SFX

脱壳机

PEID(PEID
Generic Unpacker)

AspackDie

UnAspack

FSG

手动脱壳

单步法(忽略所有异常)

ESP定律忽略所有异常

模拟跟踪法(忽略所有异常)

SFX

内存镜像法

脱壳机

PEID

UnFSG2.0(只针对FSG2.0有效)

PECompact

手动脱壳

单步法(忽略所有异常)

ESP定律忽略所有异常

模拟跟踪法

脱壳机

PEID(PEID
Generic Unpacker)

DePeCompact1.x
DePeCompact2.x DePeCompact3.x DePeCompact2.x-3.x

Armadillo

手动脱壳

见穿山甲脱壳总结

脱壳机

此脱壳机很少,且很难脱干净

Acprotect

手动脱壳

OD异常设置不忽略内存异常,隐藏OD

OD载入程序

F9一下,到最后一次典型异常!

***********************************************

堆栈提示:

0012FF84
0012FFE0
指针到下一个
SEH
记录

0012FF88
00433731 SE
句柄
//右键转存中跟随下内存访问断点

***********************************************

下好断点后,Shift+F9运行!

00433731
8B5C24 0C mov ebx,dword ptr ss:[esp+C]
//运行到这里,F2下断,Shift+F9运行

00433735
8383 B8000000 02 add dword ptr ds:[ebx+B8],2

0043373C
33C0 xor eax,eax

0043373E
C3 retn

00433781
8B048E mov eax,dword ptr ds:[esi+ecx*4]
//运行到这里,F2下断,Shift+F9运行

00433784
8B5C8E 04 mov ebx,dword ptr ds:[esi+ecx*4+4>

00433788
2BC3 sub eax,ebx

0043378A
C1C8 05 ror eax,5

0043378D
2BC2 sub eax,edx

0043378F
81C2 43A18EAB add edx,AB8EA143

00433795
89048E mov dword ptr ds:[esi+ecx*4],eax
//Shift+F9运行后就跳到这里

00433798
49 dec ecx

00433799
^ EB E1 jmp short 123.0043377C

0043379B
61 popad

0043379C
61 popad

0043379D
C3 retn
//取消所有的断点[2F2INT3断点),1次内存访问断点]F4下来!

打开内存镜像

.text段下F2断点地址,Shift+F9运行

备注:真正脱AcProtect的时候以上出现的地址应该都不相同,但是操作流程不变。

脱壳机

ACKiller

ASProtect

手动脱壳

OD载入之后忽略除了内存访问之外的所有异常,隐藏ODShift+F9,注意堆栈!

0012FF54
018032F0

0012FF58
01811810 ASCII “6uob9ACQoUA=”
//硬盘指纹

当第2次出现硬盘指纹的时候,在00401000F2断点Shift+F9

00480650
55 push ebp

00480651
8BEC mov ebp,esp

00480653
8B45 08 mov eax,dword ptr ss:[ebp+8]

00480656
A3 EC7E4800 mov dword ptr ds:[487EEC],eax
//487EEC就是保存注册名的位置

0048065B
5D pop ebp

0048065C
C2 0400 retn 4

继续Shift+F9运行来到最后一次异常!

01802CD1
3100 xor dword ptr ds:[eax],eax
//最后一次异常

01802CD3
64:8F05 0000000>pop dword ptr fs:[0]

01802CDA
58 pop eax

01802CDB
833D 7C6D8001 0>cmp dword ptr ds:[1806D7C],0

01802CE2
74 14 je short 01802CF8

01802CE4
6A 0C push 0C

01802CE6
B9 7C6D8001 mov ecx,1806D7C

01802CEB
8D45 F8 lea eax,dword ptr ss:[ebp-8]

01802CEE
BA 04000000 mov edx,4

01802CF3
E8 54E1FFFF call 01800E4C

01802CF8
FF75 FC push dword ptr ss:[ebp-4]

01802CFB
FF75 F8 push dword ptr ss:[ebp-8]

01802CFE
8B45 F4 mov eax,dword ptr ss:[ebp-C]

01802D01
8338 00 cmp dword ptr ds:[eax],0

01802D04
74 02 je short 01802D08

01802D06
FF30 push dword ptr ds:[eax]

01802D08
FF75 F0 push dword ptr ss:[ebp-10]

01802D0B
FF75 EC push dword ptr ss:[ebp-14]

01802D0E
C3 retn
//F2下断,Shift+F9运行,注意堆栈

0012FF5C
018148AC

0012FF60
00400000
ASCII
“MZP”

0012FF64
C9F5F162

0012FF68
0012FFA4
//要的就是0012FF68

hr
0012FF68,F9
运行

01815082
03C3 add eax,ebx ; emailcas.00400000
//来到这里,F8

01815084
894424 1C mov dword ptr ss:[esp+1C],eax

01815088
61 popad

01815089
FFE0 jmp eax

//
跳到OEP

备注:寻找OEP的过程大致如上所述,当然,破解时地址可能不一致,代码也不会相同

修复IAT,经常需要将无法修复的指针直接cut掉,而且需要将原程序打开,形成新的进程,然后在ImportREC中选择新的进程进行修复。

Asprotect中经常会用到stolen
code
技术,所以最后还需要还原被抽取的字节。

脱壳机

AsProtect
Unpack

版权声明:本文为sevensd原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/sevensd/p/5479396.html