用x32/x64dbg脱DLL壳(IAT表修复和重定位表修复)
exe脱壳
一直搜到的都是看雪论坛上用的lordPE和ImportREC进行脱壳和修复,感觉有点过时了.
记录一下x32/x64dbg的脱壳和IAT修复方法.
首先用esp定律等方法找到程序的入口点, 然后使用Scylla插件并填写其中的OEP地址.
然后用IAT Autosearch去找可能的IAT表,dump并fix pe文件即可.
DLL 脱壳
和exe脱壳不同, exe因为是第一个装载的模块,因此不需要进行重定位操作,它的base地址一定在0x400000. 但是DLL因为装载的冲突,会需要进行重定位,如果脱壳后重定位表缺失,重定位发生错误. 不过这个错误也不是一定会发生,万一DLL就装载到它原本预设的ImageBase处了,那么这时候没有reloc表也没有关系了(具体做法呢就是多重启几遍hh) .
当然这样重启很烦,所以DLL的脱壳会比exe多一步: 进行reloc表的修复.
基于《加密与解密》这本书的方法, 我们在壳代码中找到壳是怎么修复重定位表的.
首先看一下描述重定位表的结构体:
IMAGE_BASE_RELOCATION STRUCTVirtualAddress dd 0SizeOfBlock dd 0Type1 dw 0 ; Bit15~Bit12 为type , Bit11~Bit0为Itemoffset
IMAGE_RELOCATION ENDS
VirtualAddress 是用来决定地址的Bit15~Bit12(它的后12位都是0), 而Type1决定了 Bit11~Bit0.
假设我们的dll文件内的ImageBase是0x560000, 但是真实的装载地址在0x7f0000, 那么rebase时就按照ImageBase+VirtualAddress+Itemoffset + (0x7f0000-0x560000)来计算重定位后的地址. 重定位表事实上就是由IMAGE_BASE_RELOCATION 结构体数组组成的. 这些数组中的VirtualAddress 值依次递增.
在脱壳时可以在需要重定位的地址下硬件断点,找到壳代码还原重定位表的地方:
然后在这段代码往上翻翻,能找到重定位表和结构体中VirtualAddress的值.
因此在上面的两张图中下断点,每次hit的时候第一张图打印edi, 第二张图打印eax的值, 分别可以获得IMAGE_BASE_RELOCATION 结构体中的Itemoffset 和 VirtualAddress.
重复运行以后,可以在x32dbg的日志中获得类似如下结构的文本:
eax:1000
591B57
591BD7
591BE4
...
eax:2000
592E00
592E16
...
eax:3000
593E68
593E6C
然后就可以写个python脚本修复一下啦!
import math
def find_pe_header(dll:bytearray):return int.from_bytes(dll[0x3c:0x40],'little')
def find_base_reloction_tbl(dll,pe_header):if(int.from_bytes(dll[pe_header+0x14:pe_header+0x16],'little') == 0xe0): #PE32return pe_header+0xa0elif (int.from_bytes(dll[pe_header+0x14:pe_header+0x16],'little') == 0xf0): #PE32+return pe_header+0xb0else:raise RuntimeErrordef find_section_reloc_header(dll:bytearray):return dll.index(b'.reloc\x00\x00')with open('DllSample_dump_SCY.dll','rb') as f:dll = bytearray(f.read())# find pe_header
pe_header = find_pe_header(dll)#修改.reloc段中的PointertoLawData到文件最后我们新建的重定位表上
section_reloc_header = find_section_reloc_header(dll)
dll[section_reloc_header+20:section_reloc_header+24] = len(dll).to_bytes(4,'little')with open('reloc.txt','r') as f:data = f.read().split('\n')
base_relocation_map = {}
for x in data:if 'eax' in x:b = int(x[4:],16)base_relocation_map[b]=[]else:x = int(x,16)base_relocation_map[b].append(x&0x000fff|0x003000)
size = 0
for k,v in base_relocation_map.items():blocksize = math.ceil((8+len(v)*2)/4)*4 size += blocksizenew_reloc = k.to_bytes(4,'little')+blocksize.to_bytes(4,'little')for data in v:new_reloc += data.to_bytes(2,'little') new_reloc += b'\x00'*(blocksize-8-len(v)*2) #4字节对齐dll += new_reloc#file_alignment对齐
file_alignment = int.from_bytes(dll[pe_header+0x18+0x3c:pe_header+0x18+0x3c+4],'little')
dll += b'\x00'*(file_alignment-len(dll)%file_alignment)
# 修改重定位表大小
base_reloc_tbl = find_base_reloction_tbl(dll,pe_header)
dll[base_reloc_tbl+4:base_reloc_tbl+8] = size.to_bytes(4,'little')
# 修改SizeofRawData
dll[section_reloc_header+16:section_reloc_header+20] = (math.ceil(size/file_alignment)*file_alignment).to_bytes(4,'little') with open('DllSample.dll','wb') as f:f.write(dll)
用x32/x64dbg脱DLL壳(IAT表修复和重定位表修复)相关推荐
- 操作系统是如何使用重定位表的
一.重定位表的结构 重定位表是数据目录中第6项,它的结构如图示: 重定位表由多个块(block)组成,每个块内部由三部分组成--VirtualAddress.SizeOfBlock 和若干个2字节偏移 ...
- PE结构基址重定位表
PE体系 PE结构&整体叙述 PE结构&导入表 PE结构&导出表 PE结构&基址重定位表 PE结构&绑定导入实现 PE结构&延迟加载导入表 重定位表定位 ...
- Windows PE第6章 栈与重定位表
第六章 栈与重定位表 本章主要介绍栈和代码重定位.站和重定位表两者并没有必然的联系,但都和代码有关.栈描述的是代码运行过程中,操作系统为调度程序之间相互调用关系,或临时存放操作数而设置的一种数据结构. ...
- 写一个PE的壳_Part 2:ASLR+修复输入表(IAT)+重定位表支持(.reloc)
系列汇总 写一个PE的壳_Part 1:加载PE文件到内存 写一个PE的壳_Part 2:ASLR+修复输入表(IAT)+重定位表支持(.reloc) 写一个PE的壳_Part 3:Section里实 ...
- PE学习(六)第六章 栈与重定位表 实例栈溢出、模拟加载器加载DLL、遍历重定位表
第六章 栈与重定位表 16bit OS 存在长调用 lcall push cs,ip 相应的iret pop ip, cs 而call/ret only focus ip register 3 ...
- PE格式第七讲,重定位表
PE格式第七讲,重定位表 作者:IBinary 出处:http://www.cnblogs.com/iBinary/ 版权所有,欢迎保留原文链接进行转载:) 一丶何为重定位(注意,不是重定位表格) 首 ...
- exe文件解析_PE文件格式之重定位表
一.重定向表的作用: 这个在网上有很多种解释,那我也说一下自己对这个表的解释,程序运行的时候一般有两种方式来调用函数就是OD的那个CALL,一个是基址+偏移,另一种就是写死的函数地址比如 CALL 0 ...
- 滴水逆向三期实践15:重定位表修正
我们知道,重定位表是由于在代码中写入的绝对地址,而 DLL 不能按照设想的 ImageBase 作起始加载位置去了别的地方占坑,那么需要根据重定位表记录的这些绝对地址在内存中的位置(RVA),逐一去到 ...
- PE文件-手工修改重定位表-WinHex-CFF Explorer
文章目录 1.CFF Explorer 2.计算添加后的重定位大小 3.作者答疑 1.CFF Explorer 如果需要修改exe,dll等的二进制代码,遇到添加绝对地址时,需要将绝对地址的位置添 ...
- 移动重定位表到新增节
一.为什么要移动重定位表 数据目录中的表是分散在各个节里的,如果对节进行加密,操作系统找不到表,就无法加载程序.因此加密前要先把表移动到新的节里. 二.怎么移动 计算重定位表的大小,首先要遍历重定位表 ...
最新文章
- Labview 串口通信之——PC控制云台方向
- 高德经纬度距离计算php,计算两个经纬度之间的距离 单位(m)
- 对用2遍dfs求有向图强连通分量的理解
- Android--获取当前系统时间
- 用c++自制词法分析器_编译原理笔记 02 词法分析
- The requested profile “pom.xml“ could not be activated because it does not e
- Apache简单配置(5)搭建phpcms2007网站+phpBB-3.0论坛
- 智能陈桥五笔输入法 for linux,陈桥五笔输入法官方下载
- 意畅科技:亲近用户 升级服务 谋就网络安全行业市场 | 企业服务代理商系列谈...
- 测试手机是否可以安装MRP软件和MRP游戏
- 行政地名、行政区划名、地名分类(矢量数据)
- Ant、 Maven 、 Gradle—Java构建工具比较
- 移动端网站优化需要具备哪些条件
- Specification for the Lab VIEW Measurement File
- 12306自动抢票软件
- Online Judge系统大全
- CSS 实现面包屑导航
- 读《消失的真实》有感
- 通配符SSL证书购买建议
- web服务器、Web中间件和Web容器的区别
热门文章
- c2c网上商店管理与推广
- php在线解密,zend在线解密
- excel文件修复工具_免费的PDF转Word软件有哪些?各种文件格式转换工具推荐
- 计算机视觉前沿技术探索
- 新能源汽车行业资讯-2022-9-19
- 厦门电子地图,厦门市地图,厦门地图查询,公交线路查询地图
- Render to Disk
- 软件工程导论01-概论
- ember new报错No matching version found for @ember-data/model@^3.11.2的解决方案
- 九种流行木马的发现和清除