挂载主线程
大约 1 分钟cpp
概述
通过API OpenProcess 和 WriteProcessMemory 更改目标进程的数据都是跨进程操作,本文介绍向目标进程注入 dll 后挂载主线程后直接调用主线程函数的方法,相当于在目标进程的源码中添加自己的逻辑。
实现
先 创建MFCDLL项目,然后在对话框中添加按钮执行下面的逻辑
// 挂载主线程后执行的业务逻辑
// 本回调函数是在目标进程的主线程中执行,所以找到的函数地址 funcAddr
// 可以直接在汇编中使用
void CALLBACK mountedCode(HWND h,UINT arg2,UINT_PTR timerId,DWORD time) {
KillTimer(h, timerId);
UINT_PTR funcAddr = 0x671040;// 主线程函数地址
int param = 5;
__asm {
push param
call funcAddr
add esp,4
}
string dt = getNowStr();
const char* dt1 = dt.c_str();
TRACE("mountMainThread - %s - call宿主线程函数:%X",dt1, funcAddr);
}
// 按钮点击事件
void PluginMainWindow::OnBnClickedButton6()
{
// 获取目标进程窗口句柄
gameWindowHwnd = FindWindowA("ConsoleWindowClass", "D:\\source\\cpp\\windowsapi\\Release\\A05forInject.exe");
// 通过定时器挂载回调函数 mountedCode 到主线程
// 在第三个参数100毫秒后开始执行 mountedCode 其中的逻辑
// 其中通过 KillTimer 关闭定时器,否则会重复执行
// gameWindowHwnd:目标程序窗口句柄
// 7777:事件ID,自定义不重复即可
// 100:定时器执行间隔,单位:毫秒
// mountedCode:一个回调函数,自定义线程被挂载到主线程后执行逻辑的函数
::SetTimer(gameWindowHwnd,7777,100, mountedCode);
}
参考
该功能的教学视频看郁金香教程的初级班030
