0%

压缩壳原理即对坑-UPX为例

什么是壳

壳,分为压缩壳保护壳伪装壳(对抗杀毒软件)

这篇文章讲以下压缩壳,压缩壳可以有效减少程序的体积,同时由于压缩之后的代码比较难懂,所以也有一定的保护作用,最常见的就是UPX壳。压缩壳不同于一般的压缩(7zp、rar等),它不需要解压缩操作,程序可以直接运行,用到的是一种运行时解压缩技术。

运行加壳程序,操作对象是notepad.exe,运行得到new.exe程序,大小从67584变为了48128字节。

这是notepad.exe对应的

这是new.exe对应的

加入的upx代码的作用是将2、3、4解压缩(还原)为7、8、9,并不影响程序的运行。在我们运行程序的瞬间2、3、4被还原为7、8、9。

可以看到,啥都看不到,看到的这些就是上文提到的2、3、4就是压缩之后的代码。壳可以手动脱也可以用脱壳机一键脱,当然脱不下来的话就要上手了。

脱壳

机脱

1
2
3
4
5
6
win+r
d:/
cd tools(upx文件夹所在的文件夹)
cd upx
upx.exe
upx -d 程序名

如果成功则程序直接发生更改,如果出现红色的字体则说明没有脱壳成功。

手脱

手脱的工具需要

  • ollydbg
  • lordpe (在xp环境,反正win11不行)
  • ImportREC (修复IAT)

我们将有壳的程序拖入od他会弹出这个窗口,我们知道他是有壳的,所以不需要他继续分析啦,直接点否。

这段代码是壳的开始

我们知道壳的原理是运行时解压缩,壳这段操作实际上是在对压缩的原始程序进行解压随,对一段数据进行操作难免会用到循环,循环就会往上跳转,所以我们遇到向上跳转的汇编指令直接跳过,直接结束循环而不是进入循环(跳过的意思是一瞬间执行完所有循环)

可以看到jb这条指令会向上跳转,我们单机下面的mov指令然后F4(运行到),同理遇到jmp,jz,jnz一旦往上跳转我么都F4,需要注意的是call指令我们也不进入而是直接跳过。原因是我们会进入call调用的那个函数,容易迷失。

upx以及很多壳的一个明显特征是结尾有个大跳转

跳转的这个位置25DDAC就是OEP了,然后进行dump,用到的工具是lordpe,首先右键一下当前进程,点击修复大小。

然后右键选择完整转存,保存文件。运行

哈哈哈,这是什么情况呢?我们需要修复一下IAT(import address table 导入地址表),要用到的工具是ImportREC,首先在importrec中选择未脱壳的进程(它的IAT是正确的),注意这里的OEP要改成OPE的相对偏移地址,也就是OD看到的地址减去基地址0x400000得到1DDAC,然后点击自动查找IAT,接着获取输入表,最后选择转储到文件,转储的文件选择之前dump出来的那个文件,这就是修复IAT的过程。

左边是脱壳之后的文件直接拖进od的结果,右边的是我们单步调试的带壳程序,并且脱完壳的程序是可以正常运行的,脱壳成功。

壳是脱完了,但是你是否有一个疑问,为什么要修复IAT?下面我们来了解一下

修复IAT

来自知乎大佬的一句总结 ”不论是压缩壳还是加密壳,在脱壳过程中都需要修复IAT,因为脱壳时会将内存中的数据转储 (dump)到本地,保存成文件,而IAT在文件中是一个RVA数组,在内存中是一个函数地址数组。我们需要将转储出来的文件中的IAT修复成RVA数组的形式,这样程序才算是恢复。“

这里接上之前学习PE的知识

IAT相当于一个进货清单,描述pe文件引用了哪些文件/函数。在脱壳过程中,由于壳的修改,原来的IAT表项已经是无效的,无法正确识别真正的外部函数或模块。

修复IAT步骤:

  • 识别IAT表项:根据(未脱壳)程序的结构和特征,识别出加壳程序中被修改的IAT表项。对应的操作是”自动查询”IAT“
  • 构建正确的IAT:根据原始的可执行文件,构建正确的IAT表项,使其能正确指向外部函数或模块。对应“获取IAT”
  • 更新IAT表项:将构建好的IAT表项写入到程序中,覆盖原来呜嗷的表项,实现修复。对应“转储到文件”

OEP

什么是OEP呢,就是函数真正的入口。

下面我们多了解以下OEP的特征,毕竟如果不认识OEP的话,就算我们脱下了壳,也不知道自己成功了。直接偷懒截大佬们的文章了

1
OEP:(Original Entry Point),程序的原始入口点。

VS特点:CALL和JMP,CALL进去之后调用的API是相同的

Delphi特点:

1
2
3
4
push ebp
mov ebp,esp
add esp,-0x10
mov eax,xxx

QT特点:

本篇文章是拿最简单的壳开刀的,但是大致套路就是这样的,所谓万变不离其宗

参考链接:

各种程序的OEP入口特征汇总整理!专为小白总结! - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

【初学者教程】破解基础知识之认识壳与程序的特征 - 『脱壳破解讨论求助区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

使用x64dbg脱壳之开源壳upx - 知乎 (zhihu.com)

[原创]脱壳步骤,修复IAT的原因及修复IAT的完整步骤-加壳脱壳-看雪-安全社区|安全招聘|kanxue.com