Maxs

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

7 сообщений в этой теме

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

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

Поискав статьи по созданию трейниров(для не-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 работает

0

Поделиться сообщением


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

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

0

Поделиться сообщением


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

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

fb0fda5d4122.png

 

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

0

Поделиться сообщением


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

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

 

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

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

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

 

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

0

Поделиться сообщением


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

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

 

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

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

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

 

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

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

0

Поделиться сообщением


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

В Delphi типу Float соответствует тип Single, он 4х байтный как-раз.

0

Поделиться сообщением


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

// Пишем функцию изменения значения адреса на тип 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;

 

 

0

Поделиться сообщением


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

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас