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

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

时间:2025-07-04 05:13:50来源: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,然后保存修改另存文件。然后就可以运行了

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

放置类手游的可玩性在哪里(放置类手游的可玩性在哪里设置) cf多少级可以打排位2022(cf多少级能打排位) 光遇呼吸药剂可以恢复多少氧气(光遇心肺复苏) 永劫无间牌匾掉落怎么触发(永劫无间牌匾具体位置) 百度网盘不开通会员如何提高下载速度(百度云下载慢解决办法) 币安shib柴犬币怎么买?币安柴犬币怎么提现人民币? 和平精英爆炸猎弓怎么获得(和平精英爆炸头怎么弄) okex永续合约交割时间是什么时候? 传奇首区开服 176复古神途传奇手游体验 魔兽世界山脉之血怎么获得(tbc山脉之血) 数字货币流通量会不会影响币价?投资数字货币有前景吗? 手把手教你把币从交易所提到钱包 有啥不需要充钱的游戏(不需要充钱的手机游戏有哪些) 英雄联盟大师宗师王者怎么区分的(lol大师宗师哪个高) 王者荣耀新英雄海月怎么连招(海月30秒语音) DeversiFi交易所靠谱吗?DeversiFi究竟怎么样? 币安收购日本持牌加密货币交易所SEBC,正式进入日本市场 cf荣耀枪王如何升到枪王之王(cf枪王怎么到荣耀枪王) 2023热门的角色扮演游戏有哪些(好玩的角色扮演回合制类手游) 王者荣耀怎么给别的号充点券(怎么给别人王者号充点券) DX币怎么买?DX币买入和交易教程图解 冰原守卫者要塞最后一个boss怎么打(冰原守卫者战备背包) 重装系统的教程,超简单的u盘一键重装电脑系统 FTX交易平台怎么注册?国内用户FTX交易所注册教程图解 和平精英物资币怎么获得(和平精英物资币怎么获得不花钱) coinbase是什么意思?Coinbase上市将产生怎样的影响? 和平精英可以换微信绑定吗(和平精英可以换微信绑定吗安全吗) 星露谷物语冬季鱼王在哪里钓(星露谷物语冬季鱼王地点) 英雄联盟周免为什么还没更新(英雄联盟周免是随机的吗) 王者荣耀多少抽必得荣耀水晶 荣耀水晶多少抽必得(王者荣耀抽荣耀水晶多少钱必出) binance交易平台_binance交易平台下载 宝可梦传说阿尔宙斯精灵种族值是什么(阿尔宙斯精灵图鉴) 和平精英不朽星钻下一个段位是什么(和平精英中的不朽星钻等级别高不高) 玛娜希斯回响兑换码在哪用(玛娜希斯的回想) 比特币缩量横盘意味着什么?比特币横盘的特点 艾尔登法环龙戟怎么获得(艾尔登法环预售价格) B2BX是什么交易所?B2BX交易所安全吗? 比特币交易平台app官网版下载_比特币交易app官方版下载v6.1.20 使命召唤19多少钱(xbox使命召唤19多少钱) 三国志幻想大陆铭文攻略(三国志幻想大陆符文) cf信用分低于90怎么办(cf信用分低于320怎么提升) cf灵狐的约定怎么领vip(cf灵狐的约定怎么领体验卡) 幻塔艾达骑士怎么获得(幻塔a-03) 派币2025估计一个多少钱?Pi币未来走势价格预测 SHFT币在哪里买?SHFT币上线交易所盘点 qq怎么清理缓存和垃圾清理,QQ浏览器缓存数据清理方法 新手如何选择适合自己的炒币平台App?新手炒币入门详细教程 英雄联盟艾克S12怎么出装(lol艾克出装s11) 奥比岛手游隐藏成就会走路的维纳斯怎么做(奥比岛走秀换东西的地方在哪) imToken钱包怎么提现人民币?imToken钱包提现人民币教程 免费设计logo的国外网站有那些?10个国外logo设计网站推荐 数字货币钱包之ETC以太经典钱包使用教程 lowb怎么买?TP钱包买Lowb及挖矿指南 trx币是什么币?trx币前景和价值分析 我的世界羊如何繁殖(我的世界羊繁殖后的颜色) 和平精英的身法裤在哪里获得(和平精英身法裤如何获得) 诛仙手游九阳尺隐藏任务怎么触发(诛仙手游隐藏任务阴阳镜) 泰拉瑞亚生命果实怎么获得(泰拉瑞亚生命果实在哪里) 欧易合约手续费怎么算的?欧易交易所合约手续费明细 宝可梦传说阿尔宙斯帕奇利兹怎么进化(宝可梦阿尔宙斯御三家进化) c盘的垃圾文件在哪个文件夹?如何清除电脑c盘的垃圾文件 狗狗币2017年的走势图,狗狗币近十年历年价格走势图 王者荣耀qq和微信哪个水平高(王者荣耀qq厉害还是微信厉害) BGB是哪个平台币?Bitget交易所BGB平台正规可靠吗分析 第五人格前锋加点推荐(第五人格前锋带什么天赋) Mysql数据库的几种安装方法(mysql数据库的几种安装方法是什么) 期货交易平台哪个最可靠?正规期货交易平台APP排行榜 创造与魔法交易的货币如何得到(创造与魔法里面的交易) 凉兮17岁怎么1000赚到1000万的?币圈网红凉兮现状 蜀门手游法宝融合规则(蜀门法宝融合加7的武器会掉么) 魔兽世界9.2低保机制是什么(魔兽世界9.0什么叫低保) gate.io交易平台官网地址,gate.io交易平台官方app下载手机版 第五人格狼人技能介绍(第五人格狼人模式规则) 雷达币彻底崩盘不能提现了吗?中央电视台揭秘雷达币骗局 饥荒齿轮怎么获得(饥荒齿轮怎么获得的) 欧交所虚拟币交易app下载安装,欧交易所app官网登录入口 我的世界图书管理员怎么生成(我的世界图书管理员生成条件) 和平精英王牌段位保护几次(和平精英王牌段位保护次数) 火币网怎么提现人民币?火币网提现人民币教程 问道手游力水和敏水哪个好(问道手游力敏水带什么法宝好) 新买的路由器怎么设置(新买路由器如何用手机安装和使用) 超级玛丽游戏中主角的职业是什么(超级玛丽游戏人物介绍) itBit是什么交易所?itBit交易所怎么样? BADGER是什么币种?BADGER币前景如何 绝地求生五周年渔夫帽怎么获得(绝地求生五周年皮肤) cfhd传奇级道具抽奖券怎么用(cf传奇奖励什么主武器) Bigone交易所无法打开怎么办?Bigone币格交易所官网入口 梦幻西游手游百宠仙池亏吗(梦幻西游手游百晓仙子任务) 原神古岩龙蜥旁边的密室怎么破解(古岩龙蜥右边的密室) 派币对接中国四大银行是真的吗?2025派币今天最新官方消息真实 gta5佩岛抢完12次会怎样(gta5佩岛最大收益) 2022年可以自由交易的手游有哪些(2021能自由交易的手游都有哪些?) 比特币最新价格 比特币BTC今日价格 USDT今日价格多少人民币?泰达币兑人民币今日价格行情 我的世界怎么免费获得钻石买模组(我的世界手游怎么免费获取买模组的钻石) imToken钱包快速入门 如何在imToken钱包使用cBridge跨链桥?cBridge资产跨链操作步骤教程 王者荣耀被认定为未成年怎么办(王者荣耀被认证为未成年会怎么样) 帽子币(tips)是什么币?tips币交易平台、总量和官网介绍 帝国战纪怎么获取羊皮(2021帝国战纪手游礼包兑换码)

热门文章

推荐专题

更多>>

游戏推荐

更多>>