PE文件硬编码代码注入

news2024/11/16 3:22:01

以下适合有PE基础的人看,最起码要知道PE的基本结构和rva以及foa之间如何相互转换,不然会看的迷迷糊糊

先决条件

首先我们需要准备一个程序,待会将代码注入这个程序中
随便编写一个简单的程序,将随机基址给关闭
在这里插入图片描述

硬编码

程序编译完成之后就是一堆二进制的数据,如果我们想将代码注入到这个程序中,我们也只能以二进制的形式进行注入,不能像编码高级语言一样,比如我们想将 MessageBoxA(0, 0, 0, 0) 这段代码注入进去,要求是在程序运行时首先运行这段代码,然后再跳转到之前的代码逻辑
我们想将这段代码注入进去的话就只能将这段代码翻译成二进制的形式,然后再到这个exe的某一处地方将这段代码写进去。
那么我们就有必要来了解一下硬编码,首先我们来看看一个程序是如何调用一个函数的,主要关注两个地方,调用函数用到的指令是什么?指令的参数是什么?
我们来看看下面这段代码是如何调用的
在这里插入图片描述
将代码转到反汇编的模式下
在这里插入图片描述

可以看到 调用函数使用的是 E8 指令后面紧跟着 EC F4 FF FF 这是一个地址,可是这个地址并不是真正的函数地址,真正的函数地址是 2415D2(ps 其实这也不是真正的函数地址,这个地址一般情况下指向一个jmp的地址再由jmp地址跳转到真正的函数)

既然根据E8后面的这个地址可以找到真正的函数入口,那么就证明这个地址一定跟函数的地址有着某种联系,他们之前肯定有一个换算的关系,公式如下

E8后面跟着的地址 = 函数的地址 - E8下一行执行的地址

由于 E8指令的长度是5(E8加上4个字节地址)公式又能变形成如下

E8后面跟着的地址 = 函数的地址 - (E8的地址 + 5)

照着上面的地址换算一下

test函数的地址是 2415D2
E8的地址是 002420E1
那么E8后面跟着的地址就是 2415D2 - (002420E1 + 5)= FFFF F4EC
算的时候一定要选择 DWORD类型,因为我们是32位程序,每个地址只占4个字节
在这里插入图片描述
调用函数搞定了,但是调用完我们注入进去的代码后我们要回到之前的代码逻辑,不然的话就会影响程序的正常运行
想要回到程序之前的代码逻辑我们使用 jmp指令硬编码为 E9
E9指令和E8一样后面也是跟着一个地址,且这个地址也要进行换算,换算的规则和E8的换算规则一摸一样

代码注入

搞定了硬编码之后我们就要进行代码注入了
那么代码注入到哪里呢?这里为了方便就直接注入到 .text.段,这里大家都应该明白为什么要注入到 .text段,因为一个正常编译出来的程序默认的代码段就是 .text 当然我们学过PE之后,我们也可以把代码注入到其他段,只需要将这个段的属性改为可执行即可,或者干脆自己新增一个段,然后将代码写入到自己新增的这个段里,我们要注入哪个段就将哪个段的属性该为可执行即可 .text默认就有可执行权限了,所以我们注入到这个段不需要进行任何更改

下面我将使用 010Editor来进行手动的代码注入

首先我们打开要注入的程序
然后找到 .rdata这个段,之后向上滑动
![在这里插入图片描述](https://img-blog.csdnimg.cn/f959aed07bf049589cc976f641e35be5.png在这里插入图片描述
向上滑动后我们就能快速的找到 .text段的结尾
我们在都是0的位置添加我们需要注入的代码
在这里插入图片描述

我们首先需要找到 MessageBoxA函数的地址,以及调用这个函数需要传递什么参数
在这里插入图片描述
先看参数 为了简单我们传递 4个0,且这个传递参数的硬编码是 6A 要传递4个0的话就是 6A 00 6A 00 6A 00 6A 00
再看 MessageBoxA的地址
他的地址在 038111C这个位置存着,我们查看内存就能找到 MessageBoxA的地址
在这里插入图片描述
好了,到这里为止已经把 MessageBoxA的函数地址以及参数都搞定了,接下来就是注入代码了

我们只在程序运行前调用一个MessagaeBoxA 然后再跳回原来的程序入口
那么可以开始写代码了

6A 00 6A 00 6A 00 6A 00 E8 00 00 00 00 E9 00 00 00 00
首先将这段代码写进去,之后我们就只要修改 E8 以及E9后面的地址了
在这里插入图片描述
首先来计算 E8后面的地址
E8后面跟着的地址 = 函数的地址 - (E8的地址 + 5)
我们要调用MessageBoxA且这个函数的地址我们也知道了 762682A0
重点是这个E8地址是什么,所以首先我们需要查看 文件对齐值和内存对齐值是否一致
接着查看程序的基址也就是IamgegBase是多少才能来计算E8真正的地址

ImageBase为 400000h
内存对齐值为 1000h
文件对齐值为 200h
在这里插入图片描述

首先我们将E8现在处在的文件偏移地址加上 400000h
E8现在在文件中的偏移为 71D248h 加上之后等于 B1D248h
然后由于文件对齐和内存对齐不一致,所以导致程序加载进内存之后这个E8的地址会发生变化,那我们如何知道E8加载进内存之后的地址呢?

因为我们的代码是写在 .text这个段里面的,所以我们需要计算这个段在内存中的开始位置和在文件中的开始位置的差
那就是 36B000 - 400 = 36AC00
也就是说我们在文件中的.text段的地址偏移加上这个 36AC00 就是这个地址在内存中的真正的地址了
在这里插入图片描述
那就是我们上面算出来的这个值B1D248h + 36AC00 = E8 7E48(E8在内存中的真正地址)

那我们E8后面跟着的地址就是 762682A0 - (E8 7E48 + 5) = 753E 0453
这个 753E 0453就是E8后面真正要跟着的地址

在这里插入图片描述
之后就要计算 E9后面跟着地址,我们要找到OEP
在这里插入图片描述
OEP为 36B4BFh 这里值得注意的是这个OEP是一个rva所以我们直接加上 400000(程序的基址) 就得出了 OEP在内存中的地址了

OEP在内存中真正的地址是:76B4BFh

OEP就是我们真正要跳转的地址,接下来就找E9的下一行地址了,可以根据上面算E8下一行地址的步骤来算E9的下一行地址,不过这里有个更快的方法,上面我们算出来了E8下一行的地址,刚好E9就是E8下一行的地址,所以我们之前拿刚刚算出来的地址再加上5就是E9的下一行地址了也就是 E8 7E48 + 5 + 5 = E8 7E52
然后就是 76B4BFh - E8 7E52h = FF8E 366D
那E9后面跟着的地址就是 FF8E 366D
在这里插入图片描述
代码注入到这一步就完成了,但是还差一步,就是程序加载到内存之后首先要运行我们的代码
所以我们要将之前的OEP更改掉
在这里插入图片描述
这段代码开始的位置是 71D240 那么在内存中的偏移就是再加上 36AC00
71D240 + 36AC00 = A8 7E40
注意这里不需要再加上 400000(ImageBase)了,因为OEP是一个RVA,所以我们算出在内存中的偏移就可以了
所以我们直接将OEP更改为 A87E40h 然后就将文件保存
到这里为止整个代码注入就完成了

接下来就是测试
我们运行刚刚我们更改过的程序
就会看到弹窗,这是我们刚刚注入进去的代码就是 MessageBoxA(0, 0, 0, 0)执行的效果
在这里插入图片描述
点击确定后,程序就会和之前一样跑起来
在这里插入图片描述

把程序放到OD里跑起来可以发现确实首先运行的就是我们刚刚注入的代码
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/57688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PyQt5基础练习2

实验4 关闭窗口 4.1 完整代码 #!/usr/bin/python3 # -*- coding: utf-8 -*-""" ZetCode PyQt5 tutorialThis example shows a tooltip on a window and a button.Author: Jan Bodnar Website: zetcode.com Last edited: August 2017 """import…

推荐系统在腾讯游戏运营中的实践

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年10月份热门报告盘点2021-2022元宇宙报告.pdf清华大学256页PPT元宇宙研究报告.pdf(附下载链接)机器学习在B站推荐系统中的应用实践小红书推荐系统…

【Matplotlib绘制图像大全】(三十):Matplotlib绘制时间线图

前言 大家好,我是阿光。 本专栏整理了《Matplotlib绘制图像大全》,内包含了各种常见的绘图方法,以及Matplotlib各种内置函数的使用方法,帮助我们快速便捷的绘制出数据图像。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmMatp…

[附源码]计算机毕业设计医疗纠纷处理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

在浏览器中运行 TensorFlow.js 来训练模型并给出预测结果(Iris 数据集)

文章目录开发环境构建第一个 TensorFlow.js 模型构建鸢尾花数据集分类器References在 《TensorFlow Lite 是什么?用 TensorFlow Lite 来转换模型(附代码)》中我们已经介绍了可以帮助 TensorFlow 模型在移动设备以及嵌入式设备中运行的 Tensor…

YMTC X3 NAND 232L 终露真容,全球领先|国产芯之光

上一篇文章(芯片级解密YMTC NAND Xtacking 3.0技术),我们结合TechInsights获取芯片级信息梳理了国产NAND芯片厂商YMTC的技术演进之路,从2016公司成立,2018年发布Xtacking 1.0 NAND架构,2019年发布Xtacking …

Kotlin高仿微信-第58篇-开通VIP

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点,包括:注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

[附源码]计算机毕业设计springboot疫情网课管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

微信小程序| 做一款多人实时线上的五指棋联机游戏

📌个人主页:个人主页 ​🧀 推荐专栏:小程序开发成神之路 --【这是一个为想要入门和进阶小程序开发专门开启的精品专栏!从个人到商业的全套开发教程,实打实的干货分享,确定不来看看? …

[附源码]计算机毕业设计新能源汽车租赁Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

[附源码]计算机毕业设计疫情物资管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

微信支付商户平台-配置密钥/API安全教程

我们在做小程序获取微信开发时,难免会用到微信支付,我们做微信支付时,商户id和密匙是必不可少的。商户id很容易就能获取到。但是这个密匙的配置就相对而言麻烦了一点。今天就来教大家如何配置位置支付的密匙。 先我们要去注册微信支付的账号…

Lattice库联合ModelSim仿真FIFO

Lattice联合ModelSim仿真FIFO前言一、添加IP二、库文件添加(一)方式一:添加器件库到ModelSim(二)方法二:直接添加器件库到Libray,和tb.v在同一个目录下仿真三、仿真(一)仿真文件&…

JAVA社区疫情防控系统毕业设计,社区疫情防控管理系统设计与实现,毕设作品参考

功能清单 【后台管理员功能】 关于我们设置:设置学校简介、联系我们、加入我们、法律声明、学校详情 广告管理:设置小程序首页轮播图广告和链接 留言列表:所有用户留言信息列表,支持删除 会员列表:查看所有注册会员信…

b站黑马JavaScript的Ajax案例代码——新闻列表案例

目录 目标效果: 重点原理: 1.js中art-template标准语法的循环输出 2.js中split方法——转换字符串为数组 3.js中art-template标准语法的过滤器 4.js中Date内置对象——getFullYear() 5.js中Date内置对象——getMonth() 6.js中Date内置对象——ge…

简单认识一下HotSpot 垃圾收集器

前言 HotSpot 虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,虽然我们要对各个收集器进行比较,但并非为了挑选出一个最好的收集器。我们选择的只是对具体应用最合适的收集器。 新生代垃圾收集器 Serial 垃圾收集器(单线…

java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver解决方案

🌟问题解析 首先,此报错会出现在两种情况,并且有各自的解决方法。 如果在Java程序中报错,那么我们就参考方法1(单Java程序): 如果你是在Tomcat中报错,那么我们可以参考方法2&#…

[附源码]JAVA毕业设计交通事故档案管理系统(系统+LW)

[附源码]JAVA毕业设计交通事故档案管理系统(系统LW) 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目…

微信小程序实现微信支付的相关操作设置

本文不涉及相关API的实现,旨在记录实现微信支付需要在微信公众平台和微信支付的商户平台需要进行的操作。 1.首先需要用户申请了微信小程序和入驻微信商户平台 2.获取小程序的appid 设置AppSecre小程序密钥 3.微信支付获取商户号,在认证的时候设置操…

基于JavaSwing的员工工资管理系统

开发环境 eclipsejdk1.8mysql5.7 系统简介 本项目是主要功能有员工信息管理,部门信息管理,员工工资设定,系统设置等,员工不需要登录系统,可以直接查询自己的工资,具体项目操作及项目结构请看演示视频&am…