脱壳——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 查看待脱壳 ...
随机推荐
- EF获取数据库表名和列名
EF获取数据库表名和列名 新建 模板 小书匠 /// <summary> /// 通过当前DBContext上下文获取对应数据库中所有得表 /// </summary> ...
- JavaScript疑难点
什么是闭包 我个人理解闭包就是函数中嵌套函数,但是嵌套的那个函数必须是返回值,才构成闭包: //标准的闭包 function fn(){ var i=1; return function fnn(){ ...
- css标题文字和下划线重叠
<view class="text"> <text class="textCon">标题</text> <text c ...
- HDOJ-1074(动态规划+状态压缩)
Doing Homework HDOJ-1074 1.本题主要用的是状态压缩的方法,将每种状态用二进制压缩表示 2.状态转移方程:dp[i|(1<<j)]=min(dp[i|(1<& ...
- java 入门环境搭建
Java帝国的诞生 1972年C诞生 1982年C++诞生 1995年JAVA诞生,为了实现真正的跨平台,在操作系统之上又加了抽象层,叫做JAVA的虚拟机,统称JVM 三高问题: 高可用 高性能 高并 ...
- 助力面试之ConcurrentHashMap面试灵魂拷问,你能扛多久
目录 前言 ConcurrentHashMap 原理 JDK1.8 版本 ConcurrentHashMap 做了什么改进 为什么 key 和 value 不允许为 null ConcurrentHa ...
- ZooKeeper 基本概念并介绍RPC中Netty和Zookeeper的使用
前言 ZooKeeper 是一个分布式协调服务,可用于服务发现,分布式锁,分布式领导选举,配置管理等.Zookeeper提供一个类似Linux文件系统的属性结构,每个节点可存储少量的内存文件,并提供每 ...
- STL之string容器
string string封装了char*,管理这个字符串,是一个char*型的容器. string的相关操作 头文件 #include<string> string构造函数 string ...
- WPF 基础 - 启动与退出及异常捕获
1. 若需要控制 exe 实例数量 bool ret; mutex = new System.Threading.Mutex(true, exename, out ret); if (!ret) { ...
- 痞子衡嵌入式:盘点国内车规级MCU厂商
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是国内车规级MCU厂商及其产品. 在汽车电子领域,MCU的应用非常广泛,大到车身控制与动力总成,小到雨刷车窗等控制单元,都离不开MCU的身 ...