您的位置:首页 > 编程语言 > C语言/C++

追逐自己的梦想----------辅助制作第三课:注入辅助窗口到游戏进程中

2015-01-06 20:17 537 查看
本节课我们要做的是将辅助的界面注入到游戏的进程中。

首先,我们需要新建一个MFC DLL,(PS:下一步中,如果要编译动态链接库给别人使用就选择 带静态链接的规则dll),然后切换到资源视图中,添加一个对话框窗口,并为对话框窗口添加一个类。

然后在dll的InitInstance函数中创建一个线程,用来显示要注入的对话框窗口。

具体代码如下:

// 唯一的一个 CMFC_DLLApp 对象

</pre><pre name="code" class="cpp">// 唯一的一个 CMFC_DLLApp 对象

CMFC_DLLApp theApp;
CMainDialog *pDialog = NULL;
DWORD WINAPI ShowWindow1(LPARAM lpData){

pDialog = new CMainDialog;
pDialog->DoModal();
delete pDialog;
FreeLibraryAndExitThread(theApp.m_hInstance, 1);
return TRUE;
}

// CMFC_DLLApp 初始化

BOOL CMFC_DLLApp::InitInstance()
{
CWinApp::InitInstance();
::CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ShowWindow1, NULL, NULL, NULL);
return TRUE;
}


然后新建一个WIN32项目,并在下一步中取消预编译头文件。

然后就开始写注入dll到游戏进程的代码

具体代码如下:

// InjectDll.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<Windows.h>
using namespace std;

#define GameClassName "D3D Window"
//#define dllFullPath "G:\\热血江湖项目\\MDC_DLL\\Debug\\MDC_DLL.dll"
void injectDll(const char *dllFullPath, HWND GameHwnd){
DWORD pid = 0; //进程pid
HANDLE hProcess = NULL; //进程句柄
LPDWORD AddressDW = NULL;
DWORD dwwrite = 0;
DWORD dwthreadid = 0;

HANDLE threadHandle = NULL;
//获取游戏窗口句柄

if (GameHwnd != 0){
//获取进程pid
GetWindowThreadProcessId(GameHwnd, &pid);
if (pid != 0){
//获取游戏进程句柄
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
//cout << hProcess << endl;
if (hProcess != NULL){
//在游戏进程分配一块内存空间
AddressDW = (LPDWORD)VirtualAllocEx(hProcess, NULL, 256, MEM_COMMIT, PAGE_READWRITE);
//cout << AddressDW << endl;
if (AddressDW != NULL){
//写入dll全路路径
WriteProcessMemory(hProcess, AddressDW, dllFullPath, strlen(dllFullPath) + 1, &dwwrite);

if (dwwrite >= strlen(dllFullPath)){
threadHandle = CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibraryA, AddressDW, NULL, NULL);
if (threadHandle != NULL){
cout << "注入进程成功" << endl;
}
WaitForSingleObject(threadHandle, 0xFFFFFFFF);
CloseHandle(threadHandle);

VirtualFreeEx(hProcess, AddressDW, 256, MEM_DECOMMIT);
CloseHandle(hProcess);
}
else{
cout << "写入dll路径失败\r\n" << endl;
}

}
}
}
}
//cout << GameHwnd << endl;
return;
}

int _tmain(int argc, _TCHAR* argv[])
{

//添加注入dll的代码
cout << "注入dll" << endl;
char DirName[256] = "";
char fullPath[256] = "";

HWND GameHwnd = FindWindow(GameClassName, NULL);
GetCurrentDirectoryA(sizeof(DirName), DirName);
printf("%s\r\n", DirName);
strcpy_s(fullPath, DirName);
strcat_s(fullPath, "\\");
strcat_s(fullPath, "MFC_DLL.dll");

printf("%s\r\n", fullPath);

injectDll(fullPath, GameHwnd);
//getchar();

return 0;
}


以上代码就完成了将辅助窗口注入到游戏进程中

下一节课中我们将调试第一节课中分析的人物数据

源码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MFC c++ 辅助
相关文章推荐