73 lines
No EOL
1.9 KiB
C++
73 lines
No EOL
1.9 KiB
C++
#include <iostream>
|
|
#include <Windows.h>
|
|
#include <Psapi.h>
|
|
#include <vector>
|
|
#include <string>
|
|
#include <tchar.h>
|
|
#include <TlHelp32.h>
|
|
|
|
using namespace std;
|
|
|
|
// https://stackoverflow.com/questions/26572459/c-get-module-base-address-for-64bit-application
|
|
DWORD_PTR GetProcessBaseAddress(DWORD processID)
|
|
{
|
|
DWORD_PTR baseAddress = 0;
|
|
HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);
|
|
HMODULE* moduleArray;
|
|
LPBYTE moduleArrayBytes;
|
|
DWORD bytesRequired;
|
|
|
|
if (processHandle)
|
|
{
|
|
if (EnumProcessModules(processHandle, NULL, 0, &bytesRequired))
|
|
{
|
|
if (bytesRequired)
|
|
{
|
|
moduleArrayBytes = (LPBYTE)LocalAlloc(LPTR, bytesRequired);
|
|
|
|
if (moduleArrayBytes)
|
|
{
|
|
unsigned int moduleCount;
|
|
|
|
moduleCount = bytesRequired / sizeof(HMODULE);
|
|
moduleArray = (HMODULE*)moduleArrayBytes;
|
|
|
|
if (EnumProcessModules(processHandle, moduleArray, bytesRequired, &bytesRequired))
|
|
{
|
|
baseAddress = (DWORD_PTR)moduleArray[0];
|
|
}
|
|
|
|
LocalFree(moduleArrayBytes);
|
|
}
|
|
}
|
|
}
|
|
|
|
CloseHandle(processHandle);
|
|
}
|
|
|
|
return baseAddress;
|
|
}
|
|
|
|
int main() {
|
|
|
|
DWORD pid = 0;
|
|
HWND hwnd = FindWindowA(NULL, "DevilutionX");
|
|
GetWindowThreadProcessId(hwnd, &pid);
|
|
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, NULL, pid);
|
|
if (hProc == NULL) {
|
|
cout << "kys" << endl;
|
|
return 1;
|
|
}
|
|
|
|
uintptr_t base = (uintptr_t)GetProcessBaseAddress(pid);
|
|
uintptr_t plrA = base + 0x0058E470;
|
|
uintptr_t plr;
|
|
ReadProcessMemory(hProc, (LPCVOID)plrA, &plr, sizeof(plr), 0);
|
|
uintptr_t goldA = plr + 0x3FE4;
|
|
int gold = 0;
|
|
ReadProcessMemory(hProc, (LPCVOID)goldA, &gold, sizeof(gold), 0);
|
|
|
|
cout << gold;
|
|
|
|
return 0;
|
|
} |