тральщик — C ++ Базовый адрес процесса

Я пытаюсь изменить количество мин на Minesweeper, и у меня есть базовый адрес указателя: «Minesweeper.exe» + AAA38. Я искал способ найти изменяющийся базовый адрес процесса, к которому я могу добавить AAA38, и нашел это:

DWORD GetModuleBase(HANDLE hProc, string &sModuleName)
{
HMODULE *hModules;
char szBuf[50];
DWORD cModules;
DWORD dwBase = -1;

EnumProcessModules(hProc, hModules, 0, &cModules);
hModules = new HMODULE[cModules/sizeof(HMODULE)];

if(EnumProcessModules(hProc, hModules, cModules/sizeof(HMODULE), &cModules)) {
for(int i = 0; i < cModules/sizeof(HMODULE); i++) {
if(GetModuleBaseName(hProc, hModules[i], szBuf, sizeof(szBuf))) {
if(sModuleName.compare(szBuf) == 0) {
dwBase = (DWORD)hModules[i];
break;
}
}
}
}

delete[] hModules;

return dwBase;
}

Я сделал все включает правильно:

#include <Psapi.h>
#include <TlHelp32.h>
#pragma comment( lib, "psapi" )

Я запускаю его, но получаю ошибки:

'K32GetModuleBaseNameW' : cannot convert parameter 3 from 'char [50]' to 'LPWSTR'

а также

'<' : signed/unsigned mismatch<br><br>

Я попытался изменить строку sModuleName на тип LPWSTR, и это исправило первую ошибку. Добавление другого < значит это было:

for(int i = 0; i << cModules/sizeof(HMODULE); i++) {

вместо:

for(int i = 0; i < cModules/sizeof(HMODULE); i++) {

исправлена ​​вторая ошибка.

После того, как ошибки исчезли, я попытался запустить их и получил это исключение:

Unhandled exception at 0x770215de in Minesweeper Mines.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0034f8f8.

с последующим

Unhandled exception at 0x770215de in Minesweeper Timer.exe: 0x00000000: The operation completed successfully.

Кто-нибудь знает, как исправить эту ошибку? Или, может быть, даже рабочий способ найти базовый адрес процесса? Я искал способ и не мог найти ничего полезного.

Я просто поставлю весь свой main.cpp

#include <iostream>
#include <Windows.h>
#include <string>
#include <ctime>
#include <TlHelp32.h>
#include <Psapi.h>
#pragma comment( lib, "psapi" )

std::string GameName = "Minesweeper";
LPCWSTR LGameWindowName = L"Minesweeper";
std::string GameStatus;
HMODULE *hModules;

bool GameAvailable;
bool UpdateOnNextRun;

//time vars
bool TimeStatus;
BYTE TimeValue[] = {0x0};
DWORD TimeOffsets[] = {0x18, 0x20};
DWORD TimeBaseAddress;//mine vars
bool MineStatus;
BYTE MineValue[] = {0x0};
DWORD MineOffsets[] = {0x18, 0x8};
DWORD MineBaseAddress;

//main loop
int main()
{
HWND hGameWindow = NULL;
int timeSinceLastUpdate = clock();
int GameAvailTimer = clock();
int onePressTimer = clock();
DWORD ProcID = NULL;
HANDLE hProcHandle = NULL;
UpdateOnNextRun = true;
std::string $TimeStatus = "OFF";
std::string $MineStatus = "OFF";

while(!GetAsyncKeyState(VK_INSERT))
{
if(clock() - GameAvailTimer > 100)
{
GameAvailTimer = clock();
GameAvailable = false;

hGameWindow = FindWindow(NULL, LGameWindowName);
if(hGameWindow)
{
GetWindowThreadProcessId(hGameWindow, &ProcID);
MineBaseAddress = GetModuleBase(hProcHandle);
TimeBaseAddress = GetModuleBase(hProcHandle);
if(ProcID != 0)
{
hProcHandle = OpenProcess(PROCESS_ALL_ACCESS,        FALSE, ProcID);
if(hProcHandle == INVALID_HANDLE_VALUE || hProcHandle == NULL)
{
GameStatus = "Failed To Open Valid Handle";
}
else
{
GameStatus = "Ready To Hack";
GameAvailable = true;
}
}
else
{
GameStatus = "Failed To Get Process ID";
}
}
else
{
GameStatus = "Minesweeper Not Found";
}

if(UpdateOnNextRun || clock() - timeSinceLastUpdate > 5000)
{
//main loop
system("cls");
std::cout << "========================================================" << std::endl;
std::cout << "                Minesweeper MineEdit" <<     std::endl;
std::cout << "========================================================" <<std::endl << std::endl;
std::cout << "GAME STATUS:" << GameStatus << std::endl << std::endl;
std::cout << "[F1] Time To 0   -> " <<$TimeStatus << " <- " << std::endl;
std::cout << "[F2] Instant Win -> " <<$MineStatus << " <- " << std::endl;
std::cout << "[INSERT] Exit" << std::endl;
std::cout << "[debug] TimeBaseAddress = " << TimeBaseAddress << std::endl;
std::cout << "[debug] MineBaseAddress = " << MineBaseAddress << std::endl;
UpdateOnNextRun = false;
timeSinceLastUpdate = clock();
}

if(GameAvailable)
{
//write to addresses
}
}

if(clock() - onePressTimer > 300)
{
//TIME TURNED ON
if(GetAsyncKeyState(VK_F1))
{
onePressTimer = clock();
UpdateOnNextRun = true;
TimeStatus = !TimeStatus;

if(TimeStatus)
{
$TimeStatus = "ON";
}
else
{
$TimeStatus = "OFF";
}
}
//WIN TURNED ON
else if(GetAsyncKeyState(VK_F2))
{
onePressTimer = clock();
UpdateOnNextRun = true;
MineStatus = !MineStatus;

if(MineStatus)
{
$MineStatus = "ON";
}
else
{
$MineStatus = "OFF";
}
}
}
}
CloseHandle(hProcHandle);
CloseHandle(hGameWindow);
return ERROR_SUCCESS;
}

//find dynamic address from pointer and offsets
DWORD FindDynAddr(int PointerLevel, HANDLE hProcHandle, DWORD Offsets[], DWORD     BaseAddress)
{
DWORD pointer = BaseAddress;
DWORD pSize;

DWORD pAddr;
for(int j = 0; j < PointerLevel; j++)
{
if(j == 0)
{
ReadProcessMemory(hProcHandle, (LPCVOID)pointer, &pSize, sizeof(pSize), NULL);
}

pAddr = pSize + Offsets[j];
ReadProcessMemory(hProcHandle, (LPCVOID)pAddr, &pSize, sizeof(pSize), NULL);
}
return pAddr;
}

//write to found addresses
void WriteAddresses(HANDLE hProcHandle)
{
DWORD Address;
if(TimeStatus)
{
Address = FindDynAddr(2, hProcHandle, TimeOffsets, TimeBaseAddress);
WriteProcessMemory(hProcHandle,(BYTE*)Address, &TimeValue,      sizeof(TimeValue), NULL);
}

if(MineStatus)
{
Address = FindDynAddr(2, hProcHandle, MineOffsets, MineBaseAddress);
WriteProcessMemory(hProcHandle,(BYTE*)Address, &MineValue,      sizeof(MineValue), NULL);
}
}

//find base address of minesweeper.exe
DWORD GetModuleBase(HANDLE hProc)
{
LPWSTR sModuleName = L"MineSweeper.exe";
LPWSTR szBuf;
DWORD cModules;
DWORD dwBase = -1;

EnumProcessModules(hProc, hModules, 0, &cModules);
hModules = new HMODULE[cModules/sizeof(HMODULE)];

if(EnumProcessModules(hProc, hModules, cModules/sizeof(HMODULE), &cModules))
{
for(unsigned int i = 0; i < cModules/sizeof(HMODULE); i++)
{
if(GetModuleBaseName(hProc, hModules[i], szBuf, sizeof(szBuf)))
{
if(wcscmp(sModuleName, szBuf) == 0)
{
dwBase = (DWORD)hModules[i];
break;
}
}
}
}

delete[] hModules;

return dwBase;
}

-1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …