一、代码节空白区添加代码
1.MessageBox函数说明
-
MessageBox()函数:功能是弹出一个标准的Windows对话框;它不是C函数库的标准函数,而是一个API,我们可以用C语言调用API函数。可以理解成我们在C中使用MessageBox函数就表示调用系统提供的API函数–MessageBoxA。包含在头文件windows.h;如果一个程序中包含user32.dll,则此程序就有MessageBoxAAPI函数 -
函数原型:
int MessageBox( HWND hWnd,LPCTSTR lpText, LPCTSTR lpCaption = NULL, UINT nType = MB_OK ); -
四个参数说明:
- hWnd:表示窗口句柄,指定该对话框的所有者窗口;如果该参数为空(0/NULL),则该对话框不属于任何窗口
- lpText:字符串,指显示在对话框中的内容
- lpCaption:字符串,指对话框的标题;如果此参数为空,则默认使用“错误”作为标题
- nType:指定显示按钮的数目及形式,表名使用的图标样式、缺省按钮是什么、以及消息框的强制回应等
2.call与jmp指令的硬编码
-
由于我们现在还没有系统学习过硬编码知识,所以只能先自己编写C看看:我们任意在VC中写一个函数再调用它,编译进入到反汇编查看,右键打开
code bytes显示硬编码,可以看到每条指令的左边都是它对应的硬编码,即二进制数(这里用十六进制显示) -
call指令的硬编码:E8 后面跟了4个字节(转换后的地址)
注意:硬编码为E8的call,后面跟的地址是相对地址;还有硬编码为FF15的call,后面跟的是绝对地址,即ImageBase + RVA后的地址值
-
jmp指令的硬编码:E9 后面跟了4个字节(转换后的地址)
-
push指令的硬编码:6A 参数的值(传入函数参数的值是什么对应的参数硬编码就是什么)
-
由于call指令和jmp指令后面跟的是我们想要调用的函数地址或者跳转的地址,那E8和E9后面跟的4个字节是不是就是这个地址本身呢?不是!E8和E9后面跟的地址数据是需要转换得到的
-
E8 和 E9 后面4字节地址X的转换公式:X = 真正要跳转的地址 - E8这条指令的下一行地址(相当于==相对地址),因为
call 地址的硬编码固定一共占5字节,所以E8指令的下一行地址 = E8当前地址 + 5;所以公式最终为:X = 要跳转的地址 - (E8的地址 + 该指令长度)==注意:这些公式中所用到的地址值全部是可执行文件在4GB虚拟内存中的地址值,不是文件地址!
-
举例:
-
构造一个需要调用函数的C代码:
#include "stdafx.h" void Function(int a,int b,int c,int d){ } int main(int argc,char* argv[]){ Function(1,2,3,4); return 0; } -
查看反汇编:
-
计算E8后面跟的4字节地址
-
因为E8的当前地址为0x00401190,真正要跳转的Function函数的地址为
-
-

本文详细介绍了如何在代码节空白区添加MessageBox函数,通过硬编码技巧实现代码注入,并探讨了如何在不同环境下计算地址转换。步骤包括设置断点获取API地址、计算硬编码长度、添加shellcode和调整EOP。
最低0.47元/天 解锁文章
855





