跳至主要內容

挂载主线程

chanchaw大约 1 分钟cpp

概述

通过API OpenProcessWriteProcessMemory 更改目标进程的数据都是跨进程操作,本文介绍向目标进程注入 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