n81520 發表於 2020-5-15 23:14:05

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

要求:使用C或者C++編寫代碼,需要能編譯成exe程序, 可運行后獲取當前練功角色等級
          最好是使用CRC數據進行獲取。
          我提供CRC數據:
          // TwMs v225.1 CRC 取得人物等級

Registersymbol(Level)
Alloc(GetLevel,64)
Alloc(Level,4)
Label(Return)

GetLevel:
mov ,edi
call 009E0860
jmp Return

02C00195:
jmp GetLevel
Return:


02C00195:
call 009E0860

DeAlloc(Level)
DeAlloc(GetLevel)

qwas963563 發表於 2020-5-15 23:14:06

C++ EXE 代碼實現 源碼有點醜 我盡力了
可能還有更快的方式 但我不會
{:9_442:}
不推薦使用 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, 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;
}

gta5123cc 發表於 2020-5-17 16:55:28

4大佬
交我寫外掛豪嗎
頁: [1]
查看完整版本: 求一個C或者C++實現的源代碼,用來獲取當前練功角色等級。需要的源代碼要能編譯成exe軟體哦。