All pastes #274924 Raw Edit

memory searching

public cpp v1 · immutable
·published 2006-12-11 02:22 UTC
rendered paste body
#include "StdAfx.h"#include "gameclienthandler.h"#include <vector>using namespace std;GameClientHandler::GameClientHandler(CWnd * vmwareWindow, CWnd * targetClientWindow, GraphicsHandler * graphicsHandler){		unsigned long numberArray[83];	for (int i = 0; i < 82; i++)	{		numberArray[i] = i;	}	memcpy(m_test_numberArray,&numberArray[0],83 * 4);		DWORD targetProcessID = 0;	GetWindowThreadProcessId(targetClientWindow->GetSafeHwnd(),&targetProcessID);	HANDLE targetProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_READ,false,targetProcessID);		MEMORY_BASIC_INFORMATION memoryInfo;	SYSTEM_INFO systemInfo;	GetSystemInfo(&systemInfo);	unsigned long currentAppAddress = (unsigned long)systemInfo.lpMinimumApplicationAddress;	long memoryInfoSize = sizeof(MEMORY_BASIC_INFORMATION);	while (currentAppAddress < (unsigned long) systemInfo.lpMaximumApplicationAddress)	{		memoryInfo.RegionSize = 0;		DWORD sizeRead = VirtualQueryEx(targetProcessHandle,(long *)currentAppAddress,&memoryInfo,memoryInfoSize);		if (sizeRead == memoryInfoSize)		{			if ((memoryInfo.State == MEM_COMMIT) && (memoryInfo.RegionSize > 0))			{				_FindInitialOffset((unsigned long)memoryInfo.BaseAddress, memoryInfo.RegionSize, targetProcessHandle);			}			currentAppAddress = ((unsigned long)memoryInfo.BaseAddress) + ((unsigned long)memoryInfo.RegionSize);		}	}	CloseHandle(targetProcessHandle);	}void tester(){	unsigned long numbers[83];	for (int i = 0; i < 82; i++)	{		numbers[i] = i;	}	unsigned char * buffer = new unsigned char[83 * sizeof(unsigned long)];	memcpy(buffer,&numbers[0],83 * sizeof(unsigned long));	vector<unsigned long> matchingAddresses;	unsigned long buffIndex = 0;	unsigned long i = 0;	unsigned long *comper = 0;	comper = (unsigned long *)(&buffer[buffIndex]);	for (; (i < 83) && (*comper == i); comper = (unsigned long *)(&buffer[buffIndex + ((++i) * 4)]));	if (i == 82)	{		//found one!		matchingAddresses.push_back(buffIndex);	}}void GameClientHandler::_FindInitialOffset(unsigned long startAddress, long length, HANDLE hProcess){	HANDLE HeapHandle = GetProcessHeap();	vector<unsigned long> matchingAddresses;	unsigned char *buffer = (unsigned char *) HeapAlloc(HeapHandle,HEAP_ZERO_MEMORY,length);		////189a2174 through 189a22bc		0x00000d34		an array of unsigned integers, starting at 0 and going to 82	//through	//								0x00000e7c	//0 through 82 is 83 unsigned ints == 332 bytes	SIZE_T numRead = 0;	ReadProcessMemory(hProcess, (unsigned long *)startAddress, buffer, length, &numRead);	long stopPoint = (numRead < length)?numRead - 332:length - 332;	for (long buffIndex = 0; buffIndex < stopPoint; buffIndex++)	{		unsigned long i = 0;		for (; (i < (83 * 4)) && (m_test_numberArray[i] == buffer[i]); i++);		if (i == (83*4) - 1)		{			//found one!			matchingAddresses.push_back(startAddress + buffIndex);		}		/*unsigned long i = 0;		unsigned long *comper = 0;		comper = (unsigned long *)(&buffer[buffIndex]);		for (; (i < 83) && (*comper == i); comper = (unsigned long *)(&buffer[buffIndex + ((++i) * 4)]));		if (i == 82)		{			//found one!			matchingAddresses.push_back(startAddress + buffIndex);		}*/	}	HeapFree(HeapHandle,0,buffer);}GameClientHandler::~GameClientHandler(void){}