|

提醒:若下载的软件是收费的"请不要付款",可能是骗子,请立即联系本站举报,执意要付款被骗后本站概不负责。(任何交易请走第三方中介,请勿直接付款交易以免被骗!切记).
- // Win32Project2.cpp : 定义 DLL 应用程序的导出函数。
- //
- ///////////////////////////////////////////////////////////////////////////////////////////////////////
- /*
-
- DLL名称劫持注入法
-
- 当游戏运行加载一个重要的的DLL模块时,我们让他来加载我们需要注入的DLL和原来那个必须加载的游戏DLL模块。
-
- 比如说一些游戏加载游戏本身DLL“client.dll”。
- 游戏DLL“client.dll”重命名为“client- original.dll”。
- 把我们需要注入的DLL重命名成“client.dll”,并把2个DLL放在一起。
- 把下面源码的client.exe更换成你需要注入的游戏的进程名。
-
- 原理:
- 游戏运行时先加载我们伪造的DLL“client.dll”,但由于关键函数还在原来的client.dll中。
- 所以先将自身复制为临时文件“client - temp.dll”
- 加载后然后卸载本身。替换原来的“client.dll”并加载。
- 然后,它运行一个bat脚本,将等待游戏退出,一旦游戏退出。
- bat脚本将复制临时文件“client - temp.dll”到“client.dll”,
- 这样它就会在下次游戏启动时继续加载。
-
-
- */
- #include "stdafx.h"
- #include "fstream"
- using namespace std;
-
-
- void 替换(char* szBuffer, size_t bufferSize, char* from, char* to)
- {
- char* szpTemp,
- *szpTempBuffer,
- *szpCurrentBuffer;
-
-
- szpCurrentBuffer = szBuffer;
- szpTempBuffer = new char[bufferSize];
-
- while (true)
- {
- szpTemp = strstr(szpCurrentBuffer, from);
-
- if (szpTemp != NULL)
- {
- if (strlen(szBuffer) - strlen(from) + strlen(to) < bufferSize)
- {
- strcpy(szpTempBuffer, szpTemp + strlen(from));
-
- *szpTemp = '\0';
- strcat(szpTemp, to);
- szpCurrentBuffer = szpTemp + strlen(to);
- strcat(szpTemp, szpTempBuffer);
- }
- else
- break;
- }
- else
- break;
- }
-
- delete[] szpTempBuffer;
- }
-
- DWORD WINAPI ThreadMain(LPVOID lpvParam)
- {
- MessageBox(0, "劫持注入成功", "hello", 0);
-
- return 0;
- }
-
- BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpvReserved)
- {
- BYTE* pCave;
-
- ifstream in;
-
- ofstream out;
-
- BOOL bLoad;
-
- FARPROC targetFunction;
-
- HMODULE hTargetModule;
-
- char* szpName;
-
- char szFileName[MAX_PATH],
- szBuffer[MAX_PATH],
- szTempBuffer[MAX_PATH];
-
- char* szpTargetModule;
-
- STARTUPINFO si = { sizeof(STARTUPINFO) };
-
- PROCESS_INFORMATION pi;
-
- char szCmdLine[MAX_PATH];
-
-
- bLoad = FALSE;
-
-
- if (dwReason == DLL_PROCESS_ATTACH)
- {
- GetModuleFileName(hModule, szFileName, sizeof(szFileName));
- strcpy(szBuffer, szFileName);
-
- // 判断自身是否为临时文件,如果不是临时文件将创建并加载
- if (strstr(szFileName, " - temp.dll") == NULL)
- {
- 替换(szBuffer, sizeof(szBuffer), ".dll", " - temp.dll");
-
- if (CopyFile(szFileName, szBuffer, FALSE) != NULL)
- {
- szpTargetModule = (char*)VirtualAlloc(NULL, 1024, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
-
- strcpy(szpTargetModule, szBuffer);
-
- hTargetModule = GetModuleHandle("Kernel32.dll");
- targetFunction = GetProcAddress(hTargetModule, "LoadLibraryA");
-
- pCave = (BYTE*)VirtualAlloc(NULL, 0x10, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
- *pCave++ = 0x68;
- *(DWORD*)pCave = (DWORD)szpTargetModule;
- pCave += 4;
- *pCave++ = 0xe8;
- *(DWORD*)pCave = (DWORD)((DWORD)targetFunction - (DWORD)pCave - 4);
- pCave += 4;
- *pCave++ = 0xc2;
- *pCave++ = 0x04;
- *pCave++ = 0x00;
- pCave -= 13;
-
- CreateThread(0, 0, (LPTHREAD_START_ROUTINE)pCave, 0, 0, 0);
- }
- }
- else
- {
- // 如果是临时的DLL
- 替换(szBuffer, sizeof(szBuffer), " - temp.dll", ".dll");
-
- // 等待遊戲主進程是否佔用此DLL 等待寫入權限
- do
- {
- in.open(szBuffer, ios::out);
-
- if (in.is_open() == true)
- {
- in.close();
- break;
- }
-
- Sleep(1000);
- } while (true);
-
-
-
- // 写一个bat脚本,一旦游戏退出,恢复自身文件名,下次可以继续加载
- //// 把下面的client.exe改成你需要注入的游戏进程名
- out.open("bat.bat", ios::out);
-
- if (out.is_open() == true)
- {
- out << ":WAITLOOP" << endl;
- out << "tasklist /FI \"IMAGENAME eq Client.exe\" 2>NUL | find /I /N \"Client.exe\">NUL" << endl;
- out << "if \"%ERRORLEVEL%\"==\"0\" goto RUNNING" << endl;
- out << "goto NOTRUNNING" << endl;
-
- out << ":RUNNING" << endl;
- out << "timeout /t 2" << endl;
- out << "goto WAITLOOP" << endl;
-
- out << ":NOTRUNNING" << endl;
- out << "copy \"" << szFileName << "\" \"" << szBuffer << "\"" << endl;
- out.close();
-
- strcpy(szTempBuffer, szFileName);
- *strrchr(szTempBuffer, '\\') = '\0';
-
- sprintf(szCmdLine, "cmd.exe /C \"%s\\bat.bat\"", szTempBuffer);
-
- CreateProcess(NULL, szCmdLine, 0, 0, FALSE, CREATE_UNICODE_ENVIRONMENT, NULL, 0, &si, &pi);
- }
-
- 替换(szFileName, sizeof(szFileName), " - temp.dll", " - original.dll");
- CopyFile(szFileName, szBuffer, FALSE);
-
- LoadLibrary(szBuffer);
-
- CreateThread(0, 0, ThreadMain, 0, 0, 0);
- bLoad = TRUE;
- }
- }
-
- return bLoad;
- }
复制代码
联系我时,请说是在 挂海论坛 上看到的,谢谢! |
上一篇: LOL 人物基址特征码下一篇: LOL无限视距OD特征码
免责声明:
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关。一切关于该内容及资源商业行为与www.52ghai.com无关。
2、本站提供的一切资源内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。
3、本站信息来自第三方用户,非本站自制,版权归原作者享有,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
4、如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵犯你版权的,请邮件与我们联系删除(邮箱:xhzlw@foxmail.com),本站将立即改正。
|