史上最全最完整,最详细,软件保护技术-程序脱壳篇-逆向工程学习记录
title: 程序脱壳篇 date: {
{ date }} tags: [‘程序壳’,‘程序脱壳篇’] categories: [‘程序壳’,‘程序脱壳篇’] excerpt: 壳是最早出现的专用加密软件技术!程序的壳可以是开发者未来保护自己的代码不被借鉴、破解、逆向;也可用来病毒、木马、蠕虫隐藏恶意代码,不被杀毒如软件查杀!所以我们每次逆向破解的时候遇到带壳程序会非常头疼,这篇文章主要是有关程序脱壳的技术的讲解,内容详细,深入学习者一定不能错过,带你深入研究程序脱壳技术,一定有所收获!
声明
首先要感谢的是我在2022年为了进阶逆向工程学习这门技术的老师,是鱼C工作室的老师小甲鱼,先学会感恩,是为人处世的基本准则。这是我看了它的脱壳篇后的课后自己实践过一遍的笔记总结。 其次这篇文章我最早发布于我临时搭建的博客网站,随后发布现在才搭建的正式网站
最后,抄一百篇不如自己实践操作写一篇,尊重知识产权,写笔记辛苦,禁止转载!!!引用注明出处!!!写了几个月,因为都是实践过的,如今分享给大家学习,但是尊重劳动成果。 我是同一作者!
一· 什么是壳?
1 . 初步认识壳
历史:壳是最早出现的专用加密软件技术!
作用:可以是开发者未来保护自己的代码不被借鉴、破解、逆向;也可用来病毒、木马、蠕虫隐藏恶意代码,不被杀毒如软件查杀!
预习:vmp纯虚拟机壳,目前公认认为公认最强。
温馨提示:脱壳上瘾,可不要随意传播哦!
2 . 壳的执行过程
加壳压缩,壳先执行,还原源程序,执行源程序
3 . OEP(Original Entry Point)
1·EP(Entry Point)
EP(Entry Point),意即程序的入口点。而OEP是程序的原始入口点,一个正常的程序只有EP,
例如:C语言main函数、winAPI函数、VC编译的入口地址0x40000000
只有入口点被修改的程序(加壳等),才会拥有OEP。
2·OEP
OEP:(Original Entry Point),程序的原始入口点,软件加壳就是隐藏了EP, 只要我们找到程序的OEP,就可以立刻脱壳。
PUSHAD (压栈) 代表程序的入口点,POPAD (出栈) 代表程序的出口点,与PUSHAD相对应,一般找到这个OEP就在附近啦。
4 . 壳的装载过程
模拟windows加载器:
壳获取自己所需要使用的API地址、解压或解密源程序的各个区块、进行必要的重定位、跳转到程序原入口点(OPE)
5 . 压缩引擎
1·aPLib
aPLib
低于64kb的文件压缩速度较快
2·JCALG1
JCALG1
对大文件效果较好
3·LZMA
LZMA
使用目的:开源,稳定
特点:保证压缩比的情况下解压速度一定要快
6 . 壳的分类
1·压缩壳
ASPack
UPX
PECompact
2·加密壳
ASProtect
Armadillo
EXECryptor
Themida
VMProtect 缺点慢
二· 实践是检验真理的唯一标准
接下来我们尝试破解这样一个老程序壳:
1 . 查看壳
1·PEiD查看
2·Exeinfo PE查看
咳咳咳,咋就是说,这找不到这个程序壳的特征码,咋们看不出什么来,试试别的,是个老古董壳!
3·脱壳后的程序查看
可见它是由VC5.0编译的程序!
可见无壳!
2 . OD脱壳
用od把程序打开,刚进来情况是这样的:
刚进来的时候是要提示是壳的EP,如果不是,要在选项/调制选项/事件中设置第一次暂停于主模块入口:
点击OD里面的M查看进程内存:
试着分析对比,可见代码的入口地址是0x00401000,按C回到查看汇编代码,我们现在的入口地址是0x46B6DE,可见它在包含SFX的地址0x46B00000中。这壳有这三个区块(资源、SFX、重定向)。.text段就是程序的代码段块!
接下来单步执行F8,到jmp的时候跳转到地址0x004271B0:
来到这大概这个样子,右键分析/分分析代码:
再看进程内存,可知0x004271B0是在包含代码地址0x00401000中,所以它开头是55/8BEC,我们就找到了OEP
在OD的plugin文件夹中加入插件重新打开:
右键选择插件dump debugged process把程序dump出来
如下设置:
确保勾选Fix Raw Size是修复壳进行的数据偏移,不勾选Rebuil lmport输入表不进行重定位!
点击dump,保存文件命名dumo1,回到上面脱壳后的查看!
3 . 删除壳,减小程序大小
目前查看dump1.exe文件属性/大小:
打开软件lordPE,然后点击PE Editor按钮,选择dump1,对照弹出窗口里面显示的出数据和OD里的进程内存对比,然后点击Sections按钮,发现多余的壳区块,通通右键选择wipe section header, 如果是灰色的,那么请确保程序先不处于运行状态。后点击Save按钮保存OK。
最后点击Rebuild PE再选择dump1打开:
咋就知道,程序大小最后变成了原本91%!
此时再用OD打开就发现壳已经无了:
4 . 根据堆栈平衡原理寻找OEP
1·示例:zip压缩壳
实例:看文件名可猜测这是一个压缩壳