注入是指通过修改PE文件地址的形式将一个程序插入到另一个程序中的过程
注入可以分为以下步骤:
-
确定注入程序的地址
-
找到代码节,判断代码节的剩余空间够不够注入
一般来说text节是代码节,通过真正的大小以及对齐大小就可以算出剩余
-
使用winhex打开将函数的参数写入
-
调用函数,根据公式得出e8后的硬编码
-
跳转到程序真正开始的位置
-
更改oep(程序入口)
首先编写一个简单的代码
如:
#include<Windows.h>
void function()
{}
int main()
{
MessageBox(0,0,0,0);
}
编写一个messagebox弹窗,作为练习用的注入程序。
查看一下messagebox的反汇编
可以看到messagebox的四个参数为6A00
在注入的过程中,我们通过call函数来调用要注入的程序,再通过jmp函数跳转回oep,call的硬编码是E8,jmp的硬编码是E9。
之后使用ollydbg打开我们写的程序查看一下地址。
在命令行添加
bp MassageBoxA//在massagebox添加断点的指令
回车之后打开断点界面,就可以找到程序的地址。
用winhex打开一个程序作为目标程序。
写入参数(包括Messagebox的参数,E8、E9以及函数地址)
这里的函数地址是要用之前得到的程序地址减去E9的地址。而E9的地址需要用E9在文件中的偏移量(偏移地址-第一个节的起始位置+1000+基址)