冰楓論壇
標題:
求一個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 取代
故也不用還原
#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;
}
複製代碼
作者:
gta5123cc
時間:
2020-5-17 16:55
4大佬
交我寫外掛豪嗎
歡迎光臨 冰楓論壇 (https://bingfong.com/)
Powered by 冰楓