手机版
扫描查看手机站
首页 > 文章 > 软件教程 > 正文

exe脱壳是什么意思?exe脱壳教程步骤详解(附带工具包)

时间:2025-03-14 07:51:19来源:525游

这里整合了一下之前自己学习软件手工脱壳的一些笔记和脱文,希望能给新学软件逆向和脱壳的童鞋们一点帮助。

1 一些概念

1.1 加壳

加壳的全称应该是可执行程序资源压缩,是保护文件的常用手段。加壳过的程序可以直接运行,但是不能查看源代码。要经过脱壳才可以查看源代码。

加壳是利用特殊的算法,对EXE、DLL文件里的资源进行压缩、加密。类似WINZIP 的效果,只不过这个压缩之后的文件,可以独立运行,解压过程完全隐蔽,都在内存中完成。它们附加在原程序上通过Windows加载器载入内存后,先于原始程序执行,得到控制权,执行过程中对原始程序进行解密、还原,还原完成后再把控制权交还给原始程序,执行原来的代码部分。加上外壳后,原始程序代码在磁盘文件中一般是以加密后的形式存在的,只在执行时在内存中还原,这样就可以比较有效地防止破解者对程序文件的非法修改,同时也可以防止程序被静态反编译。

壳的类型通常分为压缩壳和加密壳两类。压缩壳的特点是减小软件体积大小,加密保护不是重点。加密壳种类比较多,不同的壳侧重点不同,一些壳单纯保护程序,另一些壳提供额外的功能,如提供注册机制、使用次数、时间限制等。

1.2 OEP

OEP:(Original Entry Point),程序的入口点。软件加壳一般隐藏了程序真实的OEP(或者用了假的OEP), 我们需要寻找程序真正的OEP,才可以完成脱壳。

一般加壳程序在使用Ollydbg等动态调试工具时,会停在壳的预处理块。即处在对于程序原始代码块的解压或解密操作之前,在运行完程序自脱壳模块后,会停留在程序加壳之前的OEP位置,此时是dump程序的最佳时期。脱壳时在真实OEP处下int3断点,就可以捕捉到程序代码段完全恢复的状态。因此,寻找加壳程序的正确OEP,也成了手动脱壳时的第一要务。

1.3 IAT

IAT:(Import Address Table),导入地址表。由于导入函数就是被程序调用但其执行代码又不在程序中的函数,这些函数的代码位于一个或者多个DLL中。当PE文件被装入内存的时候,Windows装载器才将DLL 装入,并将调用导入函数的指令和函数实际所处的地址联系起来(动态连接),这操作就需要导入表完成。其中导入地址表就指示函数实际地址。多数加壳软件在运行时会重建导入地址表,因此获取加壳程序正确的导入地址表也是手动脱壳操作中的一个关键问题。

2 一些脱壳方法

2.1单步跟踪法

单步跟踪法的原理就是通过Ollydbg的单步(F8)、单步进入(F7)和运行到(F4)功能,完整走过程序的自脱壳过程,跳过一些循环恢复代码的片段,并用单步进入确保程序不会略过OEP。这样可以在软件自动脱壳模块运行完毕后,到达OEP,并dump程序。

2.2 ESP定律法

ESP定律法是脱壳的利器,是应用频率最高的脱壳方法之一。

ESP定律的原理在于程序中堆栈平衡的合理利用。由于在程序自解密或者自解压过程中,不少壳会先将当前寄存器内容压栈,如使用pushad,在解压结束后,会将之前的寄存器值出栈,如使用popad。因此在寄存器出栈时,往往程序代码被自动恢复,此时硬件断点触发。然后在程序当前位置,只需要少许单步跟踪,就很容易到达正确的OEP位置。

2.3内存镜像法(二次断点法)

内存镜像法是在加壳程序被加载时,通过OD的ALT+M快捷键,进入到程序虚拟内存区段。然后通过加两次内存一次性断点,到达程序正确OEP的位置。

内存镜像法的原理在于对于程序资源段和代码段下断点,一般程序自解压或者自解密时,会首先访问资源段获取所需资源,然后在自动脱壳完成后,转回程序代码段。这时候下内存一次性断点,程序就会停在OEP处。

2.4一步到达OEP

所谓的一步到达OEP的脱壳方法,是根据所脱壳的特征,寻找其距离OEP最近的一处汇编指令,然后下int3断点,在程序走到OEP的时候dump程序。如一些压缩壳往往popad指令距离OEP或者Magic Jump特别近,因此使用Ollydbg的搜索功能,可以搜索壳的特征汇编代码,达到一步断点到达OEP的效果。

2.5最后一次异常法

最后一次异常法的原理是,程序在自解压或自解密过程中,可能会触发无数次的异常。如果能定位到最后一次程序异常的位置,可能就会很接近自动脱壳完成位置。现在最后一次异常法脱壳可以利用Ollydbg的异常计数器插件,先记录异常数目,然后重新载入,自动停在最后一次异常处。

2.6 模拟跟踪法

模拟跟踪法的原理就是使用Ollydbg下条件断点,SFX相当于是一个自解压段,在自解压段结束时(eip的值转到代码段时),已经距离OEP很近,但是这种跟踪方法会比较耗时。

2.7 “SFX”法

“SFX”法利用了Ollydbg自带的OEP寻找功能,可以选择直接让程序停在OD找到的OEP处,此时自解压已经完成,可以直接dump程序。

3一些脱壳实践

下面给出整理的使用以上方法,自己尝试手动脱这几种常用壳的脱壳笔记。

3.1UPX脱壳笔记

首先进行侦壳:

逆向基础:软件手动脱壳技术入门

 

首先把程序扔到OllyIce里面可以看到:

逆向基础:软件手动脱壳技术入门

 

然后这里尝试使用ESP定理:即在ESP第一次改变时,对ESP的地址设置硬件字访问断点,这样可以在代码被UPX算法还原之后,跳转到程序的正常入口处。

逆向基础:软件手动脱壳技术入门

 

然后F5运行,并没有直接到跳转到程序入口处的大跳位置,但是可以看到UPX的大跳就在眼前:

逆向基础:软件手动脱壳技术入门

 

所以被还原后的程序入口点就是0x00445151(通过单步往下走,F4略过往回走的循环语句,也可以看到这个大跳的位置。)接下来走到大跳位置,跳到正常程序入口处:

逆向基础:软件手动脱壳技术入门

 

然后去掉硬件断点,并使用LoadPE的dump功能dump目标程序:

逆向基础:软件手动脱壳技术入门

 

先修正映像大小,然后再选择完整脱壳,这样可以得到第一步dump的程序,然后再使用ImportREC修复dump程序的OEP,OEP的信息通过OD自带的dump功能查询或者直接填45151:

逆向基础:软件手动脱壳技术入门

 

将正确的入口地址填入ImportREC中,然后自动搜索IAT信息:

逆向基础:软件手动脱壳技术入门

 

然后点击获取输入表得到修正IAT之后的程序函数输入表,然后再点击显示无效函数,愉快地发现没有无效函数,那么就可以直接修复转存文件了。

逆向基础:软件手动脱壳技术入门

 

选择刚刚第一步dump下来的转储文件进行修复,修复完成之后脱壳完成:

逆向基础:软件手动脱壳技术入门

 

这里对于压缩壳UPX,直接使用了ESP定律,可以很方便找到OEP并dump程序。

4.2 tElock脱壳笔记

这里脱的是一个tElock的壳:

逆向基础:软件手动脱壳技术入门

 

1、先使用最简单的最后一次异常法:首先把程序扔到OllyIce里面设置OD调试选项中的异常选项,

逆向基础:软件手动脱壳技术入门

 

仅保留内存非法访问异常,然后使用异常计数器插件,在使用前要清空断点设置:

逆向基础:软件手动脱壳技术入门

 

等到程序正常运行后,重新加载程序,再选择第二步,停在最后一次异常之前:

逆向基础:软件手动脱壳技术入门

 

然后用Alt+M转到内存窗口,对主程序code段下内存断点,SHIFT+F9执行:

逆向基础:软件手动脱壳技术入门

 

这样程序就中断在了正确的OEP处,可以选择从模块中删除分析以显示正常分析的汇编代码。然后使用LoadPE dump程序,并修正程序映像大小。但是在使用ImportREC v1.6F Fix版,输入正确的OEP,获取函数输入表信息时,会发现无效的指针。使用方法一修复后,再使用方法三可以完全修复

逆向基础:软件手动脱壳技术入门

 

再点击Fix dump,可以修复之前dump下来的程序,脱壳完成:

逆向基础:软件手动脱壳技术入门

 

2、使用二次内存断点法:首先载入程序,将所有的异常类型忽略,然后在idata段设置内存断点, 然后SHIFT+F9:

逆向基础:软件手动脱壳技术入门

 

停下来后再次在code段设置内存断点,再次SHIFT+F9执行,可以直接达到正确的OEP中:

逆向基础:软件手动脱壳技术入门

 

然后LoadPE dump,然后修复IAT。修复方法同方法1。

3、寻找magic jump以及修复函数表完成后dump程序:前两步还是加内存断点(idata、code),然后定位到程序的正确OEP处

逆向基础:软件手动脱壳技术入门

 

然后如果这时使用LoadPE dump后修复,就和前两种一样了。这里先是使用ImportREC获取函数输入表第一个位置的指针地址。

逆向基础:软件手动脱壳技术入门

 

然后得到函数指针偏移地址在0x005512C,加上基地址后为0x045512C,这时在该位置下硬件访问双字断点。再重新SHIFT+F9忽略异常执行后,由于下了断点,会触发tElock的CRC校验错误:

逆向基础:软件手动脱壳技术入门

 

所以这里要先绕过CRC校验,才能成功执行到硬件断点位置,所以首先暂停程序,然后使用Alt+F9返回用户代码。点击确定按钮后,程序暂停在调用ExitProcess的位置:

逆向基础:软件手动脱壳技术入门

 

现在要向上找一找能跳过这个退出的跳转(CRC判断跳转),然后进行修改并跳过:

逆向基础:软件手动脱壳技术入门

 

找到了应该修改的位置,但是如果修改之后重新运行是会被恢复的,所以先记下来这个跳转的地址,0x00469622。重新运行之后,在idata断设置内存断点,SHIFT+F9停下后,再Ctrl+G找到修改点再修改。修改完之后再设置之前的硬件断点,这样不会触发CRC校验错误了。

无数次的SHIFT+F9之后,在寄存器窗口可以看到指针以及能够正常显示:

逆向基础:软件手动脱壳技术入门

 

然后此时F8单步,找magic jump……看小生大大的视屏是通过分析疑似CRC跳转得到magic jump的位置:

逆向基础:软件手动脱壳技术入门

 

这里记下来magic jump的地址是0x0046973B,然后清空udd文件,删除硬件断点,再次重新运行程序,然后在idata下内存断点停住,然后Ctrl+G找到magic jump位置处,修改跳转:

逆向基础:软件手动脱壳技术入门

 

然后在code段下内存断点:

逆向基础:软件手动脱壳技术入门

 

然后SHIFT+F9执行,停下来就到了OEP的位置:

逆向基础:软件手动脱壳技术入门

 

这时候再dump程序,IAT表已经被修复,可以直接获得脱壳版程序:

逆向基础:软件手动脱壳技术入门

 

这里尝试使用了另外两种脱壳方法,并且通过预先找OEP的方式,修复了CRC校验后,直接dump到了IAT被修复了的程序。

3.3 PEncrypt脱壳笔记

逆向基础:软件手动脱壳技术入门

 

先把程序扔到OllyIce里面,然后程序停在这里,看起来蛮怪的:

逆向基础:软件手动脱壳技术入门

 

好吧,重新加载程序,尝试使用最后一次异常法,不忽略所有异常,然后使用异常计数器插件,程序停在最后一次异常处:

逆向基础:软件手动脱壳技术入门

 

如果此时F8单步下去,程序会触发异常处理,然后又到不了OEP了。这时需要看一下堆栈数据情况:

逆向基础:软件手动脱壳技术入门

 

这时需要在0040CCD7处F2下断点,然后SHIFT+F9执行,可以跳过这个坑:

逆向基础:软件手动脱壳技术入门

 

然后接下来就是F8+F4的操作,一路直到OEP:

逆向基础:软件手动脱壳技术入门

 

用LoadPE脱壳,然后用ImportREC修复后,虽然没有无效指针,但是还是不能运行:

逆向基础:软件手动脱壳技术入门

 

这时候用LoadPE的重建PE功能:

逆向基础:软件手动脱壳技术入门

 


逆向基础:软件手动脱壳技术入门

 

然后就可以正常运行了:

逆向基础:软件手动脱壳技术入门

 

这个壳使用了单步跟踪的脱壳方法,一路跳过程序“陷阱”,最后达到OEP。并且使用了LoadPE的重建PE功能,对程序进行了重建,最终完成了这个加密壳的脱壳全过程。

3.4 FSG变形壳脱壳笔记

首先进行侦壳:

逆向基础:软件手动脱壳技术入门

 

使用ESP定律,首先把程序扔到OllyIce里面,F8单步走,观察ESP变化,在ESP第一次发生变化时,对ESP对应的地址处设置内存硬件访问WORD断点,然后SHIFT+F9运行,在程序停下来之后,取消硬件断点,进行F8单步:

逆向基础:软件手动脱壳技术入门

 

用F4略过向后的跳转(循环),然后继续往下找,一直到这里:

逆向基础:软件手动脱壳技术入门

 

在这个jmp下面F4,程序会跑飞。说明程序代码在这个循环中就已经释放完毕,所以向上找找这个循环中有没有带条件的大跳。这样很容易找到magic jump的位置,然后我们Enter或者Ctrl+G到00402666的位置,发现果然是OEP,重新分析,然后F2下断点,让程序走到OEP:

逆向基础:软件手动脱壳技术入门

 

如果是FSG1.33,直接使用LoadPE dump文件,然后使用ImportREC修复,就可以正常脱壳了。但是这里在使用ImportREC修复时,会出现一个无效指针:

逆向基础:软件手动脱壳技术入门

 

这里直接剪掉(或者删掉)这个指针,然后修复转存文件,发现无法正常打开:

![在这里插入图片描述](https://img-blog.csdnimg.cn/6b2cb9beb0804eb4a47bcb665cebf62f.png?x-oss- process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Luj56CB54as5aSc5pWy,size_12,color_FFFFFF,t_70,g_se,x_16)

然后再把修复后的程序,丢到OllyIce中F9直接运行:

逆向基础:软件手动脱壳技术入门

 

这里是变形壳添加的一个暗桩,会导致程序出现异常退出,这里直接nop掉或者把之前的jle(校验)改成jmp,然后保存修改另存文件。然后就可以运行了

逆向基础:软件手动脱壳技术入门

WBTC是什么币?WBTC币全面介绍 冰原守卫者管家有着什么作用(冰原守卫者好玩吗) 问道手游神兽哪个好(问道手游神兽哪个实用) 挖矿的算力有什么用?影响算力的因素有哪些? 据说是史上最好玩的5款赛车游戏(十大最好玩的赛车游戏) 三国志战略版曹操厉害么(三国志战略版曹操玩法思路) 时空猎人翅膀外观怎么升级(时空猎人翅膀怎么获得) 网易我的世界怎么切换账号(网易我的世界怎么切换账号登陆) 比特币缩量上涨说明什么?比特币缩量上涨和下跌解读 比特币大佬看衰狗狗币是真的吗?狗狗币创始人早卖光 欧交易所是OK网易欧交易所吗?欧交易所app官网登录地址入口 有什么回合制网游耐玩不氪金(哪些回合制游戏不氪金) 手游诛仙技能怎么设置(诛仙手游技能方案切换) 币安币(BNB)怎么买?币安币买入交易操作步骤教程 btc是什么币_BTC是什么币中文名 哈希函数是什么意思?哈希函数应用在区块链的哪些地方? 哪一款rpg手游近期玩的人多(现在什么rpg游戏玩的人多) 宝可梦传说阿尔宙斯奋斗值怎么加(宝可梦阿尔宙斯专属技能) 虚拟币交易所平台有哪些?中国十大数字货币交易所排行榜 召唤与合成2积木怎么合成(召唤与合成解谜2) 2022上半年十部好片排名(2020年上半年十大好片) atoken钱包安卓怎么下载?AToken钱包余额怎么提现? QTUM量子链怎么挖矿?量子链挖矿app最新下载 比特派钱包使用教程:如何提取云钱包中的BTM 梦幻西游九转金丹怎么获得(梦幻九转金丹怎么得到) 暴走英雄坛上吊后保留什么(暴走英雄坛上吊保留什么物品) 重返帝国魏兰怎么培养(重返帝国手游玩法) 西游卡牌游戏有什么推荐(西游卡牌类) WenX是什么交易所?WenX交易所是哪个国家的? 王者荣耀典藏皮肤多久出一个(王者荣耀典藏皮肤多久出一个2020) HOT是什么币种?HOT币值得投资吗? 第五人格:调整后宿伞之魂强度如何(第五人格宿伞之魂太强了) 王者荣耀铭文自定义怎么更换(王者荣耀铭文自定义怎么更换属性) 比特币做多好还是做空好?比特币如何做多做空? 区块链扫盲:闪电网络应用开发速成指南 dnf装备找回要多久(dnf装备找回要多久才能完成) 欧易策略交易操作指南—进阶策略 魔兽世界怀旧服真银矿石在哪里(魔兽世界真银矿石哪里最多) 传奇不充钱玩得下去吗?什么传奇手游能赚钱提现? 洛克王国黑炎怎么获得(洛克王国黑炎技能搭配) 无聊猿游艇俱乐部是什么?无聊猿游艇俱乐部怎么样? ACH币发行价多少?ACH币发行时间及发行价格介绍 王者荣耀为什么没人玩嫦娥s27(王者嫦娥怎么没有了) 假如有一天steam无法再连接(steam无法连接怎么办) Imtoken钱包怎么提现人民币?怎样做才更加安全呢? 和平精英粉色猫爪鞋是哪个套装(和平精英粉色的猫耳服) 诛仙手游金币怎么交易(诛仙手游金币交易人工审核) 特朗普币官方网站是多少?特朗普币官方购买入口教程 魔兽世界锦绣谷传送门在哪里(魔兽 锦绣谷) 蜀门手游任务每天几点重置(蜀门手游日常活动几点重置) PEPE币值得长期持有吗?PEPE币2025会涨多少倍价格预测 笔记本电脑无线上网的方法?笔记本怎么实现无线上网功能 Tezos(XTZ)是什么币?Tezos(XTZ)基本概念介绍 在币安交易所购买稳定币BUSD操作步骤教程 lol手游蕾欧娜皮肤哪个好(英雄联盟手游蕾欧娜皮肤哪个手感好) Filecoin节点如何配置才能避免不掉算力? 明日之后茶叶怎么获得(明日之后茶具怎么用) Bityard是什么交易所?Bityard交易所手续费介绍 和平精英云游戏是什么(和平精英云游戏和正常有啥区别) 币在交易所安全吗?币在交易所怎么样? 欧易OKXWeb3钱包使用教程 IPFS挖矿怎么挖?IPFS挖矿靠谱吗?IPFS挖矿收益有哪些? 方舟镰刀龙怎么加点厉害(方舟镰刀龙怎么加点?) 比特币当周/次周/当季/次季合约是什么意思?一文读懂比特币合约类型 csgo胸章可以在战绩栏显示吗(csgo胸章装备上就不能卖了么) 梦幻西游手游超级金柳露和金柳露有区别吗(梦幻西游手游金柳露多少钱) OK交易所怎么样?OK交易所真的安全靠谱吗? MANA币是哪个国家的?MANA币怎么样? Gate.io苹果版本最新版本v1.0功能介绍,Gate.io苹果版本下载安装 我的世界药水怎么酿造(我的世界药水酿造大全) 艾达币ADA币是什么币?ADA币升值潜力分析 疯狂骑士团堆什么属性(疯狂骑士团堆什么属性0) 宝可梦传说阿尔宙斯皮宝宝在哪抓(《宝可梦》阿尔宙斯) BitWell交易所怎么样?BitWell交易所安全靠谱吗? 欧易卖币能直接交易吗?欧易okx交易所卖币立即就能卖出吗? 魔兽世界怀旧服沙塔尔声望怎么刷(tbc怀旧服沙塔尔声望怎么刷) 魔兽世界乌鸦之神的低语怎么做(乌鸦之神的低语怎么上去) OK如何买柴犬币?OKEX欧易交易所购买SHIB教程 BNB销毁是什么意思?一文读懂币安币BNB销毁机制 第五人格千面成就标签怎么获得(第五人格成就标签千金之阶) 精灵宝可梦可以退化吗(小智最稀有的3只精灵) 魔兽世界黑曜夜之翼怎么获得(黑曜夜之翼绝版了?) 第五人格前锋天赋图怎样加点图(第五人格前锋最新加点) JustSwap交易所是全球第二大交易所吗?JustSwap交易所排名 法币账户和现货账户的区别是什么? 泰达币怎么换成人民币?泰达币USDT可以兑换人民币吗? 和平精英小团团语音怎么设置(和平精英小团团视频) 宝可梦传说阿尔宙斯神兽怎么抓(阿尔宙斯在哪捉) 我的世界为什么没有声音(我的世界为什么没有声音 没有声音解决方法) 币印矿池新手如何配置矿机?币印矿池配置矿机教程 和平精英受伤了怎么用不了急救包(和平精英为什么受伤绷带不能使用) 合约是如何操作的?合约交易操作教程图解 稳定币是什么,和法定数字货币有啥关系? win10电脑C盘满了怎么清理?win10清理c盘垃圾的cmd命令 和平精英年龄限制是多少(和平精英的年龄限制是多少) 三国志幻想大陆鲁肃最强阵容推荐(三国志幻想大陆鲁肃阵容搭配) 狗狗币价格最高的时候是多少钱?狗狗币背景介绍 挖矿产业链(矿机,矿池,矿场,矿工)是什么?矿机,矿池,矿场,矿工概念 苹果13是双卡双待手机吗?(官方表明已支持) 冰原守卫者声望图文教程(冰原守卫者手游攻略)

热门文章

推荐专题

更多>>

游戏推荐

更多>>