чит-движок — Как я могу записать в память в C ++ с WriteProcessMemory без проверки размера?

Я пытался записать в память процесса с этим кодом (чтобы создать чит-код):


#include

int main()
{
HWND hWnd = FindWindow(0, "xyz");
if(hWnd == 0)
{
MessageBox(0, "Error cannot find window.", "Error", MB_OK|MB_ICONERROR);
}
else
{
DWORD proccess_ID;
GetWindowThreadProcessId(hWnd, &proccess_ID);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proccess_ID);
if(!hProcess)
{
MessageBox(0, "Could not open the process!", "Error!", MB_OK|MB_ICONERROR);
}
else
{
int newdata = 500;
DWORD newdatasize = sizeof(newdata);
if(WriteProcessMemory(hProcess, (LPVOID)0x57C2A4, &newdata, newdatasize, NULL))
{
MessageBox(NULL, "WriteProcessMemory worked.", "Success", MB_OK + MB_ICONINFORMATION);
}
else
{
MessageBox(NULL, "Error cannot WriteProcessMemory!", "Error", MB_OK + MB_ICONERROR);
}
CloseHandle(hProcess);
}
}
return 0;
}

Когда я переписываю, например, jnz с jz, он работает нормально, потому что оба имеют одинаковый размер. Но когда я пытаюсь переписать, например, pop с помощью jmp, я получаю сообщение об ошибке, потому что эти команды имеют разный размер.

Я читаю Вот что WriteProcessMemory выполняет проверку для проверки доступного размера по указанному адресу.

Я хочу записать адрес памяти без проверки размера, чтобы программа просто перезаписывала столько байтов, сколько необходимо для кода.

С Cheat Engine я смог сделать это, потому что он предложил мне перезаписать необходимые байты.

Итак, мой вопрос, как сделать в C ++ так же, как с Cheat Engine?

2

Решение

Я не знаю ответа на ваш точный вопрос «как сделать в C ++ то же самое, что и в Cheat Engine?», Потому что я понятия не имею, как Cheat Engine работает в вашем случае. Это может быть что-то гораздо более сложное, чем просто перезапись одной инструкции.

WriteProcessMemory не проверяет то, что вы думаете, он проверяет.

Он берет последовательность байтов из адресного пространства вызывающего процесса, записывает эти байты в другой процесс. Он не декодирует ни инструкции x86 из этих байтов, ни из перезаписываемых байтов. И не может, потому что даже не знает наверняка, пишете ли вы код или данные.

Если вы знаете, что делаете, вы можете заменить более короткие инструкции более длинными инструкциями. Просто напишите новый более длинный код. Есть побочный эффект, вы также перезапишете (возможно, частично) некоторые инструкции, которые были после старой короткой. Это может нарушить код сразу после вашего патча.

Замена более длинной инструкции более короткой проще и не должна вызывать побочных эффектов, просто добавьте новую инструкцию 0x90 байт = инструкции NOP.

0

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

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