|
|
Подпольщик Tera
OFFLINE
Регистрация: 16.03.2015
Сообщений: 450
Благодарностей:
196 всего
|
| |
|
Цитата:
Сообщение от Paladin
Лень разбираться в СЕ коде. Если я правильно понимаю, тебе нужно пропатчить код игры, поставив там где-то перенаправление на твой код?
Тогда где-то так:
PHP код:
var
bBuf: byte;
dBuf: DWord;
pMem: Pointer;
OldProtect: Cardinal;
NumberOfBytesWritten: SIZE_T;
const
oldAddress: DWord = $0051040; // здесь "$0051040" - это адрес, по которому собираешься патчить
begin
pMem := Pointer(oldAddress);
if VirtualProtectEx(proces, pMem, 1024, PAGE_EXECUTE_READWRITE, OldProtect) then
begin
// jmp
bBuf := $E9;
// У WPM желательно проверять result и число записанных байт, я опустил этот момент
WriteProcessMemory(proces, pMem, @bBuf, 1, NumberOfBytesWritten);
// Расчитываем адрес для jmp
// Предполагается, что указатель PD уже получил от фукнкции VirtualAllocEx значение выделенной памяти
dBuf := DWord(pd) - oldAddress - 5;
WriteProcessMemory(proces, pMem, @dBuf, 4, NumberOfBytesWritten);
// Восстанавливаем атрибуты защиты памяти по умолчанию
VirtualProtectEx(proces, pMem, 1024, OldProtect, OldProtect);
end else
begin
ShowMessage('Не удалось изменить защиту участка памяти :(' + #13#10 +
'Код ошибки: ' + IntToStr( GetLastError() ));
end;
end;
Не забудь потом из кода, на который перенаправляешь, вернуться назад или вернуть управление (ret) (смотря что за код ты внедряешь).
Дальше давай сам. И не воруй чужие оффсеты в тере
Добавлено через 7 минут
Оффтоп
В 32-битных процессах для call и jmp адрес для вызова\прыжка высчитывается так:
address := (NewAddress - OldAddress - 5);
|
Вот что получается -
Решил не танцевать с бубном и пойти путем нуба и так указал адрес для создание пространства $06E80000 и туда веду запись инструкций
только вот это глупо ну для начала хватит ...
Хочу реализовать как в СЕ скрипты только мне нужно что бы создавалось пустое пространство в игре и по нужно мне адресу прописывался jump на ту пустоту дальше идут куча байт и возврат на нужный мне адрес
Код:
var
bBuf: byte;
dBuf: DWord;
pMem: Pointer;
OldProtect: Cardinal;
NumberOfBytesWritten: DWORD_PTR;
adreg:Cardinal;
const
oldAddress: DWord = $0048D90B; // здесь "$0051040" - это адрес, по которому собираешься патчить
begin
WindowName := FindWindow(nil,'Plants vs. Zombies');
ThreadId := GetWindowThreadProcessId(WindowName,@pid);
proces := OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
pd := VirtualAllocEx(proces,Ptr($06E80000), 2048, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
s := IntToHex(DWord(pd), 8);
pMem := Pointer(oldAddress);
if VirtualProtectEx(proces, pMem, 1024, PAGE_EXECUTE_READWRITE, OldProtect) then
begin
// jmp
bBuf := $E9;
// У WPM желательно проверять result и число записанных байт, я опустил этот момент
WriteProcessMemory(proces, pMem, @bBuf, 1, NumberOfBytesWritten);
// Расчитываем адрес для jmp
// Предполагается, что указатель PD уже получил от фукнкции VirtualAllocEx значение выделенной памяти
dBuf := DWord(pd) - oldAddress - 5;
WriteProcessMemory(proces, pMem, @dBuf, 4, NumberOfBytesWritten);
// Восстанавливаем атрибуты защиты памяти по умолчанию
VirtualProtectEx(proces, pMem, 1024, OldProtect, OldProtect);
end else
begin
ShowMessage('Не удалось изменить защиту участка памяти :(' + #13#10 +
'Код ошибки: ' + IntToStr( GetLastError() ));
end;
end;
Последний раз редактировалось dark; 25.12.2017 в 17:17.
|