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

Поиск указателя [проблема]


Гость Demon0209

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

Здравствуете форумчане.

Пытаюсь понять процедуру создания тренера средствами win api delphi

для познания использую дробное число в памяти нахожу его выбрал игру need for speed

нахожу его в диапазоне от 0 до 1 - "азот"

Ставлю бп на процесс нахожу функцию со статичным адресом и смещение со относительно адреса + 08

при использование ассемблера просто восстанавливаю инструкцию и записываю в не значение и всё

а для использовании в тренере delphi мне нужны указатели и смещения для записи значения в адрес но при поиске принтера первое смещение получаю на адрес идёт второе смещение + 04 от него ещё + 04 и в итоге пустой участок памяти как быть?

я начинающий в этой области программирования....

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

Приветики!

У меня сейчас полчетвёртого утра и в голове каша, но судя по твоему посту, ты сам слегка запутался (а может, я совсем не соображаю). Давай, для начала, определимся - тебе нужно найти указатель на адрес (количество закиси азота), чтобы потом из трейнера менять значение этого адреса (условно, 0 - нету, 1 - полный бак), или же тебе надо отключить ассемблерную инструкцию кода игры, которая отвечает за трату этой самой закиси и которая меняет значение адреса, пока закись используешь?

Штука в том, что это разные вещи. Если оказалось так, что тебе надо найти указатель и менять в трейнере именно указатель, а не код игры, то погляди у меня в подписи видеоуроки - там есть и про чтение указателей из трейнера, правда, на C#, но алгоритм везде одинаковый. Задача у трейнера будет такая:

1. Находим процесс игры

2. Подключаемся к нему

3. Читаем указатель по заранее заданным смещениям - получаем текущий адрес закиси азота

4. Меняем значение этого адреса на нужное нам

Если я просто что-нибудь не так понял - feel free пнуть меня в нужную сторону. =)

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

Приветики!

У меня сейчас полчетвёртого утра и в голове каша, но судя по твоему посту, ты сам слегка запутался (а может, я совсем не соображаю). Давай, для начала, определимся - тебе нужно найти указатель на адрес (количество закиси азота), чтобы потом из трейнера менять значение этого адреса (условно, 0 - нету, 1 - полный бак), или же тебе надо отключить ассемблерную инструкцию кода игры, которая отвечает за трату этой самой закиси и которая меняет значение адреса, пока закись используешь?

Штука в том, что это разные вещи. Если оказалось так, что тебе надо найти указатель и менять в трейнере именно указатель, а не код игры, то погляди у меня в подписи видеоуроки - там есть и про чтение указателей из трейнера, правда, на C#, но алгоритм везде одинаковый. Задача у трейнера будет такая:

1. Находим процесс игры

2. Подключаемся к нему

3. Читаем указатель по заранее заданным смещениям - получаем текущий адрес закиси азота

4. Меняем значение этого адреса на нужное нам

Если я просто что-нибудь не так понял - feel free пнуть меня в нужную сторону. =)

Так вот я смотрел уже данный материал и у меня тупо не получаеться найти статическое значение в ассемблерной инструкции проблем нету а вот при поиске поинтера у меня проблемы указатель динамически указывает на адрес динамически а от него смещение на участок памти который вообще не заполнен

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

Вот пример из Интернета:


var
Form1: 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);
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);
ReadProcessMemory(HandleWindow,ptr(address),@b,4,readwrite); // Прочитали в b значение из адреса поинтера.
b:=b+40; // Смещение адреса денег относительно адреса, на который указывает поинтер равно 40. Прибавляем.
buf:=$FFFFFFFF; // Денег должно быть много (**)
WriteProcessMemory(HandleWindow, ptr(, @buf, 4, readwrite); // Наконец, запишем по адресу,
// содержащемуся в b, новое значение денег.
end;

Хорошо бы тут ещё делать проверку существует ли адрес и с какими он правами пред записью в него. Бывает что адреса содержат null значение, а не другой адрес пока что-то не произойдёт. А бывает и так, что по адресу может располагаться постоянно не один, а несколько адресов по очереди в разное время... Да и значения в игре при заморозке на экране могут дёргаться. Всё это к тому, что лучше править код, если на нём нет крутой защиты типа СтарФорса.

Специально для тех кто любит Дельфи советую обратить внимание на создание трейнера на WinAPI

post-3-0-01594900-1351568399_thumb.png

одного из товарищей уже не существующей команды. Автор: g-l-u-k

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

№3, если не получается найти указатель вручную - попробуй автоматический поиск. ПКМ на адресе - "Pointer scan for this address". Сохраняешь файл с найденными указателями куда-нибудь (он будет большой), перезагружаешь игру, находишь новый адрес, открываешь старый файл с указателями - делаешь из меню "Rescan memory" - отсеиваешь те указатели, которые не работает. Повторяешь это пару раз, пока не останутся рабочие указатели - их и используешь. Да, рабочих может быть несколько.

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

Вот пример из Интернета:


var
Form1: 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);
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);
ReadProcessMemory(HandleWindow,ptr(address),@b,4,readwrite); // Прочитали в b значение из адреса поинтера.
b:=b+40; // Смещение адреса денег относительно адреса, на который указывает поинтер равно 40. Прибавляем.
buf:=$FFFFFFFF; // Денег должно быть много (**)
WriteProcessMemory(HandleWindow, ptr(, @buf, 4, readwrite); // Наконец, запишем по адресу,
// содержащемуся в b, новое значение денег.
end;

Хорошо бы тут ещё делать проверку существует ли адрес и с какими он правами пред записью в него. Бывает что адреса содержат null значение, а не другой адрес пока что-то не произойдёт. А бывает и так, что по адресу может располагаться постоянно не один, а несколько адресов по очереди в разное время... Да и значения в игре при заморозке на экране могут дёргаться. Всё это к тому, что лучше править код, если на нём нет крутой защиты типа СтарФорса.

Специально для тех кто любит Дельфи советую обратить внимание на создание трейнера на WinAPI

post-3-0-01594900-1351568399_thumb.png

Так вот я смотрел уже данный материал и у меня тупо не получаеться найти статическое значение в ассемблерной инструкции проблем нету а вот при поиске поинтера у меня проблемы указатель динамически указывает на адрес динамически а от него смещение на участок памти который вообще не заполнен

одного из товарищей уже не существующей команды. Автор: g-l-u-k

Я на вин апи и пишу трейнеры.... потому как файл меньше....

Спасибо за пояснение кенг... главно по мне разобраться с поиском с написанием нет проблем не первый год пишу на delphi

Акк в скайпе demon0209 напиши

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

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

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

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