首先打开你从git拉下来的原版MetaHookPlus项目。
打开LoadBlob.cpp,二话不说直接把BYTE g_pBlobBuffer[0x2000000];这行注释掉。
然后创建一个cpp,比方说BlobProcess.cpp,编写一个函数,代码如下:
#include <windows.h>
#include <ICommandLine.h>
bool CreateBlobProcess(ICommandLine *cmd)
{
if (cmd->CheckParm("-blob"))
return false;
char name[MAX_PATH];
GetModuleFileName(GetModuleHandle(NULL), name, _countof(name));
STARTUPINFO si = { sizeof(STARTUPINFOW) };
PROCESS_INFORMATION pi;
cmd->AppendParm("-blob", NULL);
if (!CreateProcess(name, (LPSTR)cmd->GetCmdLine(), NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi))
{
MessageBox(NULL, "Failed to create blob process", "Fatal Error", MB_ICONERROR);
return true;
}
LPVOID buf = VirtualAllocEx(pi.hProcess, (LPVOID)0x1900000, 0x2000000, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if (!buf)
{
TerminateProcess(pi.hProcess, 1);
MessageBox(NULL, "Failed to allocate blob buffer", "Fatal Error", MB_ICONERROR);
return true;
}
ResumeThread(pi.hThread);
//如果加入下面这行,你运行游戏的时候任务管理器就会出现两个进程
//WaitForSingleObject(pi.hProcess, INFINITE);
return true;
}
然后打开launcher.cpp修改WinMain函数,如下:
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HANDLE hObject = NULL;
CommandLine()->CreateCmdLine(GetCommandLine());
CommandLine()->RemoveParm("-steam");
// 在这里调用上面编写的函数
if (CreateBlobProcess(CommandLine()))
return 1;
#ifndef _DEBUG
.......
}
最后不要忘了修改EXE的基址:
为什么是 0x4000000 ?因为
加密的 client.dll 的地址空间是(0x1900000~0x1A3D000)
还有加密的 hw.dll 的地址空间是(0x1D00000~0x2F78000)
为了避免MetaHook.exe本身代码过多,占用到0x1900000这个地址,这种尴尬的情况。
不如直接把MetaHook.exe的代码放到0x2F78000后面。
这样就算是30MB的MetaHook.exe也不会影响到 hw.dll 和 client.dll 了
打开LoadBlob.cpp,二话不说直接把BYTE g_pBlobBuffer[0x2000000];这行注释掉。
然后创建一个cpp,比方说BlobProcess.cpp,编写一个函数,代码如下:
#include <windows.h>
#include <ICommandLine.h>
bool CreateBlobProcess(ICommandLine *cmd)
{
if (cmd->CheckParm("-blob"))
return false;
char name[MAX_PATH];
GetModuleFileName(GetModuleHandle(NULL), name, _countof(name));
STARTUPINFO si = { sizeof(STARTUPINFOW) };
PROCESS_INFORMATION pi;
cmd->AppendParm("-blob", NULL);
if (!CreateProcess(name, (LPSTR)cmd->GetCmdLine(), NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi))
{
MessageBox(NULL, "Failed to create blob process", "Fatal Error", MB_ICONERROR);
return true;
}
LPVOID buf = VirtualAllocEx(pi.hProcess, (LPVOID)0x1900000, 0x2000000, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if (!buf)
{
TerminateProcess(pi.hProcess, 1);
MessageBox(NULL, "Failed to allocate blob buffer", "Fatal Error", MB_ICONERROR);
return true;
}
ResumeThread(pi.hThread);
//如果加入下面这行,你运行游戏的时候任务管理器就会出现两个进程
//WaitForSingleObject(pi.hProcess, INFINITE);
return true;
}
然后打开launcher.cpp修改WinMain函数,如下:
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HANDLE hObject = NULL;
CommandLine()->CreateCmdLine(GetCommandLine());
CommandLine()->RemoveParm("-steam");
// 在这里调用上面编写的函数
if (CreateBlobProcess(CommandLine()))
return 1;
#ifndef _DEBUG
.......
}
最后不要忘了修改EXE的基址:
为什么是 0x4000000 ?因为
加密的 client.dll 的地址空间是(0x1900000~0x1A3D000)
还有加密的 hw.dll 的地址空间是(0x1D00000~0x2F78000)
为了避免MetaHook.exe本身代码过多,占用到0x1900000这个地址,这种尴尬的情况。
不如直接把MetaHook.exe的代码放到0x2F78000后面。
这样就算是30MB的MetaHook.exe也不会影响到 hw.dll 和 client.dll 了