Maxs Опубликовано 19 августа, 2014 Поделиться Опубликовано 19 августа, 2014 Здравствуйте, однафорумчани. Давно не виделись, но думаю это не так важно... У меня след. проблема:Поискав статьи по созданию трейниров(для не-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);beginWindowName := FindWindow(nil,WindowTitle);If WindowName = 0 thenbeginMessageDlg('Игра должна быть запущена до трейнера. Запустите ее, потом трейнер', 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 работает Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 19 августа, 2014 Поделиться Опубликовано 19 августа, 2014 Попробуй не Cardinal, a DWORD. Это если тебе целое нужно. А если дробное - тогда float. В Delphi это, если не ошибаюсь, Real. А пр передаче непосредственно в функию приведи к нужному типу и все. Ну и там у тебя есть еще несколько недочетов. Но я сейчас с планшета и все их рассказывать не буду. Попробуй найти и устранить самостоятельно. Если не получится, помогу, но уже завтра. Ссылка на комментарий Поделиться на другие сайты Поделиться
Maxs Опубликовано 20 августа, 2014 Автор Поделиться Опубликовано 20 августа, 2014 Создавать новую тему не хочу, но появилась проблема, оказалось, что адреса не ДМА(хотя они были зеленые)... получается нужно использовать AOBscan... но для этого нужно найти нужную инструкцию... но при ... "отладки" выдается over9000 процессов(инструкций). Как быть? Неужели надо использовать старую систему с оффсетами? :/ Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 20 августа, 2014 Поделиться Опубликовано 20 августа, 2014 /*---------------------------------------------------------------------------*/ Если инструкций много - то проверять, что они корректно работают, подбиратьнужную. Долго, муторно, но что поделаешь. Второй вариант - указатели. А что за"старая система с оффсетами"? /*---------------------------------------------------------------------------*/ Ссылка на комментарий Поделиться на другие сайты Поделиться
Maxs Опубликовано 20 августа, 2014 Автор Поделиться Опубликовано 20 августа, 2014 /*---------------------------------------------------------------------------*/ Если инструкций много - то проверять, что они корректно работают, подбиратьнужную. Долго, муторно, но что поделаешь. Второй вариант - указатели. А что за"старая система с оффсетами"? /*---------------------------------------------------------------------------*/ну старая система и есть указатели... Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 20 августа, 2014 Поделиться Опубликовано 20 августа, 2014 В Delphi типу Float соответствует тип Single, он 4х байтный как-раз. Ссылка на комментарий Поделиться на другие сайты Поделиться
MoL4uN87 Опубликовано 27 июня, 2016 Поделиться Опубликовано 27 июня, 2016 // Пишем функцию изменения значения адреса на тип 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; Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения