Показать сообщение отдельно
Старый 23.11.2015, 13:47  
GameOldHack
Подпольщик Tera
Аватар для GameOldHack
OFFLINE
Регистрация: 16.03.2015
Сообщений: 450
Благодарностей:
196 всего
Мнения: + 468
Репутация: 589
Отправить сообщение для GameOldHack с помощью Skype™

Цитата:
Сообщение от Paladin Посмотреть сообщение
Лень разбираться в СЕ коде. Если я правильно понимаю, тебе нужно пропатчить код игры, поставив там где-то перенаправление на твой код?

Тогда где-то так:

PHP код:
var
    
bBufbyte;
    
dBufDWord;
  
pMemPointer;
    
OldProtectCardinal;
    
NumberOfBytesWrittenSIZE_T;
const
    
oldAddressDWord = $0051040// здесь "$0051040" - это адрес, по которому собираешься патчить
begin
    pMem 
:= Pointer(oldAddress);
    if 
VirtualProtectEx(procespMem1024PAGE_EXECUTE_READWRITEOldProtectthen
    begin
        
// jmp
        
bBuf := $E9;

        
// У WPM желательно проверять result и число записанных байт, я опустил этот момент
        
WriteProcessMemory(procespMem, @bBuf1NumberOfBytesWritten);

        
// Расчитываем адрес для jmp
        // Предполагается, что указатель PD уже получил от фукнкции VirtualAllocEx значение выделенной памяти
        
dBuf := DWord(pd) - oldAddress 5;

        
WriteProcessMemory(procespMem, @dBuf4NumberOfBytesWritten);

        
// Восстанавливаем атрибуты защиты памяти по умолчанию
        
VirtualProtectEx(procespMem1024OldProtectOldProtect);
    
end else
    
begin
        ShowMessage
('Не удалось изменить защиту участка памяти :(' #13#10 +
    
'Код ошибки: ' IntToStrGetLastError() ));
    
end;
end
Не забудь потом из кода, на который перенаправляешь, вернуться назад или вернуть управление (ret) (смотря что за код ты внедряешь).


Дальше давай сам. И не воруй чужие оффсеты в тере

Добавлено через 7 минут
Оффтоп
Вот что получается -




Решил не танцевать с бубном и пойти путем нуба и так указал адрес для создание пространства $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.
 
Ответить с цитированием