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

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

时间:2025-01-12 阅读:
特战英豪官网版

特战英豪官网版

  • 类型:射击空战
  • 大小:61.82MB
  • 语言:中文版
  • 版本:v1.0.0

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

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,然后保存修改另存文件。然后就可以运行了

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

有什么武侠卡牌手游(武侠卡牌类) 蜀门手游百花仙灵怎么加点(蜀门手游百花灵石怎么搭配) TP钱包基础知识:OKExChain测试使用教程(OKEx) kishu币值得长期持有吗_kishu币5年后会涨到多少 在全球欧易OK交易所排名第几? 梦幻西游多少级能保住点卡钱(梦幻69单开每天赚50块) 第五人格小女孩天赋加点(第五人格小女孩天赋加点攻略) 柴犬币在中国怎么买?国内SHIB购买教程图解 魔兽世界巨龙之魂副本入口在哪(魔兽世界巨龙之魂怎么刷) 梦幻西游红孩儿副本奖励是什么(梦幻西游红孩儿副本迭代) 云顶之弈金鳞龙装备能重铸么(金龙鳞姿态) 三国志幻想大陆前期怎么提升战力(三国志幻想大陆如何快速提升战力) WAZIRX是正规交易所吗?靠谱吗? 比特币和黄金的对比 比特币和黄金的区别是什么? HNS币在哪里买?HNS币交易所盘点 问道手游鬼卒哪个好(问道手游鬼卒可以进化鬼仙) 阴阳师神乐疾风自动给哪个目标(阴阳师神乐自动技能顺序) 以太坊智能合约是什么?以太坊的智能合约有什么用 宝可梦传说阿尔宙斯多的宝可梦怎么处理(阿尔宙斯抓捕几率) 我的世界裤子可以附魔什么(我的世界裤子附魔什么属性最好) 阴阳师判官钟情于谁(阴阳师判官钟情于谁?) BitWell交易所怎么样?BitWell交易所安全靠谱吗? YAG是什么币种?YAG币官网总量和发行价介绍 简书怎么恢复误删的文章 简书恢复误删文章的步骤 和平精英炸死队友有哪些惩罚(和平精英故意炸死队友的惩罚) 王者荣耀限定皮肤一般卖几天(王者荣耀限定皮肤还会再卖吗) 王者荣耀召唤师技能有哪些(王者荣耀里面的召唤师技能详解) 火币网合约交易最少需要多少钱? 宝可梦传说阿尔宙斯黏丸怎么制作(精灵宝可梦 阿尔宙斯) 骑士精神2怎么换职业(骑士精神2 bug) gta5佩岛抢完12次会怎样(gta5佩岛最大收益) 我的世界神奇宝贝大师球怎么获得(我的世界神奇宝贝大师球获得方式) 跨链桥是什么意思?一文读懂什么是跨链桥 黑色沙漠手游黑珍珠怎么获得(黑色沙漠珍珠先买什么) 王者荣耀干将莫邪S26怎么出装(2020王者荣耀干将莫邪怎么玩) dnf辅助装备90级能升级吗(地下城90级辅助装备) 魔兽世界黑暗神殿项链怎么拿(wow黑暗神殿掉落) 如何导出 ETH 钱包 imToken钱包使用教程 艾尔登法环哪里存档(艾尔登法环xbox) 国外电影网站有哪些?看国外电影用哪个app最全 洛克王国玄武什么时候出现(洛克王国玄武值得练吗) 王者荣耀账号注销后怎么重新注册(王者荣耀账号注销之后怎么重新注册) SPS币发行价多少?SPS币发行价格和发行时间介绍 和平精英龙息弹怎么获得(和平精英龙息炮怎么开启) 角色扮演类多人游戏哪一款良心(角色扮演的游戏推荐) 16g运行内存设置多少虚拟内存?电脑虚拟内存设置方法 梦幻诛仙手游最实用化生技巧分享(梦幻诛仙怎么化生) 王者荣耀如何跳过刷脸只填写身份证(王者荣耀怎么能跳过刷脸) 什么手游好玩不花钱人多(什么手游不太花钱) DNF充满爱慕的信有什么作用(dnf2021充满爱慕的信) 现在最火爆的手游排行榜(现在最火爆的手游排行榜2023年) 创造与魔法拔丝苹果派怎么做(创造与魔法薄苹果派) 碧蓝航线兵装强化石怎么获得(碧蓝航线兵装吃阵营buff吗) 冰原守卫者各地图详解及攻略(冰原守卫者wiki) 安币交易所是什么?安币交易所官网入口 金铲铲之战蛮王主C阵容怎么玩 蛮王主C阵容攻略 牛盾是什么交易所?NewtonXchange/牛盾交易所全面介绍 有哪些经典人气高的武侠手游(2020年武侠手游排行榜前十名) 梦幻新诛仙神兽进阶需要什么(梦幻新诛仙神兽进阶什么时候出) ZKS币怎么买?ZKS币买入交易操作教程 人类一败涂地攻略(全关卡图文通关攻略详解) 哪一款免费的修仙游戏好玩(有没有免费修仙游戏) 如何查询虚拟货币交易所的持仓数据?加密货币交易所资产结构安全性分析 区块链UPP币怎么样?UPP币前景及价值深度分析 如何在币安购买狗狗币?币安买狗狗币操作流程教程 okex交易手续费怎么算?okex怎么交易数字货币? 抹茶交易所中国用户还可以用吗?抹茶不支持中国怎么交易怎么办 Chia奇亚多机集群挖矿教程 钱包安全知识:钱包助记词忘记备份/备份丢失怎么办? 英雄联盟大师可以双排吗2022(英雄联盟大师只能单排吗) 某度网盘下载速度慢怎么办(度盘下载速度太慢) 只狼跨越死斗之后获得什么(只狼 影逝二度跨越死斗) 区块链游戏有什么优势?区块链游戏发展前景 PancakeSwap怎么用?PancakeSwap挖矿教程小白篇 宝可梦阿尔宙斯传说席多蓝恩怎么抓(神奇宝贝席多蓝恩进化) 战国明日香武将战力提升之资源篇详解 资源篇介绍 DX币怎么买?DX币买入和交易教程图解 cf不同区可以一起玩吗(cf不同区可以一起玩吗苹果) DNF圣域之痕一天能获得多少(圣域多久刷一次) 币安数字交易平台靠谱吗?币安交易所简介 RAI是什么币种?RAI币未来前景及价值深度分析 csgo皮肤一局掉多少磨损(csgo一整套皮肤) 宝可梦传说阿尔宙斯桃发在哪里(阿尔宙斯用法) 求生之路怎么联机(网吧求生之路2怎么联机) 我的世界国际版十字准星怎么开(我的世界国际版怎么开十字键瞄准) USDT负溢价是什么意思?一文读懂泰达币/USDT负溢价 赚钱app是真的么?赚钱app游戏真实有效安全 csgo怎么设置最流畅(csgo怎么设置最流畅最舒服) 手机挖以太坊用什么软件?手机上最火3个挖矿软件 王者荣耀共享wifi有几台是什么意思(王者荣耀共享wifi有几台是什么意思呀) WING是什么币种?WING币未来前景如何? 手游收入最多的游戏是什么 ?2023年1月手游收入榜单前十 和平精英看别人战绩会被发现吗(和平精英看别人的战绩会留下痕迹吗) Chia奇亚挖矿减半计划是什么? 只有qq号怎么查对方王者荣耀信息(只知道qq号怎么查王者荣耀战绩) 和平精英送皮肤必须满72小时吗(和平精英送皮肤必须三天以上好友吗) 有什么放置类手游玩的人多(哪款放置类游戏好玩) LSEX是什么交易所?LSEX雷神交易所怎么样? chia怎么使用?chia接入矿池图文教程 比特币强制平仓是不是全亏了?造成强制平仓的行为有哪些

热门文章

推荐专题

更多>>

游戏推荐

更多>>