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

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

时间:2024-03-19 阅读:
特战英豪官网版

特战英豪官网版

  • 类型:射击空战
  • 大小: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,然后保存修改另存文件。然后就可以运行了

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

宝可梦阿尔宙斯石板有什么用(阿尔宙斯石板的作用) 三国志幻想大陆铭文攻略(三国志幻想大陆符文) ABBC是什么币种?ABBC币究竟怎么样? 诛仙手游孤剑曦月强不强(新诛仙手游孤剑曦月怎么获得) 冰原守卫者中的钢镐怎么制作(冰原守卫者怎么玩) dnf如何解除安全模式(dnf解除安全模式发短信号码) 和平精英如何全部退款(和平精英如何全部退款给队友) 泰拉瑞亚打boss顺序是什么(泰拉瑞亚 打boss的顺序) 王者荣耀回归奖励要多少天(王者荣耀回归奖励要多少天领) 阴阳师现世符咒怎么获得(阴阳师现世符咒怎么获取) 有没有不费流量的手机网游推荐(有没有不费流量的游戏) 火币网杠杆什么鬼?火币杠杆怎么玩?火币杠杆倍数调整方法 什么游戏盒子能够免费玩罪恶都市(哪个游戏盒子有罪恶都市) 火焰纹章封印之剑哪些人值得培养?全人物初始属性分析 coinegg官网我的怎么打不开了?coinegg官网在线登录最新地址 牛盾是什么交易所?NewtonXchange/牛盾交易所全面介绍 消逝的光芒2市中心保险箱密码是多少(消逝的光芒2主线攻略) 比特币怎么获得?一文读懂比特币获得方法 宝可梦传说阿尔宙斯奋斗石怎么获得(阿尔宙斯努力值刷什么) 名将之弈怎么备战(名将之弈阵容) UMI交易所怎么样?U米交易所安全靠谱吗? PAXG是什么币种?PAXG币详细介绍 有什么比较好玩的网游推荐(有哪些比较好玩的网游) 区块链的核心概念是什么? 比特币期货ETF是什么意思?一文读懂比特币期货ETF 以太经典ETC买入和交易教程,以太经典怎么买? 硬件钱包Ledger Nano S介绍及安装使用教程 龙网交易平台怎么样?费率多少? 魔兽世界达克萨隆要塞在哪(净化达克萨隆) 王者荣耀全国大赛怎么参加(王者荣耀全国大赛怎么参加团队赛) 和平精英红茶怎么制作(和平精英怎么做红茶) 三国志战略版手游怎么玩(三国志战略版这么玩) 欧易狗狗币怎么买入和交易?OKEX买狗狗币教程 云顶之弈光明哨兵怎么合成(云顶之弈光明哨兵如何合成) 币安NFT平台是什么?一文玩转币安NFT平台 比特币可以做空吗?做空比特币的五种方法(合约/期权/期货)介绍 江南百景图猫窝怎么获得(江南百景图绝美小猫放哪里) 洛克王国圣光迪莫怎么超进化(洛克王国圣光迪莫超进化皇家) 公共服务概念币有哪些?盘点公共服务板块项目代币 诛仙手游神木枝隐藏任务怎么做(诛仙神木枝隐藏任务怎么获得) 以太经典ETC上涨原因是什么? 王者荣耀姜子牙S26怎么出装(王者荣耀姜子牙最强出装2020) 什么是Chia(奇亚)?chia挖矿详细教程Windows版 钱包助记词是什么意思?钱包助记词的作用 好玩的3d修仙类网游有哪些(大型3d修仙网游) 冰原守卫者最后的俄勒兰地图掉落有什么(冰原守卫者游戏视频) 消逝的光芒2生存者还是治安者好(消逝的光芒2刷幸存者等级) 王者荣耀QQ区怎么改性别女(王者荣耀qq区如何修改性别) 欧易卖币能直接交易吗?欧易okx交易所卖币立即就能卖出吗? 蜀门手游境界一共有多少(蜀门境界有哪些排序) 云顶之弈金鳞龙装备能重铸么(金龙鳞姿态) 投资数字货币怎样开户?投资数字货币用什么软件? 如何买比特币现金/BCH?比特币现金/BCH买卖教程 区块链NYE币是什么币种?一文了解NYE币 不到一年,市值从400万增长到15亿美金的WBTC是什么? 梦幻西游手游百宠仙池亏吗(梦幻西游手游百晓仙子任务) 云顶之弈s7龙神有哪些(云顶之弈龙战神) 王者荣耀全国大赛标志怎么显示出来(王者全国大赛有啥用) 诺亚之心苹果在哪里(诺亚之心下载方法) 我的世界怎么删除模组(我的世界怎么删除模组电脑版) imToken钱包2.0ETH钱包备份详细图片教程 火影忍者苹果和安卓可以一起玩吗(火影忍者苹果和安卓可以一起玩吗手游) 消逝的光芒怎么关闭麦克风(消逝的光芒 怎么开麦) 以太币哪个矿池收益高?以太坊矿池收益排行前十 数字货币期货怎么玩?一文玩转数字货币期货交易 优质好玩的网游游戏有哪些(有哪些好玩儿的网游) 简单分享几个实用的网络兼职(网络兼职什么比较好) 淘宝直播间怎么开通?详解开通淘宝直播的教程方法 新买电脑怎样装系统?没有u盘重装系统最简单的方法 创造与魔法莎草纸怎么获得(创造与魔法的沙子) FARM是什么币种?FARM币未来前景和价值全面分析 Solana钱包创建及新项目参与使用教程 第五人格 佛系会封号吗(第五人格佛系违规游戏吗) 创造与魔法虎皮鲨怎么得(创造与魔法虎皮鲨在哪里) 区块链TROY币怎么样?TROY币前景及价值深度分析 消逝的光芒2地铁站怎么进去(消逝的光芒2第一个任务火车站电杆怎么上) 英雄联盟暗黑元首连招是什么(lol老版本暗黑元首技能介绍) 问道手游木系平民如何加点(问道手游平民玩家木系怎么加点) 金铲铲之战安卓数据怎么转苹果(金铲铲之战安卓账号怎么转苹果) ff14陆行鸟怎么获得(ff14 陆行鸟怎么获得) 诛仙手游群攻最强的职业是哪个(诛仙手游队伍搭配) 我的世界附魔金苹果怎么做不了了(我的世界附魔金苹果有啥用) 和平精英粽子手雷怎么获得(和平精英粽子福袋) 创造与魔法中怎么获得青青猪(创造与魔法哪里刷青青猪几率大) 方舟镰刀龙怎么加点厉害(方舟镰刀龙怎么加点?) 有什么好玩的单机游戏(单机游戏大作排行榜) 第五人格灯火触发规律有哪些(第五人格灯火会重复吗) 暗黑破坏神3多少钱(暗黑破坏神3多少钱入合适) 魔兽世界wlk死寒披风怎么获得(死寒之拥) 王者荣耀妲己S26怎么出装(王者妲己出装怎么出装) 召唤与合成2积木怎么合成(召唤与合成解谜2) 我的世界工具匠的职业方块是什么(我的世界工具商的职业方块是什么) 通过欧易OKEX交易所参与指南 有哪些耐玩不花钱手游2023(2021年什么游戏好玩不花钱的) RAMP币怎么样?RAMP币前景及价值深度分析 冰原守卫者新手冬季生存图文教程(冰原守卫者怎么快速升级) 玛娜希斯回响自选角色哪个好(玛娜希斯的回想) 冰原守卫者经验本怎么更好完成(冰原守卫者攻略建设) csgo新手前20个箱子必出吗(csgo模拟开箱网) The Rock Trading交易所怎么样?The Rock Trading交易所全面介绍

热门文章

推荐专题

更多>>

游戏推荐

更多>>