追逐自己的梦想----------辅助制作第三课:注入辅助窗口到游戏进程中
2015-01-06 20:17
537 查看
本节课我们要做的是将辅助的界面注入到游戏的进程中。
首先,我们需要新建一个MFC DLL,(PS:下一步中,如果要编译动态链接库给别人使用就选择 带静态链接的规则dll),然后切换到资源视图中,添加一个对话框窗口,并为对话框窗口添加一个类。
然后在dll的InitInstance函数中创建一个线程,用来显示要注入的对话框窗口。
具体代码如下:
// 唯一的一个 CMFC_DLLApp 对象
然后新建一个WIN32项目,并在下一步中取消预编译头文件。
然后就开始写注入dll到游戏进程的代码
具体代码如下:
以上代码就完成了将辅助窗口注入到游戏进程中
下一节课中我们将调试第一节课中分析的人物数据
源码下载
首先,我们需要新建一个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; }
以上代码就完成了将辅助窗口注入到游戏进程中
下一节课中我们将调试第一节课中分析的人物数据
源码下载
相关文章推荐
- 追逐自己的梦想----------辅助制作第八课:利用SetWindowsHook将进程注入游戏主线程来解决资源冲突的问题
- 追逐自己的梦想----------辅助制作第四课:将游戏人物数据进行测试
- 追逐自己的梦想----------辅助制作第五课:分析并测试物品使用CALL
- 追逐自己的梦想----------辅助制作第二十三课:挂机选项卡的实现
- 追逐自己的梦想----------辅助制作第三十一课:向仓库存入N个物品对象分析
- 追逐自己的梦想----------辅助制作第二十七课:身上装备更换的分析与实现
- 追逐自己的梦想----------辅助制作第六课:背包数组分析和根据物品名称来使用物品
- 追逐自己的梦想----------辅助制作第十八课:拖拽技能到快捷栏
- 追逐自己的梦想----------辅助制作第二十四课:寻路call的分析
- 追逐自己的梦想----------辅助制作第二十课:完善自动技能打怪
- 追逐自己的梦想----------辅助制作第三十课:NPC对话更正以及封装查找NPC对象函数
- 追逐自己的梦想----------辅助制作第九课:分析怪物列表及怪物属性的封装等
- 追逐自己的梦想----------辅助制作第十六课:分析技能列表
- 追逐自己的梦想----------辅助制作第十二课:选怪功能封装
- 追逐自己的梦想----------辅助制作第二十五课:存仓库call分析
- 追逐自己的梦想----------辅助制作第二课:人物气功加点分析
- 追逐自己的梦想----------辅助制作第十三课:快速查找基址
- 追逐自己的梦想----------辅助制作第二十九课:分析打开NPC后功能打开
- 追逐自己的梦想----------辅助制作第十五课:实现动态更新基址
- 追逐自己的梦想----------辅助制作第二十八课:打开系统NPC CALL分析