脱壳的技术

2026/4/26 18:51:34

避免跟踪进入这些难懂的指令的方法之一是在壳最常用的API下断点(如:VirtualAlloc,VitualProtect,LoadLibrary,GetProcAddress等)并把这些API当作跟踪的标志。如果在这些跟踪标志之间出了错,这时候就对这一段代码进行详细的跟踪。另外,设置内存访问/写入断点也让逆向分析人员能有针对性地分析那些修改/访问受保护进程最有趣的部分的代码,而不是跟踪大量的代码最终却(很可能)发现是一个确定的例程。

最后,在VMWare中运行OllyDbg并不时地保存调试会话快照,这样一来逆向分析人员就可以回到某一个特定的跟踪状态。如果出了错,可以返回到某一特定的跟踪状态继续跟踪分析。

4.3 Anti-Disassembly

用来困惑逆向分析人员的另一种方法就是混乱反编译输出。反-反编译是使通过静态分析理解二进制代码的过程大大复杂化的有效方式。如果结合垃圾代码和代码变形一起使用将会更具效果。

反-反编译技术的一个具体的例子是插入一个垃圾字节然后增加一个条件分支使执行跳转到垃圾字节(译者注:即我们常说的花指令)。但是这个分支的条件永远为FALSE。这样垃圾代码将永远不会被执行,但是反编译引擎会开始反编译垃圾字节的地址,最终导致不正确的反编译输出。 示例

这是一个加了一些反-反编译代码的简单PEB.BeingDebugged标志检查例子。高亮的行是主要指令,其余的是反-反编译代码。它用到了垃圾字节0xff并增加了用来迷惑反编译引擎的跳到垃圾字节的假的条件跳转。 ;Anti-disassembly sequence #1 push .jmp_real_01 stc jnc .jmp_fake_01 retn

.jmp_fake_01:

db 0xff

.jmp_real_01:

;-------------------------------- mov eax,dword [fs:0x18]

;Anti-disassembly sequence #2 push .jmp_real_02 clc jc .jmp_fake_02 retn

.jmp_fake_02:

db 0xff

.jmp_real_02:

;-------------------------------- mov eax,dword [eax+0x30]

movzx test jnz eax,byte [eax+0x02] eax,eax

.debugger_found

下面是WinDbg中的反汇编输出:

0040194A 6854194000 0040194F F9 00401950 7301 00401952 C3 00401953 FF64A118 00401957 0000 00401959 006864 0040195C 194000 0040195F F8 00401960 7201 00401962 C3 00401963 FF8B40300FB6 00401969 40 0040196A 0285C0750731 OllyDbg中的反汇编输出:

0040194A 6854194000 0040194F F9 00401950 7301 00401952 C3 00401953 FF64A118 00401957 0000 00401959 006864 0040195C 194000 0040195F F8 00401960 7201 00401962 C3 00401963 FF8B40300FB6 00401969 40 0040196A 0285C0750731 最后IDAPro中的反汇编输出:

0040194A push (offset loc_401953+1) 0040194F stc 00401950 jnb short loc_401953 00401952 retn

00401953 ;------------------------------------------------------------------ 00401953

00401953 loc-401953: ;CODE XREF: sub_401946+A

PUSH 00401954

STC

JNB SHORT 00401953 RETN

JMP DWORD PTR DS:[ECX+18] ADD BYTE PTR DS:[EAX],AL

ADD BYTE PTR DS:[EAX+0X64],CH SBB DWORD PTR DS:[EAX],EAX CLC

JB SHORT 00401963 RETN

DEC DWORD PTR DS:[EBX+B60F3040] INC EAX

ADD AL,BYTE PTR SS:[EBP+310775C0] PUSH 0X401954 STC

JNB image00400000+0x1953(00401953) RET

JMP DWORD PTR [ECX+0X18] ADD [EAX],AL

ADD [EAX+0X64],CH SBB [EAX],EAX CLC

JB image00400000+0x1963 (00401963) RET

DEC DWORD PTR [EBX+0XB60F3040] INC EAX

ADD AL,[EBP+0X310775C0]

00401953 ;DATA XREF: sub_401946+4 00401953 jmp dword ptr [ecx+18h] 00401953 sub_401946 endp 00401953

00401953 ;------------------------------------------------------------------ 00401957 db 0 00401958 db 0 00401959 db 0 0040195A db 68h; h 0040195B dd offset unk_401964 0040195F db 0F8h; 00401960 db 72h; r 00401961 db 1 00401962 db 0C3h;+ 00401963 db 0FFh 00401964 unk_401964 db 8Bh; i ;DATA XREF: text:0040195B 00401965 db 40h; @ 00401966 db 30h; 0 00401967 db 0Fh 00401968 db 0B6h;| 00401969 db 40h; @ 0040196A db 2 0040196B db 85h; 0040196C db 0C0h;+ 0040196D db 75h; u

注意所有这三个反编译引擎/调试器是如何落入反-反编译陷阱的,分析这样的反汇编代

码对于逆向分析人员来说是很不容易的。还有其它的几种干扰反编译引擎的手段,这只是一个例子。另外这些反-反编译代码可以编码成一个宏,这样汇编源码就清晰多了。 建议读者参考Eldad Eliam13的一本精彩的逆向书籍,里面包含了反-反编译的详细信息和其它一些逆向话题。

5 调试器攻击技术 本节罗列了壳用来主动攻击调试器的技术,如果进程正在被调试那么执行会突然停止、断点将被禁用。和前面描述的技术类似,结合反-反编译技术隐藏起来使用效果会更佳。 5.1 Misdirection and Stopping Execution via Exceptions

线性地跟踪能够让逆向分析人员容易理解并掌握代码的真正目的。因此壳使用一些技术使得跟踪代码不再是线性的且更加费时。

一个普遍使用的技巧是在脱壳的过程中抛出一些异常,通过抛出一些可捕获的异常,逆向分析人员必需熟悉异常发生的时候EIP指向何处,当异常处理例程执行完之后EIP又指向何处。

另外异常是壳用来反复停止脱壳代码执行的手段之一,因为当进程被调试时抛出异常,调试器会暂停脱壳代码的执行。

壳通常使用结构化异常处理(SEH)14作为异常处理的机制,然而新壳也开始使用向量化异常15。 示例

下面示例代码抛出溢出异常(通过INTO)产生错误,通过数轮循环后由ROL指令来修改溢出标志。但是由于溢出异常是一个陷阱异常,EIP将指向JMP指令。如果逆向分析人员使用OllyDbg并且没有将异常传递给进程(通过Shift+F7/F8/F9)而是继续步进,进程将会进入一个死循环。

;set up exception handler push .exception_handler push dword [fs:0] mov [fs:0],esp

;throw an exception mov ecx,1

.loop:

rol ecx,1 into jmp .loop

;restore exception handler pop dword [fs:0] add esp,4 :::

.exception_handler

;EAX = CONTEXT record mov eax,[esp+0xc]

;set Context.EIP upon return add dword [eax+0xb8],2 xor eax,eax retn

壳通常会抛出违规访问(0xC0000005)、断点(0x80000003)和单步(0x80000004)异常。 对策

当壳使用可捕获的异常仅仅是为了执行不同的代码时,可以通过选项-> 调试选项 -> 异常选项卡配置OllyDbg使得异常处理例程自动被调用。下面是异常处理配置对话框的屏幕截图。逆向分析人员也可以添加那些不能通过复选框选择的自定义的异常。


脱壳的技术.doc 将本文的Word文档下载到电脑
搜索更多关于: 脱壳的技术 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219