节空白区添加自己的代码【滴水逆向44笔记】

简介: 节空白区添加自己的代码【滴水逆向44笔记】

一:OD中找出函数执行地址:

在这里我们先来简单了解一下MessageBox函数:

1.MessageBox()函数:

MessageBox函数的功能是弹出一个标准的Windows对话框;它不是C函数库的标准函数,而是一个API,我们可以用C语言调用API函数。可以理解为:我们在C中使用MessageBox函数就可以表示调用系统提供的API函数–MessageBoxA。

该函数包含在头文件<windows.h>中。

2.OD中找出函数执行的起始地址:

我们在OD命令窗口中输入:

bp MessageBoxA;

就可以得到该函数执行的起始地址,我们需要牢记这个地址,这对于在节空白区添加代码是非常重要的。

需要特别注意的是:

我们找到的这个地址只是在当前计算机的当前运行状态下的地址,每一台计算机的该地址都不一样,计算机关机重启的时候这个地址也会发生变化!

二.E8(call)和E9(jmp)计算公式:

call的硬编码:E8

需要注意的是:E8后面会跟着四个字节的数据,表示转换后的偏移(通过这五个字节数据就可以执行想让程序执行的函数)

jmp的硬编码:E9

与call的硬编码一样,它后面同样会跟着四个字节的数据,表示转换后的偏移(通过这五个字节我们可以实现:程序执行完我们添加进去的代码后回到正常执行的地址)

计算E8和E9的公式:

这里需要计算的是E8和E9后面跟着的四个字节数据,我们用X来表示

我们先来给大家给出一个公式:

函数真正执行的地址 = E8后面一条指令的地址 + X(E8后面跟着的四个字节数据)

那么我们就可以得到:

X=程序真正执行的地址 —E8后面一条指令的地址

而我们知道E8(E9)后面跟着四个字节数据,那么E8(E9)后面一条指令的地址就应该是E8(E9)的地址+5(E8(E9)本身占据一字节)

那么我们就得到了E8(E9)的计算公式:

X = 程序真正执行的地址—(E8(E9)的地址 + 5)

这里给出我自己的理解:这里的X就是相对E8(E9)指令的偏移,我感觉这样的话会更好理解,当然如果大家有更好的理解或者是X的本质可以在文章后面评论,我会非常虚心地接受。

需要特别注意的是:这里的X是指磁盘文件拉伸后的地址,不是FileBuffer地址!

三.节空白区添加代码(手动)

在这里给出手动添加代码的实现步骤(通过Windows16进制编辑器完成)

1.先将我们想要程序执行的函数编译。

2.通过反汇编,查找函数硬编码,并且计算大小,如果有参数,参数入栈的硬编码也需要算在其中。

3.通过IDA,OD或者X64dbg找到该函数执行时的地址,并且牢记。

4.在空白区添加代码,最起码要保证该节的空白区能存放地下这些硬编码(计算机只能认识0和1,我们要在节空白区添加代码,必须添加硬编码,高级语言代码计算机是不能理解的),我们可以通过之前编译好的PE头部信息提取程序来寻找节空白区,也可以通过PETool来寻找一个能存放得下该函数硬编码的空白区。

5,通过16进制编辑器找到该节空白区,在空白区写入压入参数的硬编码,完成之后写入E8和计算好的X

6.通过通过之前编译好的PE头部信息提取程序来寻找可选PE头部结构中的AddressOfEnterPoint,将其改为我们写入的压栈的首地址

7.通过AddressOfEnterPoint和E9的地址算出E9后跟的X,并将其写入E9之后

需要特别注意的是,在这里我们计算E8或者E9的地址时,一定要在ImageBase的基础上来计算,因为程序执行时都是基于ImageBase的,否则计算出来的地址会出现错误!

完成这些操作后,我们就可以保存,当再次打开文件时,我们会发现我们自己写的函数已经执行。

这里是手动向节空白区添加代码,之后我会用C语言写出自动将想要的代码添加到节空白区的程序,希望大家多多关注!如果大家发现文章中有错误请指出,我会非常虚心得与大家共同学习。

相关文章
|
IDE 程序员 开发工具
NTlite给window瘦身+定制程序员专属环境
NTlite给window瘦身+定制程序员专属环境
1203 0
如何使用命令生成RSA2密钥
说明:   本帖主要说明如何使用命令来生成RSA2密钥。    使用密钥工具生成RSA2密钥(推荐使用):    帖子地址:[url]https://openclub.alipay.com/read.
2116 12
|
弹性计算 Kubernetes Perl
k8s 设置pod 的cpu 和内存
在 Kubernetes (k8s) 中,设置 Pod 的 CPU 和内存资源限制和请求是非常重要的,因为这有助于确保集群资源的合理分配和有效利用。你可以通过定义 Pod 的 `resources` 字段来设置这些限制。 以下是一个示例 YAML 文件,展示了如何为一个 Pod 设置 CPU 和内存资源请求(requests)和限制(limits): ```yaml apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: example-container image:
1573 2
|
API 开发工具 数据库
开发一份API接口,需要注意这些,看你做到了几项
本文介绍了设计API接口时需注意的关键点,包括数字签名、敏感数据加密与脱敏、限流、参数校验、统一返回与异常处理、请求日志记录、幂等设计、数据量限制、异步处理、参数定义、完整文档及开发者对接SDK等内容,旨在帮助开发者设计出安全、稳定、易维护的API接口。
439 6
开发一份API接口,需要注意这些,看你做到了几项
|
存储 编译器 数据安全/隐私保护
移动导出表,移动重定位表【滴水逆向三期51笔记+作业源码】(上)
移动导出表,移动重定位表【滴水逆向三期51笔记+作业源码】
|
监控 网络协议 安全
【亮剑】当设备IP能ping通但无法上网时,可能是DNS解析、网关/路由设置、防火墙限制、网络配置错误或ISP问题
【4月更文挑战第30天】当设备IP能ping通但无法上网时,可能是DNS解析、网关/路由设置、防火墙限制、网络配置错误或ISP问题。解决步骤包括检查网络配置、DNS设置、网关路由、防火墙规则,以及联系ISP。预防措施包括定期备份配置、更新固件、监控网络性能和实施网络安全策略。通过排查和维护,可确保网络稳定和安全。
4092 1
|
算法 Serverless 数据安全/隐私保护
【C++ 函数 基本教程 第三篇 】深度解析C++函数类型:探寻全局函数、成员函数与静态函数的奥秘
【C++ 函数 基本教程 第三篇 】深度解析C++函数类型:探寻全局函数、成员函数与静态函数的奥秘
858 1
|
存储 人工智能 编译器
C语言之(有关%d和%u的有关内容,输出方法)(有符号和无符号在内存中的存储情况)(整形无符号数和有符号数是如何进行计算的,整形无符号数和有符号数在循环中的应用举例)
C语言之(有关%d和%u的有关内容,输出方法)(有符号和无符号在内存中的存储情况)(整形无符号数和有符号数是如何进行计算的,整形无符号数和有符号数在循环中的应用举例)
1689 0
|
前端开发 rax C语言
脱壳学习(二)- 反“反调试”篇
脱壳学习(二)- 反“反调试”篇