什么是壳
壳,分为压缩壳,保护壳,伪装壳(对抗杀毒软件)
这篇文章讲以下压缩壳,压缩壳可以有效减少程序的体积,同时由于压缩之后的代码比较难懂,所以也有一定的保护作用,最常见的就是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 | win+r |
如果成功则程序直接发生更改,如果出现红色的字体则说明没有脱壳成功。
手脱
手脱的工具需要
- 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 | push ebp |
QT特点:
本篇文章是拿最简单的壳开刀的,但是大致套路就是这样的,所谓万变不离其宗
参考链接:
各种程序的OEP入口特征汇总整理!专为小白总结! - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn
【初学者教程】破解基础知识之认识壳与程序的特征 - 『脱壳破解讨论求助区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn