Я занимаюсь редактированием игры под названием Assault Cube, которую можно найти по адресу: http://assault.cubers.net/
Я не знаю, как это описать, поэтому я снял видео о том, как я это делаю: www.youtube.com/watch?v=SS1swxQIbDI
Обратите внимание, что мои боеприпасы сдаются до редактирования После редактирования боеприпасы остаются постоянными. В основном, в 0x45B75F, мне нужно вставить две NOP.
Я нашел следующее в интернете:
1.
BYTE NewBytes[] = { 0xXX, 0xXX, 0xXX, 0xXX, 0xXX };
*(PBYTE)0xXXXXXXXX[0] = NewBytes;
Итак, я попытался сделать:
BYTE NewBytes[] = { 0x90, 0x90 };
*(PBYTE)0x45B75F[0] = NewBytes;
Но я получаю эту ошибку: error C2109: subscript requires array or pointer type
2.
DWORD origProtect;
VirtualProtect( ( void* )0x77D142CF, 5, PAGE_EXECUTE_READWRITE, &origProtect );
memcpy( ( void* )0x77D142CF, "\x8B\xFF\x55\x8B\xEC", 5 );
VirtualProtect( ( void* )0x77D142CF, 5, origProtect, NULL );
Я бы предпочел не использовать memcpy или любой другой метод.
3.
char val = 0x48;
BOOL success = WriteProcessMemory(target, 0x10134CE0, &val, 1, NULL);
Опять же, я бы предпочел не использовать метод.
4.
uint8_t* code = (uint8_t*)0x45B75F;
*code = 0x90;
Вышеуказанное дает мне эти ошибки:
error C2065: 'uint8_t' : undeclared identifier
error C2065: 'code' : undeclared identifier
error C2065: 'uint8_t' : undeclared identifier
error C2059: syntax error : ')'
error C2065: 'code' : undeclared identifier
5.
*(char*)0x45B75F = 0x90;
Это приводит к краху.
1.
Вы дважды разыменовались здесь. То, что вы хотите, это:
*((BYTE *) (0x45B75F + 0)) = NewBytes[0];
*((BYTE *) (0x45B75F + 1)) = NewBytes[1];
При перезаписи кода необходимо убедиться, что при выполнении не выполняется код, который вы перезаписываете. В противном случае вы можете ввести условие гонки, когда вы случайно вводите недействительные или нежелательные инструкции в течение короткого периода времени. Вы можете изучить атомарные операции (где это применимо) для выполнения вашего двоичного переписывания.
2.
Ваше отвращение к memcpy
здесь кажется сомнительным. Возможно, что компилятор оптимизирует memcpy
в двойное слово-MOV
сопровождаемый единственным байтом MOV
, Вы можете решить эту проблему, кодируя свои 5 байтов в одно 32-разрядное целое число и один байт. Кроме того, вы можете записать 5 последовательных записей в память, и компилятор может автоматически объединить их. Например:
code[0] = byte0;
code[1] = byte1;
etc.
3.
Почему вы хотите избежать использования этой функции? Я не знаком с Windows, но это, кажется, стандартный способ записи в память другого процесса.
4.
uint8_t
определяется в stdint.h
Заголовок стандартной библиотеки C99; Вы должны включить это. Ошибка по поводу code
не быть объявленным является побочным эффектом первой ошибки с uint8_t
,
5.
Это не лишено смысла. Вы вводите NOP
в предполагаемый четко определенный адрес, независимо от того, что вы перезаписываете. Возьмите этот простой пример:
Предположим, у меня есть инструкция в памяти вызова I1
и занимает два байта: [I1_0, I1_1]
, Прямо сейчас, то, что вы делаете, это потенциально перезаписывает один из этих байтов NOP
без учета того, будут ли окружающие байты оставаться действительными в качестве инструкций, например, [0x90, I1_1]
или же [I1_0, 0x90]
, Если I1_0
или же I1_1
одни недопустимые последовательности кодов операций, то, конечно, программа потерпит крах!
Другая причина, по которой это может не сработать, заключается в том, что отладчик (в вашем случае, OllyDbg) обычно (по крайней мере, в Mac и Linux) размещает адресное пространство отлаживаемого процесса иначе, чем ОС, когда Процесс запускается изначально. Это означает, что адрес как 0x45B75F
может быть значимым в отладчике, но бессмысленным при попытке оперировать с памятью собственного процесса.
Третья причина, по которой это может не сработать, заключается в том, что запись в память (без дополнительной информации от вас), по-видимому, работает с памятью вашего процесса, а не с памятью другого процесса (если это не то, что вы пытаетесь сделать). Если этот адрес памяти даже сопоставлен, он все еще может быть недоступен для записи (из-за защиты страницы).
Других решений пока нет …