#include "StdAfx.h" #include "gameclienthandler.h" #include 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 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 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) { }