int main(void) { bool retVal = false; ProcessMemory* pProcMem = NULL; HANDLE hThread = NULL; /* DialogBox(NULL, MAKEINTRESOURCE(IDD_DIALOG1), NULL, About); */ pProcMem = new ProcessMemory(); retVal = pProcMem->loadProcessByWindowName("Might and MagicĀ® VI"); if (retVal) { std::cout << "Might and Magic VI Found !" <<std::endl << "==========================" <<std::endl <<std::endl << "F2 \t Give 2000 Gold" <<std::endl << "F3 \t Give 10 Food" <<std::endl <<std::endl << "F5 \t Set each heroes life points to 4000" <<std::endl; hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_fct, pProcMem, 0, 0); if (hThread) WaitForSingleObject(hThread, -1); } else std::cout << "Game not Found..." <<std::endl; delete pProcMem; system("PAUSE"); return (EXIT_SUCCESS); }
/// <summary> /// Allocate new memory block /// </summary> /// <param name="process">Process memory routines</param> /// <param name="size">Block size</param> /// <param name="desired">Desired base address of new block</param> /// <param name="protection">Memory protection</param> /// <returns>Memory block. If failed - returned block will be invalid</returns> MemBlock MemBlock::Allocate( ProcessMemory& process, size_t size, ptr_t desired /*= 0*/, DWORD protection /*= PAGE_EXECUTE_READWRITE */ ) { ptr_t desired64 = desired; DWORD newProt = CastProtection( protection, process.core().DEP() ); if (process.core().native()->VirualAllocExT( desired64, size, MEM_COMMIT, newProt ) != STATUS_SUCCESS) { desired64 = 0; if (process.core().native()->VirualAllocExT( desired64, size, MEM_COMMIT, newProt ) == STATUS_SUCCESS) LastNtStatus( STATUS_IMAGE_NOT_AT_BASE ); else desired64 = 0; } return MemBlock( &process, desired64, size, protection ); }
int thread_fct(LPVOID param) { ProcessMemory* pProcMem = (ProcessMemory*)param; bool is_running = true; bool key_pressed = false; bool retVal = false; while (is_running && pProcMem) { if (GetAsyncKeyState(VK_F2)) { if (!key_pressed) { retVal = pProcMem->write4(0x908D50, pProcMem->read4(0x908D50) + 2000); key_pressed = true; } } else if (GetAsyncKeyState(VK_F3)) { if (!key_pressed) { retVal = pProcMem->write4(0x908D2C, pProcMem->read4(0x908D2C) + 10); key_pressed = true; } } else if (GetAsyncKeyState(VK_F5)) { if (!key_pressed) { pProcMem->write4(0x90A348, 4000); pProcMem->write4(0x90B964, 4000); pProcMem->write4(0x90CF80, 4000); pProcMem->write4(0x90E59C, 4000); key_pressed = true; } } else key_pressed = false; Sleep(50); } return (0); }
/// <summary> /// Allocate new memory block /// </summary> /// <param name="process">Process memory routines</param> /// <param name="size">Block size</param> /// <param name="desired">Desired base address of new block</param> /// <param name="protection">Memory protection</param> /// <param name="own">false if caller will be responsible for block deallocation</param> /// <returns>Memory block. If failed - returned block will be invalid</returns> call_result_t<MemBlock> MemBlock::Allocate( ProcessMemory& process, size_t size, ptr_t desired /*= 0*/, DWORD protection /*= PAGE_EXECUTE_READWRITE */, bool own /*= true*/ ) { ptr_t desired64 = desired; DWORD newProt = CastProtection( protection, process.core().DEP() ); NTSTATUS status = process.core().native()->VirtualAllocExT( desired64, size, MEM_COMMIT, newProt ); if (!NT_SUCCESS( status )) { desired64 = 0; status = process.core().native()->VirtualAllocExT( desired64, size, MEM_COMMIT, newProt ); if (NT_SUCCESS( status )) return call_result_t<MemBlock>( MemBlock( &process, desired64, size, protection, own ), STATUS_IMAGE_NOT_AT_BASE ); else return status; } return MemBlock( &process, desired64, size, protection, own ); }