脱壳——UPX脱壳原理(脱壳helloworld)
脱壳——UPX脱壳原理

脱壳步骤
1 找到OEP
2 dump(导出)内存文件
3 修复
1 找到OEP
1 程序运行先从壳代码运行,壳代码执行完之后会跳转到真正的OEP,也就是是说第一步,首先要找到真正的OEP
如何找到OEP
大部分情况下,壳代码会在一个单独的区段里面,壳代码执行完一定会跳转到原来的.text段去执行,跳转之后的地址就是这个程序原始的OEP
根据OEP特征码来判断是否是原始的OEP
不同程序、不同版本编译器编译出来的程序OEP各不相同,但是大致有共同的特点:
例如:
vc6.0的OEP处的第一个API调用是GetVersion
VS2013是GetSystemTimeAsFileTime
Delphi是GetModuleHandleA
2 dump内存文件
就是把得到的新的源文件给它保存下来,可以采用从头到最后一个区段的手动复制下来,也可以用工具
3 修复
对于手动扒拉下来的内存文件,肯定还有一些问题,这里需要对PE文件进行修复
第一次脱壳
加壳程序下载链接:
https://download.csdn.net/download/weixin_43916597/18353951?spm=1001.2014.3001.5503
使用到的软件:
Peid:(吾爱破解上可以下载)
查看程序信息
首先先查看程序的信息,先了解敌人:
采用PEID来查看程序的信息:
将程序拖进PEID后:

这里很明显是一个UPX加壳后的程序,采用的是UPX壳代码
连接器版本6.0 也就是vc6.0的
开始脱壳
1 找到OEP
首先采用od加载exe

这里跟之前我们想的加壳是一样的,就是先pushad,然后再处理自己想处理的,最后popad,再跳转回到真正的OEP里面
pushad
• //壳代码
• popad
• jmp xxxx
但是这里没有popad,所以需要找一下popad,在pushad执行完之后,esp指向的是栈顶的位置,popad的话会让esp移动,所以可以直接给esp打一个断点

这里来一个esp断点,也可以通过别的,比如在command中访问到esp的地址,然后选择,来一个硬件断点

需要注意的是在esp往上两个来一个硬件访问的dword断点才行
然后把这个程序跑起来,就会停在我们打的断点这里了

这里的话是停在了这里,这里恰好有一个popad(注:硬件访问是在这个断点运行了之后再停下来)
这里popad完之后就可以寻找jmp指令了,但是如何判断这个jmp是不是真正的jmp到oep呢

可以看到这里的jmp跳转到了非常远的距离,那么到底是不是跳转到真正的OEP呢?

点击od的m这个按钮来查看PE文件的各种属性

431B7C肯定是在这个区段里面的从这里跳转到了402680也就是上一个区段,这里就可以知道了,这里其实是跳转到了第一个区段也是加壳最常用的.text区段
然后跟入跳转到402680

可以看到这里的第一个api确实是GetVersion,所以这里肯定就是真正的OEP了
2 dump(导出)内存文件
需要再刚进入OEP的第一条指令就dump出来,因为不知道后面的代码逻辑是什么,万一有什么修改呢
od中可以直接调用OllyDump脱壳调试进程
手动dump:利用M按钮里面的PE文件加载情况,将主程序.exe文件的内存文件一点一点复制粘贴出来
利用010Editor创建一个hex文本类型文件

然后从od 的m按钮里面一块一块的复制文件过来
首先处理PE头

双击进入,然后修改为16进制类型

对整个内容进行二进制复制
然后再到010Editor中采用Ctrl+shift+v复制,不要采用Ctrl+v复制,这样才能直接复制16进制的内容进去
然后就是UPX0和UPX1还有.rsrc三个字段也复制进去
最后保存下来,随便一个文件然后以.exe结尾就好
3 修复
dump出来的exe文件不能使用的,因为还有一些PE文件的内容没有修复,这个时候再用010Editor来加载dump出来的pe文件进行修复

它里面就会有一些PE的提示
需要修改的信息:
区段头信息
导入表
修复区段头

这里里面很多区段头的信息都没有,因为这里应该是PE文件来处理的,但是我们是dump复制出来的,所以这里我们需要自己添加没有的信息
Name不用改
Misc表示未对齐的真实内存中的大小也不用改
VirtualAddress内存中的一个rva也不用改
SizeOfRawData文件中的对齐大小这个由于我们是从加载到内存中再Dump出来的,所以文件和内存已经没有必要区分开了,直接和Msic值一样就好
PointerToRawData表示foa,这里也直接用rva就好了
后面的可以不用处理
这样把三个区段头都修改好
修复好了三个区段头后,可以很清楚得看到程序的变化

图标回来了!虽然这个时候还无法运行
修复导入表

上面修复了PE文件的区段头,但是由于导入表没有修复还是无法使用,这里用LordPE查看该exe的导入表就可以看到dll的导入表是错的
正常的导入表是通过操作系统对字符串来处理然后得到该字符串的函数名称对应的函数地址变成地址给exe使用
但是这里由于我们是把exedump出来了,所以就是把操作系统变成的函数地址给弄了出来,而不是函数名称字符串,所以这里还需要修复,把地址修复改成函数名称
手动修复导入表:从od里面把原来的导入表地址函数名称全部提出来,然后再在dump出来的exe里面开辟一个字段来存储导入表,再把PE文件里面的导入表指向指到开辟的导入表里面就好了
在硬编码里面,有几种对于call函数的编码,但是如果编码的开始是FF15 xxx的就表明是对导入表里面的函数调用

这里可以很明显的看出来
然后再进入到FF15的call的地址里面查看

可以很明显得看到各种各种的导入表函数,拿到之后再按照前面的方式添加进去就好了
根据导入表的性质来修复
这里采用一个工具来处理
https://down.52pojie.cn/Tools/PEtools/ImportREConstructor%201.7e.zip 解压密码:www.52pojie.cn

添加进程,修改OEP和大小,然后获取导入表,同时还需要进入OD用刚刚的办法查看是否把所有的dll都包含了,这里是确实只有两个dll,如果没有可以尝试修改大小来处理

然后使用转存到我们刚刚弄的.exe文件就好了,正常的话下面会出现一个保存成功
这次再查看导入表

就是很正常的了
再查看它的区段

可以看到多了个区段,和我们前面想的一样手动添加了一个区段来专门修复导入表.
总结 UPX脱壳
首先采取找到OEP,然后呢对整个PE文件进行dump出来,然后再修复,修复需要修复PE的区段头和导入表
脱壳——UPX脱壳原理(脱壳helloworld)的更多相关文章
- android脱壳之DexExtractor原理分析[zhuan]
http://www.cnblogs.com/jiaoxiake/p/6818786.html内容如下 导语: 上一篇我们分析android脱壳使用对dvmDexFileOpenPartial下断点的 ...
- android脱壳之DexExtractor原理分析
导语: 上一篇我们分析android脱壳使用对dvmDexFileOpenPartial下断点的原理,使用这种方法脱壳的有2个缺点: 1. 需要动态调试 2. 对抗反调试方案 为了提高工作效率, ...
- android 脱壳 之 dvmDexFileOpenPartial断点脱壳原理分析
android 脱壳 之 dvmDexFileOpenPartial断点脱壳原理分析 导语: 笔者主要研究方向是网络通信协议的加密解密, 对应用程序加固脱壳技术很少研究, 脱壳壳经历更是经历少之甚少. ...
- LoardPe与Import REC X64dbg脚本 脱壳 Upx
目录 LoardPe与Import REC X64dbg脚本 脱壳 Upx 一丶X64dbg调试器与脚本 1.1 起因 1.2 脚本的调试 1.3 Upx脱壳脚本 二丶LoardPe 内存Dump与I ...
- 脱壳第一讲,手工脱壳ASPack2.12的壳.ESP定律
脱壳第一讲,手工脱壳ASPack2.12的壳.ESP定律 一丶什么是ESP定律 首先我们要明白什么是壳.壳的作用就是加密PE的. 而ESP定律就是壳在加密之前,肯定会保存所有寄存器环境,而出来的时候, ...
- 脱壳第二讲,手动脱壳PECompact 2.x
脱壳第二讲,手动脱壳PECompact 2.x PS: 此博客涉及到PE格式.所以观看此博客你要熟悉PE格式 首先,逆向inc2l这个工具,汇编中可能会用的 inc头文件转换为lib的工具 但是他有壳 ...
- [.NET] [.net 脱壳工具]Sixxpack 最新脱壳机 通杀Sixxpack全版本by -=Msdn5 君临=
[.net 脱壳工具]Sixxpack 最新脱壳机 通杀Sixxpack全版本by -=Msdn5 君临=- 识别方法: 如果无法调戏,请上传附件艾特我.............发帖不易啊..身处大西 ...
- 脱壳脚本_手脱壳ASProtect 2.1x SKE -> Alexey Solodovnikov
脱壳ASProtect 2.1x SKE -> Alexey Solodovnikov 用脚本.截图 1:查壳 2:od载入 3:用脚本然后打开脚本文件Aspr2.XX_unpacker_v1. ...
- 手工脱壳之AsPack压缩脱壳-随机基址
一.工具及壳介绍二.脱壳1.ESP定律脱壳2.单步跟踪脱壳3.基址重定位的修复 一.工具及壳介绍 使用工具:Ollydbg.PEID.ImportREC.LoadPE.010 Editor 查看待脱壳 ...
随机推荐
- 如何将IHttpHandler和IHttpModule迁移到ASP.NET Core中间件
ASP.NET Core是一个跨平台.开源的框架,用于在Windows.Mac和Linux操作系统(OS)上开发web应用程序.你可以使用以下任何IDE开发ASP.NET Core 应用程序: Vis ...
- Python 过滤字母和数字
[前言]在写爬虫时,正则表达式有时候比较难写,一个是自己不熟练,二者数据分析提取数据千奇百怪. 一.好在python有个re模块,提供了很多更加简便的方法:可参考此文档:https://www.cnb ...
- 后端程序员之路 58、go wlog
daviddengcn/go-colortext: Change the color of console text.https://github.com/daviddengcn/go-colorte ...
- Java数组:多维数组(二维),Arrays类,冒泡排序
Arrays类数组工具类:java.util.ArraysArrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而"不用"使用对象来调用 具有 ...
- Asa's Chess Problem
一.题目 给定一张 \(n\times n\) 的矩阵,每个点上面有黑棋或者是白棋,给定 \(\frac{n\times n}{2}\) 对可以交换的位置,每对位置一定在同一行 \(/\) 同一列.\ ...
- 「UOJ 514」通用测评号(生成函数)
首先,题目中的过程可以看作:每次选择任意一个燃料仓,给它装填 \(1\) 单位的燃料,如果此时恰好 "填满" 了它,就给答案 \(+1\). 考虑 \(n\) 号燃料仓填满的概率, ...
- 2019 GDUT Rating Contest III : Problem D. Lemonade Line
题面: D. Lemonade Line Input file: standard input Output file: standard output Time limit: 1 second Memo ...
- win8 下删除服务
1.右键 我的电脑-管理-服务和应用程序-服务,找到想要删除的服务,双击后复制服务名称. 2.管理员身份运行cmd 在命令框中输入 sc delete "secbizsrv" 就删 ...
- CSS篇-样式表、选择器、权重、伪类
CSS定义 CSS:Cascading Style Sheet(层叠样式表) // 写法 选择器 { 属性名: 属性值; } CSS样式表 (1)三种样式表使用 // 内联样式 <div sty ...
- 常用开发库 - 告別BeanUtils拷贝,MapStruct工具库最全详解
常用开发库 - MapStruct工具库详解 MapStruct是一款非常实用Java工具,主要用于解决对象之间的拷贝问题,比如PO/DTO/VO/QueryParam之间的转换问题.区别于BeanU ...