-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathOffset.cpp
131 lines (106 loc) · 3.26 KB
/
Offset.cpp
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
131
#define _DEFINE_VARS
#include "Offset.h"
#include "Patch.h"
// #ifndef ArraySize
// #define ArraySize(x) (sizeof((x)) / sizeof((x)[0]))
// #endif
DWORD GetDllOffset(const wchar_t *DllName, int Offset)
{
HMODULE hMod = GetModuleHandle(DllName);
if (!hMod)
hMod = LoadLibrary(DllName);
if (!hMod)
return 0;
if (Offset < 0)
return (DWORD)GetProcAddress(hMod, (LPCSTR)(-Offset));
return ((DWORD)hMod) + Offset;
}
DWORD GetDllOffset(const int no)
{
static const wchar_t *dlls[] = {L"D2Client.DLL", L"D2Common.DLL", L"D2Gfx.DLL", L"D2Lang.DLL",
L"D2Win.DLL", L"D2Net.DLL", L"D2Game.DLL", L"D2Launch.DLL", L"Fog.DLL", L"BNClient.DLL",
L"Storm.DLL", L"D2Cmp.DLL", L"D2Multi.DLL"};
// low 8bit >12
if ((no & 0xff) > 12)
return 0;
return GetDllOffset(dlls[no & 0xff], no >> 8);
}
void DefineOffsets()
{
DWORD *p = (DWORD *)&_D2PTRS_START;
do
{
*p = GetDllOffset(*p);
} while (++p <= (DWORD *)&_D2PTRS_END);
}
BOOL WriteBytes(void *pAddr, void *pData, DWORD dwLen)
{
DWORD dwOld;
if (!VirtualProtect(pAddr, dwLen, PAGE_READWRITE, &dwOld))
return FALSE;
::memcpy(pAddr, pData, dwLen);
return VirtualProtect(pAddr, dwLen, dwOld, &dwOld);
}
void InterceptLocalCode(BYTE bInst, DWORD pAddr, DWORD pFunc, DWORD dwLen)
{
BYTE *bCode = new BYTE[dwLen];
::memset(bCode, 0x90, dwLen);
DWORD dwFunc = pFunc - (pAddr + 5);
bCode[0] = bInst;
*(DWORD *)&bCode[1] = dwFunc;
WriteBytes((void *)pAddr, bCode, dwLen);
delete[] bCode;
}
void PatchCall(DWORD dwAddr, DWORD dwFunc, DWORD dwLen)
{
InterceptLocalCode(INST_CALL, dwAddr, dwFunc, dwLen);
}
void PatchJmp(DWORD dwAddr, DWORD dwFunc, DWORD dwLen)
{
InterceptLocalCode(INST_JMP, dwAddr, dwFunc, dwLen);
}
void PatchBytes(DWORD dwAddr, DWORD dwValue, DWORD dwLen)
{
BYTE *bCode = new BYTE[dwLen];
::memset(bCode, (BYTE)dwValue, dwLen);
WriteBytes((LPVOID)dwAddr, bCode, dwLen);
delete[] bCode;
}
void InstallPatches()
{
for (unsigned int x = 0; x < ARRAYSIZE(Patches); x++)
{
Patches[x].bOldCode = new BYTE[Patches[x].dwLen];
::ReadProcessMemory(GetCurrentProcess(), (void *)Patches[x].dwAddr, Patches[x].bOldCode, Patches[x].dwLen, NULL);
Patches[x].pFunc(Patches[x].dwAddr, Patches[x].dwFunc, Patches[x].dwLen);
}
}
void InstallConditional()
{
for (unsigned int x = 0; x < ARRAYSIZE(Conditional); x++)
{
if (Conditional[x].enabled == NULL || *Conditional[x].enabled != TRUE)
continue;
Conditional[x].bOldCode = new BYTE[Conditional[x].dwLen];
::ReadProcessMemory(GetCurrentProcess(), (void *)Conditional[x].dwAddr, Conditional[x].bOldCode, Conditional[x].dwLen, NULL);
Conditional[x].pFunc(Conditional[x].dwAddr, Conditional[x].dwFunc, Conditional[x].dwLen);
}
}
void RemovePatches()
{
for (unsigned int x = 0; x < ARRAYSIZE(Patches); x++)
{
WriteBytes((void *)Patches[x].dwAddr, Patches[x].bOldCode, Patches[x].dwLen);
delete[] Patches[x].bOldCode;
}
}
void RemoveConditional()
{
for (unsigned int x = 0; x < ARRAYSIZE(Conditional); x++)
{
if (Conditional[x].enabled == NULL || *Conditional[x].enabled != TRUE)
continue;
WriteBytes((void *)Conditional[x].dwAddr, Conditional[x].bOldCode, Conditional[x].dwLen);
delete[] Conditional[x].bOldCode;
}
}