metahook吧 关注:755贴子:11,752
  • 20回复贴,共1

用高版本 Visual Studio 编译 MetaHook Plus 并正常运行(改)

只看楼主收藏回复

这次介绍一个新方法,不用Hook引擎函数,也不用搞什么全局变量。
就非常皮。


IP属地:广东1楼2018-02-08 10:05回复
    首先打开你从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 了


    IP属地:广东2楼2018-02-08 10:29
    回复
      原理是先以暂停的方式创建一个进程,这个进程只是被创建出来,不会马上开始运行,此时这个进程的内存空间空荡荡的,只有EXE本身几个核心DLL,这个时候去申请 0x1900000 ~ 0x2F78000 这段内存99%是会成功的,这样就确保了加密的hw.dll和client.dll可以被正常加载。申请完之后,让这个进程正常运行就没问题了(因为其它的DLL都是动态的基址,100%可以正常加载)


      IP属地:广东3楼2018-02-08 10:38
      回复

        这段内存就是上面的函数申请的,hw.dll和client.dll就被加载到这段内存里


        IP属地:广东4楼2018-02-08 10:41
        回复
          因为是创建了新的进程,所以要调试BLOB进程,就要多走一步了,如果嫌调试麻烦,就用上次的方法,等到发布的时候再改成这种方法。


          IP属地:广东5楼2018-02-08 10:46
          回复

            @Sky烨霖


            IP属地:广东7楼2018-02-08 16:06
            收起回复
              说到底究竟是哪个临时工把地址写死在0x19的


              IP属地:广东来自iPhone客户端9楼2018-02-08 17:45
              回复


                IP属地:上海10楼2018-02-08 22:07
                回复
                  仰望大佬


                  来自Android客户端11楼2018-02-11 08:44
                  回复
                    所以说V社开发goldsrc的时候微软还没引入DEP这种骚东西


                    IP属地:江苏12楼2018-02-28 20:20
                    收起回复
                      一般用哪个好啊,我现在2013


                      IP属地:广东来自iPhone客户端13楼2018-04-29 01:41
                      收起回复
                        问一下mh怎么换标题啊有没有0.4版本的exe啊


                        14楼2018-08-07 18:02
                        回复
                          不明觉厉,仰望就好!


                          IP属地:甘肃15楼2021-01-15 14:30
                          回复