Перейти к содержанию

[Delphi]Нужна практичиская помощь в теории


Рекомендуемые сообщения

Здравствуйте, однафорумчани. Давно не виделись, но думаю это не так важно... :)

У меня след. проблема:

Поискав статьи по созданию трейниров(для не-DMA игр, такие как серия GTA), удалось собрать код который меняет значение переменной на тип integer 4 байта...

Короче... Если допустим у нас адрес $0001 имеет тип float = 100.05, то мой код может его менять на целые числа типо 100 или 101.

Как сделать чтобы изменение было на дробное значение?

Вот мой код:


var
Form1: TForm1;
WindowName : integer;
ProcessId : integer;
ThreadId : integer;
buf : PChar;
HandleWindow : Integer;
write : cardinal;
Const WindowTitle = 'GTA:SA';
Address = $11AEC484;
PokeValue = $32;
NumberOfBytes = 4;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
WindowName := FindWindow(nil,WindowTitle);
If WindowName = 0 then
begin
MessageDlg('Игра должна быть запущена до трейнера. Запустите ее, потом трейнер', mtwarning,[mbOK],0);
end;
ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
GetMem(buf,1);
buf^ := Chr(PokeValue);
WriteProcessMemory(HandleWindow,ptr(Address),buf,NumberOfBytes,write);
FreeMem(buf);
CloseHandle(HandleWindow);
end;
end.

///write : cardinal; только в делфи7 работает

Ссылка на комментарий
Поделиться на другие сайты

Попробуй не Cardinal, a DWORD. Это если тебе целое нужно. А если дробное - тогда float. В Delphi это, если не ошибаюсь, Real. А пр передаче непосредственно в функию приведи к нужному типу и все. Ну и там у тебя есть еще несколько недочетов. Но я сейчас с планшета и все их рассказывать не буду. Попробуй найти и устранить самостоятельно. Если не получится, помогу, но уже завтра.

Ссылка на комментарий
Поделиться на другие сайты

Создавать  новую тему не хочу, но появилась проблема, оказалось, что адреса не ДМА(хотя они были зеленые)... получается нужно использовать AOBscan... но для этого нужно найти нужную инструкцию... но при ... "отладки" выдается over9000 процессов(инструкций). Как быть?

fb0fda5d4122.png

 

Неужели надо использовать старую систему с оффсетами? :/

Ссылка на комментарий
Поделиться на другие сайты

/*---------------------------------------------------------------------------*/

 

Если инструкций много - то проверять, что они корректно работают, подбирать

нужную. Долго, муторно, но что поделаешь. Второй вариант - указатели. А что за

"старая система с оффсетами"?

 

/*---------------------------------------------------------------------------*/

Ссылка на комментарий
Поделиться на другие сайты

/*---------------------------------------------------------------------------*/

 

Если инструкций много - то проверять, что они корректно работают, подбирать

нужную. Долго, муторно, но что поделаешь. Второй вариант - указатели. А что за

"старая система с оффсетами"?

 

/*---------------------------------------------------------------------------*/

ну старая система и есть указатели...

Ссылка на комментарий
Поделиться на другие сайты

  • 1 год спустя...

// Пишем функцию изменения значения адреса на тип Float

Скрытый текст

function GetFloatValueToAdress(WindowName: PAnsiChar; Adress: integer; WriteValue: single):Boolean;
var   pid:integer;
      write :dword;
      Aob_old_Protect_OFF: dword;
      Aob_old_Protect_ON:dword;
      pHandle:LongInt;
begin

   GetWindowThreadProcessId(FindWindow(nil,WindowName),@pid);        
   pHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,pid);              
    if pHandle <> 0 then begin
   VirtualProtectEx(pHandle,ptr(Adress),SizeOf(WriteValue),PAGE_EXECUTE_READWRITE,Aob_old_Protect_OFF);   
   WriteProcessMemory(pHandle,ptr(Adress),@WriteValue,SizeOf(WriteValue),write);                    
   VirtualProtectEx(pHandle,ptr(Adress),SizeOf(WriteValue),Aob_old_Protect_OFF,Aob_old_Protect_ON);    
   CloseHandle(pHandle);                                                      
                          end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
GetFloatValueToAdress('Grand Theft Auto V',$18097BA0,10.5); //Пример
end;

 

 

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.