Гость Demon0209 Опубликовано 29 октября, 2012 Поделиться Опубликовано 29 октября, 2012 Здравствуете форумчане.Пытаюсь понять процедуру создания тренера средствами win api delphi для познания использую дробное число в памяти нахожу его выбрал игру need for speed нахожу его в диапазоне от 0 до 1 - "азот"Ставлю бп на процесс нахожу функцию со статичным адресом и смещение со относительно адреса + 08при использование ассемблера просто восстанавливаю инструкцию и записываю в не значение и всёа для использовании в тренере delphi мне нужны указатели и смещения для записи значения в адрес но при поиске принтера первое смещение получаю на адрес идёт второе смещение + 04 от него ещё + 04 и в итоге пустой участок памяти как быть?я начинающий в этой области программирования.... Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 29 октября, 2012 Поделиться Опубликовано 29 октября, 2012 Приветики!У меня сейчас полчетвёртого утра и в голове каша, но судя по твоему посту, ты сам слегка запутался (а может, я совсем не соображаю). Давай, для начала, определимся - тебе нужно найти указатель на адрес (количество закиси азота), чтобы потом из трейнера менять значение этого адреса (условно, 0 - нету, 1 - полный бак), или же тебе надо отключить ассемблерную инструкцию кода игры, которая отвечает за трату этой самой закиси и которая меняет значение адреса, пока закись используешь?Штука в том, что это разные вещи. Если оказалось так, что тебе надо найти указатель и менять в трейнере именно указатель, а не код игры, то погляди у меня в подписи видеоуроки - там есть и про чтение указателей из трейнера, правда, на C#, но алгоритм везде одинаковый. Задача у трейнера будет такая:1. Находим процесс игры2. Подключаемся к нему3. Читаем указатель по заранее заданным смещениям - получаем текущий адрес закиси азота4. Меняем значение этого адреса на нужное намЕсли я просто что-нибудь не так понял - feel free пнуть меня в нужную сторону. =) Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Demon0209 Опубликовано 29 октября, 2012 Поделиться Опубликовано 29 октября, 2012 Приветики!У меня сейчас полчетвёртого утра и в голове каша, но судя по твоему посту, ты сам слегка запутался (а может, я совсем не соображаю). Давай, для начала, определимся - тебе нужно найти указатель на адрес (количество закиси азота), чтобы потом из трейнера менять значение этого адреса (условно, 0 - нету, 1 - полный бак), или же тебе надо отключить ассемблерную инструкцию кода игры, которая отвечает за трату этой самой закиси и которая меняет значение адреса, пока закись используешь?Штука в том, что это разные вещи. Если оказалось так, что тебе надо найти указатель и менять в трейнере именно указатель, а не код игры, то погляди у меня в подписи видеоуроки - там есть и про чтение указателей из трейнера, правда, на C#, но алгоритм везде одинаковый. Задача у трейнера будет такая:1. Находим процесс игры2. Подключаемся к нему3. Читаем указатель по заранее заданным смещениям - получаем текущий адрес закиси азота4. Меняем значение этого адреса на нужное намЕсли я просто что-нибудь не так понял - feel free пнуть меня в нужную сторону. =)Так вот я смотрел уже данный материал и у меня тупо не получаеться найти статическое значение в ассемблерной инструкции проблем нету а вот при поиске поинтера у меня проблемы указатель динамически указывает на адрес динамически а от него смещение на участок памти который вообще не заполнен Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 30 октября, 2012 Поделиться Опубликовано 30 октября, 2012 Вот пример из Интернета:varForm1: TForm1;WindowName : integer;ProcessId : integer;ThreadId : integer;HandleWindow : Integer;b:dword; // Всё по-прежнему, кроме этой переменной - сюда прочитаем адрес из поинтера.readwrite:cardinal;buf : dword;Const WindowTitle = 'SimCity 4';Address = $B321E4; // Это адрес поинтера.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);ReadProcessMemory(HandleWindow,ptr(address),@b,4,readwrite); // Прочитали в b значение из адреса поинтера.b:=b+40; // Смещение адреса денег относительно адреса, на который указывает поинтер равно 40. Прибавляем.buf:=$FFFFFFFF; // Денег должно быть много (**)WriteProcessMemory(HandleWindow, ptr(, @buf, 4, readwrite); // Наконец, запишем по адресу,// содержащемуся в b, новое значение денег.end;Хорошо бы тут ещё делать проверку существует ли адрес и с какими он правами пред записью в него. Бывает что адреса содержат null значение, а не другой адрес пока что-то не произойдёт. А бывает и так, что по адресу может располагаться постоянно не один, а несколько адресов по очереди в разное время... Да и значения в игре при заморозке на экране могут дёргаться. Всё это к тому, что лучше править код, если на нём нет крутой защиты типа СтарФорса.Специально для тех кто любит Дельфи советую обратить внимание на создание трейнера на WinAPIодного из товарищей уже не существующей команды. Автор: g-l-u-k Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 30 октября, 2012 Поделиться Опубликовано 30 октября, 2012 №3, если не получается найти указатель вручную - попробуй автоматический поиск. ПКМ на адресе - "Pointer scan for this address". Сохраняешь файл с найденными указателями куда-нибудь (он будет большой), перезагружаешь игру, находишь новый адрес, открываешь старый файл с указателями - делаешь из меню "Rescan memory" - отсеиваешь те указатели, которые не работает. Повторяешь это пару раз, пока не останутся рабочие указатели - их и используешь. Да, рабочих может быть несколько. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Demon0209 Опубликовано 31 октября, 2012 Поделиться Опубликовано 31 октября, 2012 Вот пример из Интернета:varForm1: TForm1;WindowName : integer;ProcessId : integer;ThreadId : integer;HandleWindow : Integer;b:dword; // Всё по-прежнему, кроме этой переменной - сюда прочитаем адрес из поинтера.readwrite:cardinal;buf : dword;Const WindowTitle = 'SimCity 4';Address = $B321E4; // Это адрес поинтера.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);ReadProcessMemory(HandleWindow,ptr(address),@b,4,readwrite); // Прочитали в b значение из адреса поинтера.b:=b+40; // Смещение адреса денег относительно адреса, на который указывает поинтер равно 40. Прибавляем.buf:=$FFFFFFFF; // Денег должно быть много (**)WriteProcessMemory(HandleWindow, ptr(, @buf, 4, readwrite); // Наконец, запишем по адресу,// содержащемуся в b, новое значение денег.end;Хорошо бы тут ещё делать проверку существует ли адрес и с какими он правами пред записью в него. Бывает что адреса содержат null значение, а не другой адрес пока что-то не произойдёт. А бывает и так, что по адресу может располагаться постоянно не один, а несколько адресов по очереди в разное время... Да и значения в игре при заморозке на экране могут дёргаться. Всё это к тому, что лучше править код, если на нём нет крутой защиты типа СтарФорса.Специально для тех кто любит Дельфи советую обратить внимание на создание трейнера на WinAPIТак вот я смотрел уже данный материал и у меня тупо не получаеться найти статическое значение в ассемблерной инструкции проблем нету а вот при поиске поинтера у меня проблемы указатель динамически указывает на адрес динамически а от него смещение на участок памти который вообще не заполненодного из товарищей уже не существующей команды. Автор: g-l-u-kЯ на вин апи и пишу трейнеры.... потому как файл меньше....Спасибо за пояснение кенг... главно по мне разобраться с поиском с написанием нет проблем не первый год пишу на delphi Акк в скайпе demon0209 напиши Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения