冰楓論壇

標題: 求一個C或者C++實現的源代碼,用來獲取當前練功角色等級。需要的源代碼要能編譯成exe軟體哦。 [打印本頁]

作者: n81520    時間: 2020-5-15 23:14
標題: 求一個C或者C++實現的源代碼,用來獲取當前練功角色等級。需要的源代碼要能編譯成exe軟體哦。
要求:使用C或者C++編寫代碼,需要能編譯成exe程序, 可運行后獲取當前練功角色等級
          最好是使用CRC數據進行獲取。
          我提供CRC數據:
          // TwMs v225.1 CRC 取得人物等級
[ENABLE]
Registersymbol(Level)
Alloc(GetLevel,64)
Alloc(Level,4)
Label(Return)

GetLevel:
mov [Level],edi
call 009E0860
jmp Return

02C00195:
jmp GetLevel
Return:

[DISABLE]
02C00195:
call 009E0860

DeAlloc(Level)
DeAlloc(GetLevel)

作者: qwas963563    時間: 2020-5-15 23:14
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 取代
故也不用還原
  1. #include <Windows.h>
  2. #include <stdio.h>

  3. DWORD GetLevelHook_Address = 0x02C00195; //Hook 地址
  4. HANDLE GameHandle = 0;
  5. 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

  6. /*
  7.         GetLevelAOB 展示用
  8. void __declspec(naked) GetLevel()
  9. {
  10.         _asm
  11.         {
  12.                 mov eax, 0x05330000 // 由於懶得在自己申請一個區域的記憶體 所以採用遊戲內不會使用到的地址 用來保存 人物等級
  13.                 mov Dword Ptr[eax], edi
  14.                 mov eax, 0x009E0860 // 數據所使用的Call
  15.                 call eax
  16.                 mov ecx, 0x02C00195 + 5 //返回地址
  17.                 jmp ecx
  18.         }
  19. }
  20. */

  21. BOOL Init()
  22. {
  23.         HWND GameHwd = 0;
  24.         DWORD GamePid = 0;
  25.         DWORD pNowLevel = 0; //人物等級
  26.         while (!GameHandle)
  27.         {
  28.                 GameHwd = FindWindowA(NULL, "MapleStory");
  29.                 if (GameHwd)
  30.                         GetWindowThreadProcessId(GameHwd, &GamePid);
  31.                 if (GamePid)
  32.                         GameHandle = OpenProcess(PROCESS_ALL_ACCESS, false, GamePid); // 開啟進程
  33.                 if (GameHandle)
  34.                 {
  35.                         //先將我們借用地址的值給歸0
  36.                         WriteProcessMemory(GameHandle, (LPVOID)0x05330000, &pNowLevel, 4, NULL);//人物等級        #0x05330000
  37.                 }
  38.                 Sleep(250);
  39.         }
  40.         return true;
  41. }

  42. /*
  43.         pHandle                為進程句炳
  44.         lpAddress        為要進行 HOOK 的地址
  45.         Function        為我們自己的函數
  46. */
  47. BOOL HookEx(HANDLE pHandle,DWORD lpAddress, LPCVOID Function)
  48. {
  49.         BOOL ReturnValue = false;
  50.         DWORD JmpTemp = 0;
  51.         DWORD OldProtection;
  52.         DWORD Jmp = 0xE9;
  53.         VirtualProtectEx(pHandle, (LPVOID)lpAddress, 5, PAGE_EXECUTE_READWRITE, &OldProtection);
  54.         JmpTemp = (DWORD)Function - lpAddress - 5;
  55.         WriteProcessMemory(pHandle, (LPVOID)lpAddress, &Jmp, 1, NULL);
  56.         ReturnValue = WriteProcessMemory(pHandle, (LPVOID)(lpAddress + 1), &JmpTemp, 4, NULL);
  57.         VirtualProtectEx(pHandle, (LPVOID)lpAddress, 5, OldProtection, &OldProtection);
  58.         return ReturnValue;
  59. }

  60. LPVOID AllocHook;
  61. BOOL StartHook()
  62. {
  63.         AllocHook = VirtualAllocEx(GameHandle, NULL, 50, MEM_COMMIT, PAGE_EXECUTE_READWRITE); //先在楓谷申請一個地方記憶體
  64.         WriteProcessMemory(GameHandle, AllocHook, &GetLevelAOB, 50, NULL); //將我們申請的地址 寫入 我們的 GetLevelAOB << 這裡採用 AOB 進行寫入
  65.         HookEx(GameHandle, GetLevelHook_Address, AllocHook);
  66.         return true;
  67. }

  68. int main()
  69. {
  70.         DWORD LvTemp = 0;
  71.         Init();// 尋找遊戲 並 初始化功能
  72.         if (StartHook())
  73.         {
  74.                 printf("Hook 完成 等待開始\n");
  75.                 system("pause"); // 按下任意鍵開始讀取等級
  76.                 while (1)
  77.                 {
  78.                         ReadProcessMemory(GameHandle, (LPVOID)0x05330000, &LvTemp, 4, NULL); // 讀取我們借用的地址
  79.                         printf("目前等級 : %d\n", LvTemp); // 得到目前等級
  80.                         Sleep(250);
  81.                 }
  82.         }
  83.         printf("Hook 失敗\n");
  84.         system("pause");
  85.         return true;
  86. }
複製代碼

作者: gta5123cc    時間: 2020-5-17 16:55
4大佬
交我寫外掛豪嗎




歡迎光臨 冰楓論壇 (https://bingfong.com/) Powered by 冰楓