最近在学PE结构,遇到了个比较有意思的实验,学过PE结构的都知道因为文件对齐FileAlignment和区块对齐SectionAlignment的缘故,在磁盘中的PE文件的块与块表 块与块之间有许多的空白间隙,这些间隙以0为填充,在文件执行中这些空白是没有意义的,所以我们就可以利用这段空白插入我们想执行的一些代码。

演示程序 经典扫雷
演示dll user32.dll.MessageBoxW
演示所用工具 X64dbg,PEGAME,010Editor
演示目标 实现修改程序使其弹出一个MessageBox消息对话框

步骤

  • 查看硬编码
  • 查看所引用的DLL在程序中的VA地址
  • 插入硬编码
  • 修改程序入口AddressOfEntryPoint

查看硬编码

这里用user32.dll中的MessageBoxW函数为例,MessageBoxA也可以,无非一个是宽字节版一个是单字节版,可以在VC中调用此接口然后调试查看反汇编代码。
获取硬编码如下

PUSH 6A 00
CALL E8 00 00 00 00
JMP  E9 00 00 00 00

PUSH 指令通常用于在函数调时传递参数,会在函数调用时将参数压如栈中
CALL 通常用来调用函数 后面的00 00 00 00为跳转步长
JMP 无条件跳转指令 使用该指令无条件跳转到我们想要的指令处

查看所引用的DLL在程序中的VA地址

注意该程序必须导入了user32.dll这个动态链接库,否者将不会又MessageBox这个函数接口,也就无法找到该函数地址
将演示程序加载进动态调试工具X64dbg,Ctrl+G定位到该程序中MessageBox的函数,

获取该VA地址为76AB1E50

插入硬编码

将演示程序加载入十六进制编辑工具,选择一个空白区段,我这里选的是第一个区块和第二个区块之间的空白区段
我们若想插入MessageBox函数必须用PUSH指令先传递所需参数,CALL指令调用,JMP指令再回到原本程序正常执行处,即AddrressOfEntryPoint处。
查阅WIN32API 可知MessageBox的四个参数都可为0

CALL 指令调用,因此我们需要计算下CALL指令的步长,有两种方法
步长=要跳转的目的地址-当前指令地址-指令长度
步长=要跳转的目的地址-当前指令的下一条指令地址
我们采用第一个公式
在上面我们已经得到了MessageBoxW的地址即要跳转的目的地址为76AB1E50
当前指令的地址即CALL指令E8的地址为40A8
但要注意的是76AB1E50为VA即虚拟地址,40A8为文件偏移地址Fileoffset,因此需要将40A8转化为虚拟地址。
这里可以手算,因为插入硬编码的地址在区块中,所以计算公式为

VA=Fileoffset-ImageBase-(所在区块.VirtualAddress-所在区块.PointerToRawData)

也可以借助带有地址转换工具的PE结构查看器,如LordPE,我这里用我自己写的PE结构查看工具,感兴趣的话可以移步至【逆向工程】QT编写PE结构分析工具

查看到其VA地址为1004AA8
E8 00 00 00 00指令长度为五字节
则步长=76AB1E50-1004AA8-5=75AA D3A3
因为PE文件是小端存储所以 应该插入A3 D3 AA 75

我们调用完MessageBoxW后还需要让程序正常执行,因此还要JMP指令跳转到程序入口处,通过PE查询工具可以看到程序入口,这里还是使用我自己编写的PE结构查询工具查看。

则JMP指令步长=1003E21-1004AAD-5=FFFF F36F
同样的小端存储格式 E9 6D F3 FF FF

修改程序入口AddressOfEntryPoint

操作完如上步骤后,程序并不会执行我们的代码,因此还需要修改程序的入口地址为我们插入代码的地址,这里直接用十六进制编辑工具修改,这里填入的数字应该是RVA地址


插入的代码只能在本机上运行,还算不上是ShellCode。
白菜信安网

【逆向工程】在PE结构空白区段插入代码相关推荐

  1. PE结构-空白区手动添加任意代码(附实例代码)

    PE之添加任意代码到空白区 预备知识 1.查找本机MessageBoxA地址 1.打开OD调试工具拖入要添加的exe程序. 2.在命令中输入 : (输入后按下回车键) 3.点击断点页面即可看到Mess ...

  2. PE结构学习(4)_节的操作

    节的操作 若要对PE文件填充自己的代码,然后发现字节空间不足,这时候就需要对节表进行操作 此处主要讲节的三种操作,分别为扩大节.新增节.合并节 扩大节 简介 对文件的节表进行扩大,为了方便操作,只需对 ...

  3. PE结构22.3.2

    PE结构 https://blog.csdn.net/qq_39654127/article/details/97905901 1.可执行文件(executable file)指的是可以有操作系统进行 ...

  4. 21. PE结构-PE各个结构的基本概念

    exe与dll几乎没什么区别,唯一区别就是一个字段标识出这个文件是exe还是dll 32位叫PE32,64位叫PE32+ PE主要定义在winnt.h vc搜索:image format,定义PE结构 ...

  5. 【PE结构】由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)...

    0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...

  6. 手写PE结构解析工具

    PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如 ...

  7. 滴水三期:day41.2-PE阶段所有代码汇总(PE文件分析器基本C代码)

    一.代码汇总 1.功能如下 打印PE头字段 打印节表 将文件读入到FileBuffer,FileBuffer到ImageBuffer到newBuffer,最后存盘 RVA转FOA.FOA转RVA 向代 ...

  8. PE结构延迟加载导入表

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

  9. PE结构绑定导入实现

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

最新文章

  1. 宁彦吉:如何进行作业的评审?
  2. C++设计模式实现--策略(Strategy)模式
  3. 响应式 媒体查询 盒模型
  4. 大话移动通信pdf_移动通信是怎么实现的?
  5. 美国在理论计算机科学的研究重视,清华麻省理工香港中文联建理论计算机科学研究中心...
  6. 环信SDK 踩坑记webIM篇(三)
  7. python登录界面实现密码在明文与星号间切换_两个API让星号密码框显示成明文
  8. centos7添加用户并授权root权限
  9. 三桥君:如何把SQL Server的数据库导为sql文件
  10. matlab 平滑曲线连接_兔学 | MATLAB由离散数据点绘制曲线图像
  11. 基础快读(新手入门)(C++实现)
  12. java门基础学习(五)
  13. 手写BundleAdjustment(尽量仅使用eigen库)
  14. 中国新鲜杏子行业市场供需与战略研究报告
  15. 中e管家理财小方法让闲钱变成活钱
  16. java http put请求方式_HttpClient HTTP PUT请求方法示例
  17. 第二型曲面积分的定义
  18. Python itertools accumulate函数详解
  19. 镜头跑焦测试软件,简易的测试镜头跑焦和矫正AF微调办法
  20. 问题 A: xiaoping学构造函数

热门文章

  1. 基于DCT的图像数字水印算法
  2. RNA-seq流程报告
  3. APP机型兼容测试的手机选择
  4. 怎么把苹果手机通讯录导入华为手机_怎么恢复手机通讯录?最完整手机通讯录恢复方法大公开...
  5. 边缘计算的下一场革命:1+12?
  6. 注册跨境电商需要多少钱?还需要办理哪些事项?
  7. 计算机组装原则与注意事项,计算机安装流程和注意事项
  8. origin处理多组红外数据_【图文】用Origin作多组红外数据图
  9. OpenCV开发笔记(六十七):红胖子8分钟带你深入了解特征点暴力匹配(图文并茂+浅显易懂+程序源码)
  10. itextpdf对PDF文件进行签名