- UID
- 70161
- 帖子
- 33750
- 主題
- 4406
- 精華
- 0
- 積分
- 3371
- 楓幣
- 7372
- 威望
- 1994
- 存款
- 270000
- 贊助金額
- 0
- 推廣
- 87
- GP
- 13257
- 閱讀權限
- 180
- 性別
- 男
- 在線時間
- 27532 小時
- 註冊時間
- 2014-7-11
- 最後登入
- 2024-11-26
|
C++ EXE 代碼實現 源碼有點醜 我盡力了
可能還有更快的方式 但我不會
不推薦使用 EXE 來實現 Hook
DLL 還是快多了
我把數據給改了下
因 Call 009E0860 之後 eax 會自動給
所以不用還原 eax
然而 借 ecx 來用
因為 回去源代碼的時候
02C00195 - E8 C606DEFD - call 009E0860
02C0019A - 83 C4 04 - add esp,04 { 4 }
02C0019D - 8B C8 - mov ecx,eax
ecx 會被 eax 取代
故也不用還原- #include <Windows.h>
- #include <stdio.h>
- DWORD GetLevelHook_Address = 0x02C00195; //Hook 地址
- HANDLE GameHandle = 0;
- BYTE GetLevelAOB[] = { 0xB8 ,0x00 ,0x00 ,0x33 ,0x05 ,0x89 ,0x38, 0xB8, 0x60, 0x08, 0x9E, 0x00, 0xFF, 0xD0, 0xB9, 0x9A, 0x01, 0xC0, 0x02 ,0xFF ,0xE1 }; // GetLevel 的 AOB
- /*
- GetLevelAOB 展示用
- void __declspec(naked) GetLevel()
- {
- _asm
- {
- mov eax, 0x05330000 // 由於懶得在自己申請一個區域的記憶體 所以採用遊戲內不會使用到的地址 用來保存 人物等級
- mov Dword Ptr[eax], edi
- mov eax, 0x009E0860 // 數據所使用的Call
- call eax
- mov ecx, 0x02C00195 + 5 //返回地址
- jmp ecx
- }
- }
- */
- BOOL Init()
- {
- HWND GameHwd = 0;
- DWORD GamePid = 0;
- DWORD pNowLevel = 0; //人物等級
- while (!GameHandle)
- {
- GameHwd = FindWindowA(NULL, "MapleStory");
- if (GameHwd)
- GetWindowThreadProcessId(GameHwd, &GamePid);
- if (GamePid)
- GameHandle = OpenProcess(PROCESS_ALL_ACCESS, false, GamePid); // 開啟進程
- if (GameHandle)
- {
- //先將我們借用地址的值給歸0
- WriteProcessMemory(GameHandle, (LPVOID)0x05330000, &pNowLevel, 4, NULL);//人物等級 #0x05330000
- }
- Sleep(250);
- }
- return true;
- }
- /*
- pHandle 為進程句炳
- lpAddress 為要進行 HOOK 的地址
- Function 為我們自己的函數
- */
- BOOL HookEx(HANDLE pHandle,DWORD lpAddress, LPCVOID Function)
- {
- BOOL ReturnValue = false;
- DWORD JmpTemp = 0;
- DWORD OldProtection;
- DWORD Jmp = 0xE9;
- VirtualProtectEx(pHandle, (LPVOID)lpAddress, 5, PAGE_EXECUTE_READWRITE, &OldProtection);
- JmpTemp = (DWORD)Function - lpAddress - 5;
- WriteProcessMemory(pHandle, (LPVOID)lpAddress, &Jmp, 1, NULL);
- ReturnValue = WriteProcessMemory(pHandle, (LPVOID)(lpAddress + 1), &JmpTemp, 4, NULL);
- VirtualProtectEx(pHandle, (LPVOID)lpAddress, 5, OldProtection, &OldProtection);
- return ReturnValue;
- }
- LPVOID AllocHook;
- BOOL StartHook()
- {
- AllocHook = VirtualAllocEx(GameHandle, NULL, 50, MEM_COMMIT, PAGE_EXECUTE_READWRITE); //先在楓谷申請一個地方記憶體
- WriteProcessMemory(GameHandle, AllocHook, &GetLevelAOB, 50, NULL); //將我們申請的地址 寫入 我們的 GetLevelAOB << 這裡採用 AOB 進行寫入
- HookEx(GameHandle, GetLevelHook_Address, AllocHook);
- return true;
- }
- int main()
- {
- DWORD LvTemp = 0;
- Init();// 尋找遊戲 並 初始化功能
- if (StartHook())
- {
- printf("Hook 完成 等待開始\n");
- system("pause"); // 按下任意鍵開始讀取等級
- while (1)
- {
- ReadProcessMemory(GameHandle, (LPVOID)0x05330000, &LvTemp, 4, NULL); // 讀取我們借用的地址
- printf("目前等級 : %d\n", LvTemp); // 得到目前等級
- Sleep(250);
- }
- }
- printf("Hook 失敗\n");
- system("pause");
- return true;
- }
複製代碼 |
-
總評分: 楓幣 + 1
查看全部評分
|