-
Notifications
You must be signed in to change notification settings - Fork 0
/
memory.hpp
130 lines (112 loc) · 3.17 KB
/
memory.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#pragma once
#include <Windows.h>
#include<TlHelp32.h>
#include <iostream>
#include <tchar.h> // _tcscmp
#include <vector>
class Memory {
public:
DWORD pID = NULL;
HANDLE processHandle = NULL;
DWORD gameBaseAddress = NULL;
Memory() {
pID = get_porcId_by_name("rwr_game.exe");
if (pID == NULL) {
std::cout << "Failed to launch!" << std::endl;
std::cout << "Please Launch the game before running the hack!" << std::endl;
std::cout << "启动失败!" << std::endl;
std::cout << "请先运行游戏再运行辅助!" << std::endl;
return;
}
std::cout << pID << std::endl;
processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
if (processHandle == INVALID_HANDLE_VALUE || processHandle == NULL) { // error handling
std::cout << "Failed to open process" << std::endl;
std::cout << "无法打开游戏进程" << std::endl;
return;
}
char gameName[] = "rwr_game.exe";
gameBaseAddress = GetModuleBaseAddress(_T(gameName), pID);
}
template <typename var>
bool write_mem(DWORD address, var value) {
return WriteProcessMemory(processHandle, (LPVOID)address, &value, sizeof(var), NULL);
}
template <typename var>
var read_mem(DWORD address) {
var value;
ReadProcessMemory(processHandle, (LPCVOID)address, &value, sizeof(var), NULL);
return value;
}
DWORD FindPointer(int offset_num, DWORD baseaddr, int offsets[])
{
DWORD Address = baseaddr;
int total = offset_num;
for (int i = 0; i < total; i++) //Loop trough the offsets
{
ReadProcessMemory(processHandle, (LPCVOID)Address, &Address, sizeof(DWORD), NULL);
Address += offsets[i];
}
return Address;
}
private:
DWORD GetModuleBaseAddress(TCHAR* lpszModuleName, DWORD pID) {
DWORD dwModuleBaseAddress = 0;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pID); // make snapshot of all modules within process
MODULEENTRY32 ModuleEntry32 = { 0 };
ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
if (Module32First(hSnapshot, &ModuleEntry32)) //store first Module in ModuleEntry32
{
do {
if (_tcscmp(ModuleEntry32.szModule, lpszModuleName) == 0) // if Found Module matches Module we look for -> done!
{
dwModuleBaseAddress = (DWORD)ModuleEntry32.modBaseAddr;
break;
}
} while (Module32Next(hSnapshot, &ModuleEntry32)); // go through Module entries in Snapshot and store in ModuleEntry32
}
CloseHandle(hSnapshot);
return dwModuleBaseAddress;
}
static DWORD get_porcId_by_name(const std::string_view targetProcess) {
DWORD procId = 0;
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnap != INVALID_HANDLE_VALUE)
{
PROCESSENTRY32 procEntry;
procEntry.dwSize = sizeof(procEntry);
if (Process32First(hSnap, &procEntry))
{
do
{
if (!targetProcess.compare(procEntry.szExeFile))
{
procId = procEntry.th32ProcessID;
//std::cout << "found pID:" << procId << std::endl;
//break;
}
} while (Process32Next(hSnap, &procEntry));
}
}
CloseHandle(hSnap);
return procId;
}
};
struct Vector3 {
float a;
float b;
float c;
};
struct Point {
float x;
float z;
float y;
};
struct TwoPoint {
float x1;
float z1;
float y1;
float x2;
float z2;
float y2;
};