完整的注入方法,请参考:http://www.cppblog.com/besterChen/archive/2009/02/15/73831.html
我的心得:
函数代码注入方法关键步骤:
一、WriteProcessMemeory将函数参数写入目标进程
二、WriteProcessMemeory将函数代码写入目标进程
三、CreateRemoteThread创建远程线程,在目标进程中调用寒素
下面是要注意的地方:
如果要注入一段函数代码,如
void func()
{
MessageBox(); //(1)
}
那么MessageBox必须要通过取得地址传给函数,及(1)位置应该是个确定的函数地址值,
如果函数有参数,必须同样的传入的是地址,如MessageBox要有参数字符串,func中不能出现字符串,即不能再func中有这样的句子:MessageBox(“错误的方法”)。
--------------------------------------------------------------------
传递参数和函数地址的方法:
struct param
{
DWORD addr; //在func中要调用的函数地址
char szText[MAX_PATH]; //在func中要调用的函数的参数
}
填充参数
param pa;
pa.addr = (DWORD)GetProcAddress(hUser32, "MessageBoxA");
strcat(pa.szText[, "Hello\0");
pa即是一步骤中的参数
函数实现方法:
void func(param* pa)
{
typedef int (WINAPI *MESSAGEBOXA) (DWORD, LPCSTR, LPCSTR, UINT);
MESSAGEBOXA MessageBoxA;
MessageBoxA = (MESSAGEBOXA)pa->addr;
addr(NULL, pa->szText, NULL, NULL);
}
最后,
CreateRemoteProcess(hProcess, NULL, 0, func_addr, pa_addr, 0, NULL);
//hProcess是目标进程句柄,func_addr是二步中返回的地址,pa_addr是一步中返回的地址