aboutsummaryrefslogtreecommitdiff
path: root/source2-basehook/Utilities/Utilities.cpp
blob: ea6490970028f8864716b209b5b61273cd9a999a (plain) (blame)
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
#include "Utilities.hpp"

uintptr_t Utilities::FindPattern(const char* Module, const char* Sig)
{
#define IN_RANGE(x, a, b) (x >= a && x <= b)
#define GET_BITS(x) (IN_RANGE((x & (~0x20)), 'A', 'F') ? ((x & (~0x20)) - 'A' + 0xA): (IN_RANGE(x, '0', '9') ? x - '0': 0))
#define GET_BYTE(x) (GET_BITS(x[0]) << 4 | GET_BITS(x[1]))

	const auto ModuleHandle = GetModuleHandleA(Module);
	const auto DOSHeader = PIMAGE_DOS_HEADER(ModuleHandle);
	const auto NTHeaders = PIMAGE_NT_HEADERS(reinterpret_cast<std::uint8_t*>(ModuleHandle) + DOSHeader->e_lfanew);

	uintptr_t StartAddress = (uintptr_t)GetModuleHandleA(Module);
	uintptr_t Size = (StartAddress + (uintptr_t)NTHeaders->OptionalHeader.SizeOfImage);

	const char* Pat = Sig;
	uintptr_t FirstMatch = 0;
	for (uintptr_t pCur = StartAddress; pCur < Size; pCur++)
	{
		if (!*Pat) return FirstMatch;
		if (*(PBYTE)Pat == ('\?') || *(BYTE*)pCur == GET_BYTE(Pat))
		{
			if (!FirstMatch) FirstMatch = pCur;
			if (!Pat[2]) return FirstMatch;
			if (*(PWORD)Pat == ('\?\?') || *(PBYTE)Pat != ('\?')) Pat += 3;
			else Pat += 2;
		}
		else
		{
			Pat = Sig;
			FirstMatch = 0;
		}
	}
	return NULL;
}

uintptr_t Utilities::Dereference(uintptr_t Address, unsigned int Offset)
{
	if (Address == 0)
		return 0;

	if (sizeof(uintptr_t) == 8)
		return Address + (int)((*(int*)(Address + Offset) + Offset) + sizeof(int));

	return (uintptr_t) * (unsigned long*)(Address + Offset);
}

void Utilities::DumpNetVars()
{
	FILE* FileHandle;
	FileHandle = fopen("G:\\NetVar_Dump.txt", "w");

	for (ClientClass* ClientClasses = pClient->GetAllClasses(); ClientClasses; ClientClasses = ClientClasses->m_pNext)
	{
		if (!ClientClasses->RecvTable || !ClientClasses->RecvTable->NetvarsArray || !ClientClasses->m_pClassName)
			continue;

		Msg(Color(151, 173, 209, 255), "%s : [%d] \n", ClientClasses->m_pClassName, ClientClasses->RecvTable->NumOfNetvars);
		fprintf(FileHandle, "%s : [%d] \n", ClientClasses->m_pClassName, ClientClasses->RecvTable->NumOfNetvars);

		for (int i = 0; i < ClientClasses->RecvTable->NumOfNetvars; i++)
		{
			Netvar* Var = ClientClasses->RecvTable->NetvarsArray[i].Netvar;

			if (!Var || !Var->NetvarName || !Var->TypeName || !Var->Offset)
				break;

			Msg(Color(91, 141, 222, 255), "\t[%d] %s -> 0x%x  [%s] \n", i + 1, Var->NetvarName, Var->Offset, Var->TypeName);
			fprintf(FileHandle, "\t[%d] %s -> 0x%x  [%s] \n", i + 1, Var->NetvarName, Var->Offset, Var->TypeName);
		}
	}

	fclose(FileHandle);
}