Snippets

[GH]Rake EvaluatePointer

Created by [GH]Rake

uintptr_t EvaluatePointer(HANDLE hProcHandle, uintptr_t pointer, size_t numOffsets, uintptr_t offsets[])
{
	//std::cout << "BaseAddress    : 0x" << std::hex << pointer << std::endl << std::endl;

	//Dereference pointer by reading the value of the pointer
	if (!ReadProcessMemory(hProcHandle, (LPCVOID)pointer, &pointer, sizeof(pointer), nullptr))
	{
		return 0; //if RPM fails
	}

	//For each offset
	for (size_t i = 0; i < numOffsets; i++)
	{
		//std::cout << "Points to      : 0x" << std::hex << pointer << std::endl << std::endl;
		//std::cout << "+offset 0x" << std::hex << offsets[i] << "  : 0x" << std::hex << pointer + offsets[i] << std::endl << std::endl;

		//Add offset and dereference that address
		if (!ReadProcessMemory(hProcHandle, (LPVOID)(pointer + offsets[i]), &pointer, sizeof(pointer), nullptr))
		{
			return 0; //if RPM fails
		}
	}

	//std::cout << "Final Address  : 0x" << std::hex << pointer << std::endl << std::endl;
	//int value;
	//ReadProcessMemory(hProcHandle, (void*)pointer, &value, sizeof(value), NULL);
	//std::cout << "Final Value    : 0x" << std::hex << value << " or decimal " << std::dec << value << std::endl << std::endl;

	return pointer; //return address pointed to by pointer
}

uintptr_t EvaluatePointerVA(HANDLE hProcHandle, uintptr_t pointer, size_t numOffsets, ...)
{
	va_list args; //create argument list to store arguments
	va_start(args, numOffsets); //populate argument "args" with all arguments after numOffsets

	//std::cout << "BaseAddress    : 0x" << std::hex << pointer << std::endl << std::endl;

	//Dereference pointer by reading the value of the pointer
	if (!ReadProcessMemory(hProcHandle, (LPCVOID)pointer, &pointer, sizeof(pointer), NULL))
	{
		return 0; //if RPM fails
	}

	//For each offset
	for (size_t i = 0; i < numOffsets; i++)
	{
		uintptr_t offset = va_arg(args, uintptr_t);
		//std::cout << "Points to      : 0x" << std::hex << pointer << std::endl << std::endl;
		//std::cout << "+offset 0x" << std::hex << offset << "  : 0x" << std::hex << pointer + offset << std::endl << std::endl;

		//Add offset and dereference that address
		if (!ReadProcessMemory(hProcHandle, (LPVOID)(pointer + offset), &pointer, sizeof(pointer), nullptr))
		{
			return 0;//if RPM fails
		}
	}

	//std::cout << "Final Address  : 0x" << std::hex << pointer << std::endl << std::endl;
	//int value;
	//ReadProcessMemory(hProcHandle, (void*)pointer, &value, sizeof(value), NULL);
	//std::cout << "Final Value    : 0x" << std::hex << value << " or decimal " << std::dec << value << std::endl << std::endl;

	va_end(args); //cleanup after va_list
	return pointer; //return address pointed to by pointer
}

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.