-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathAddress.h
118 lines (115 loc) · 2.21 KB
/
Address.h
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
#pragma once
#include <vector>
#include <windows.h>
template <typename T>
class Address
{
public:
DWORD base;
std::vector<DWORD> offset;
bool is_readable();
bool is_writeable();
DWORD GetFinalAddress();
T GetValue();
bool SetValue(T);
Address<T>& operator+(DWORD of);
Address(DWORD bs);
};
template <class T>
bool Address<T>::is_readable()
{
DWORD b = base;
if (IsBadReadPtr((void*)b, 4))
return false;
for (int i = 0; i < offset.size(); i++)
{
b = *(DWORD*)b + offset[i];
if (IsBadReadPtr((void*)b, 4))
return false;
}
if (IsBadReadPtr((void*)b, sizeof(T)))
return false;
return true;
}
template <class T>
bool Address<T>::is_writeable()
{
DWORD b = base;
if (IsBadReadPtr((void*)b, 4))
return false;
for (int i = 0; i < offset.size(); i++)
{
b = *(DWORD*)b + offset[i];
if (IsBadReadPtr((void*)b, 4))
return false;
}
if (IsBadWritePtr((void*)b, sizeof(T)))
return false;
return true;
}
template <class T>
DWORD Address<T>::GetFinalAddress()
{
DWORD b = base;
if (IsBadReadPtr((void*)b, 4))
return nullptr;
for (int i = 0; i < offset.size(); i++)
{
b = *(DWORD*)b + offset[i];
if (IsBadReadPtr((void*)b, 4))
return nullptr;
}
return b;
}
template <class T>
T Address<T>::GetValue()
{
DWORD b = base;
if (IsBadReadPtr((void*)b, 4))
return static_cast<T>(0);
for (int i = 0; i < offset.size(); i++)
{
b = *(DWORD*)b + offset[i];
if (IsBadReadPtr((void*)b, 4))
return static_cast<T>(0);
}
if (IsBadReadPtr((void*)b, sizeof(T)))
return static_cast<T>(0);
return *(T*)b;
}
template <class T>
bool Address<T>::SetValue(T t)
{
DWORD b = base;
if (IsBadReadPtr((void*)b, 4))
return false;
for (size_t i = 0; i < offset.size(); i++)
{
b = *(DWORD*)b + offset[i];
if (IsBadReadPtr((void*)b, 4))
return false;
}
if (IsBadReadPtr((void*)b, sizeof(T)))
return false;
//if (IsBadWritePtr((void*)b, sizeof(T)))
//{
DWORD op;
VirtualProtect((LPVOID)b, sizeof(T), PAGE_READWRITE, &op);
*(T*)b = t;
VirtualProtect((LPVOID)b, sizeof(T), op, &op);
return true;
//}
*(T*)b = t;
return true;
}
template <class T>
Address<T>& Address<T>::operator+(DWORD of)
{
this->offset.push_back(of);
return *this;
}
template <class T>
Address<T>::Address(DWORD bs)
{
this->base = bs;
}