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表修复和重定位表修复)相关推荐

  1. 操作系统是如何使用重定位表的

    一.重定位表的结构 重定位表是数据目录中第6项,它的结构如图示: 重定位表由多个块(block)组成,每个块内部由三部分组成--VirtualAddress.SizeOfBlock 和若干个2字节偏移 ...

  2. PE结构基址重定位表

    PE体系 PE结构&整体叙述 PE结构&导入表 PE结构&导出表 PE结构&基址重定位表 PE结构&绑定导入实现 PE结构&延迟加载导入表 重定位表定位 ...

  3. Windows PE第6章 栈与重定位表

    第六章 栈与重定位表 本章主要介绍栈和代码重定位.站和重定位表两者并没有必然的联系,但都和代码有关.栈描述的是代码运行过程中,操作系统为调度程序之间相互调用关系,或临时存放操作数而设置的一种数据结构. ...

  4. 写一个PE的壳_Part 2:ASLR+修复输入表(IAT)+重定位表支持(.reloc)

    系列汇总 写一个PE的壳_Part 1:加载PE文件到内存 写一个PE的壳_Part 2:ASLR+修复输入表(IAT)+重定位表支持(.reloc) 写一个PE的壳_Part 3:Section里实 ...

  5. PE学习(六)第六章 栈与重定位表 实例栈溢出、模拟加载器加载DLL、遍历重定位表

    第六章 栈与重定位表 16bit OS 存在长调用 lcall push cs,ip    相应的iret pop ip, cs  而call/ret only focus ip register 3 ...

  6. PE格式第七讲,重定位表

    PE格式第七讲,重定位表 作者:IBinary 出处:http://www.cnblogs.com/iBinary/ 版权所有,欢迎保留原文链接进行转载:) 一丶何为重定位(注意,不是重定位表格) 首 ...

  7. exe文件解析_PE文件格式之重定位表

    一.重定向表的作用: 这个在网上有很多种解释,那我也说一下自己对这个表的解释,程序运行的时候一般有两种方式来调用函数就是OD的那个CALL,一个是基址+偏移,另一种就是写死的函数地址比如 CALL 0 ...

  8. 滴水逆向三期实践15:重定位表修正

    我们知道,重定位表是由于在代码中写入的绝对地址,而 DLL 不能按照设想的 ImageBase 作起始加载位置去了别的地方占坑,那么需要根据重定位表记录的这些绝对地址在内存中的位置(RVA),逐一去到 ...

  9. PE文件-手工修改重定位表-WinHex-CFF Explorer

    文章目录 1.CFF Explorer 2.计算添加后的重定位大小 3.作者答疑 1.CFF Explorer   如果需要修改exe,dll等的二进制代码,遇到添加绝对地址时,需要将绝对地址的位置添 ...

  10. 移动重定位表到新增节

    一.为什么要移动重定位表 数据目录中的表是分散在各个节里的,如果对节进行加密,操作系统找不到表,就无法加载程序.因此加密前要先把表移动到新的节里. 二.怎么移动 计算重定位表的大小,首先要遍历重定位表 ...

最新文章

  1. Labview 串口通信之——PC控制云台方向
  2. 高德经纬度距离计算php,计算两个经纬度之间的距离 单位(m)
  3. 对用2遍dfs求有向图强连通分量的理解
  4. Android--获取当前系统时间
  5. 用c++自制词法分析器_编译原理笔记 02 词法分析
  6. The requested profile “pom.xml“ could not be activated because it does not e
  7. Apache简单配置(5)搭建phpcms2007网站+phpBB-3.0论坛
  8. 智能陈桥五笔输入法 for linux,陈桥五笔输入法官方下载
  9. 意畅科技:亲近用户 升级服务 谋就网络安全行业市场 | 企业服务代理商系列谈...
  10. 测试手机是否可以安装MRP软件和MRP游戏
  11. 行政地名、行政区划名、地名分类(矢量数据)
  12. Ant、 Maven 、 Gradle—Java构建工具比较
  13. 移动端网站优化需要具备哪些条件
  14. Specification for the Lab VIEW Measurement File
  15. 12306自动抢票软件
  16. Online Judge系统大全
  17. CSS 实现面包屑导航
  18. 读《消失的真实》有感
  19. 通配符SSL证书购买建议
  20. web服务器、Web中间件和Web容器的区别

热门文章

  1. c2c网上商店管理与推广
  2. php在线解密,zend在线解密
  3. excel文件修复工具_免费的PDF转Word软件有哪些?各种文件格式转换工具推荐
  4. 计算机视觉前沿技术探索
  5. 新能源汽车行业资讯-2022-9-19
  6. 厦门电子地图,厦门市地图,厦门地图查询,公交线路查询地图
  7. Render to Disk
  8. 软件工程导论01-概论
  9. ember new报错No matching version found for @ember-data/model@^3.11.2的解决方案
  10. 九种流行木马的发现和清除