Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.08.2011, 00:41   #1
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
Вопрос ReadProcessMemory, меняющийся lpBaseAdress

Доброго времени суток!

Есть 3D игра, есть куча параметров которые мне нужно считывать из её процесса.

С помощью ArtMoney я нахожу адресс нужного мне значения, считываю его такой простенькой процедурой:

Код:
procedure TForm1.Button4Click(Sender: TObject);
var
  HP:THandle;
  wread:Cardinal;
  bb:LongInt;
begin
HP := OpenProcess(PROCESS_VM_READ,False,StrToInt(LabeledEdit1.Text) {PID});
LabeledEdit3.Text := IntToStr(HP);{Хэндл}
ReadProcessMemory(HP,Ptr($21292BD8){найденный адрес},@bb,4,wread);
Edit2.Text := IntToStr(bb);
end;
И всё вроде бы работает как нужно, но вот незадача, при перезапуске игры, смене персонажа да и при прочих действиях этот самый адрес меняется.

Вопрос собственно в том: как найти этот и многие другие адреса из которых мне нужно считывать данные без 5-тичасового поиска с помощью сторонних программ...
А так-же хотелось бы найти какую-нибудь статью по работе с памятью чужих процессов с примерами и пояснениями.

Всем спасибо за ответы!
Lime вне форума Ответить с цитированием
Старый 16.08.2011, 01:34   #2
Larboss
Недо
Участник клуба
 
Регистрация: 11.08.2011
Сообщений: 1,394
По умолчанию

Дело в том, что игры используют DMA (большинство). Динамически распределяется память, поэтому при каждом перезапуске адрес меняется. Вам необходимо найти указатель на адрес, т.е. будет 2 вызова ReadProcessMemory: первым вы получите адрес значения, а вторым собственно значение. О том как искать указатели (или создание трейнера DMA) и что это такое, спросите в гугле, "под рукой" нет ссылки для вас.

1. Chemax.ru - тут найдете примеры трейнеров с описанием, раздел "статьи".
2. CheatEngine - прога, вроде бы умеет искать указатели.
С помощью программирования можно разбогатеть и изменить мир к лучшему (с) Бьерн Страуструп

Последний раз редактировалось Larboss; 16.08.2011 в 01:38.
Larboss вне форума Ответить с цитированием
Старый 16.08.2011, 01:41   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

эмм DMA?(Direct Memory Access)

с остальным согласен.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.08.2011, 02:12   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

В этом контексте, видимо, DMA = Dynamic Memory Allocation.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 16.08.2011, 13:40   #5
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
По умолчанию

Спасибо за подсказки, вот я наткнулся на эту страничку http://www.artmoney.ru/manual/russian/dma.htm но найти "указатель на указатель" по инструкции мне так и не удалось В качестве параметра для поиска использовал как в примере - опыт. Его легко изменить для поиска и отсеивания.

P.S. "проблема" возникает на шаге Отсеивание указателей когда я пытаюсь отсеить указатели из блока памяти , чтобы найти тот который ведет к текущему адресу с опытом. В 1вом-же поиске после отсеивания находится 0 указателей.

Cheat Engine, tutorial 6 шаг:

Цитата:
Step 6: Pointers: (PW=098712)
In the previous step I explained how to use the Code finder to handle changing locations. But that method alone
makes it difficult to find the address to set the values you want.
That's why there are pointers:

At the bottom you'll find 2 buttons. One will change the value, and the other changes the value AND the location of
the value.
For this step you don't really need to know assembler, but it helps a lot if you do.

First find the address of the value. When you've found it use the function to find out what accesses this address.
Change the value again, and a item will show in the list. Double click that item. (or select and click on more info) and
a new window will open with detailed information on what happened when the instruction ran.
If the assembler instruction doesn't have anything between a '[' and ']' then use another item in the list.
If it does it will say what it think will be the value of the pointer you need.
Go back to the main cheat engine window (you can keep this extra info window open if you want, but if you close it,
remember what is between the [ and ] ) and do a 4 byte scan in hexadecimal for the value the extra info told you.
When done scanning it may return 1 or a few hundred addresses. Most of the time the address you need will be the
smallest one. Now click on manually add and select the pointer checkbox.

The window will change and allow you to type in the address of a pointer and a offset.
Fill in as address the address you just found.
If the assembler instruction has a calculation (e.g: [esi+12]) at the end then type the value in that's at the end. else
leave it 0. If it was a more complicated instruction look at the calculation.

example of a more complicated instruction:
[EAX*2+EDX+00000310] eax=4C and edx=00801234.
In this case EDX would be the value the pointer has, and EAX*2+00000310 the offset, so the offset you'd fill in
would be 2*4C+00000310=3A8. (this is all in hex, use cal.exe from windows in scientific mode to calculate)

Back to the tutorial, click OK and the address will be added, If all went right the address will show P->xxxxxxx, with
xxxxxxx being the address of the value you found. If thats not right, you've done something wrong.
Now, change the value using the pointer you added in 5000 and freeze it. Then click Change pointer, and if all went
right the next button will become visible.


extra:
And you could also use the pointer scanner to find the pointer to this address
Проделывая тоже самое с игрой, остановился на том самом "заветном" шаге, на определении адреса "указателя на указатель". (во вложении скрин окошка). Дальше по инструкции нужно выполнить hex поиск по значению что в [скобках], и как я понял если это значение не еденичное (edx,eax, прочее) то нужно его определить. И как я понял из скрина ecx*4-04 = 0, верно? тогда окончательно в скобках будет EDI (08E8513C). Hex поиск по этому значению ничего не даёт

ADD: Т.К. Адреса с "опытом" было 2, после некоторых попыток и манипуляций со вторым я всетаки нашел pointer+offset которые дают соответствующее с игрой значение текущего опыта однако после "перезапуска" адреса сменились снова ... Возможен ли вариант "тройных указателей" ?
Изображения
Тип файла: jpg cc.JPG (39.7 Кб, 215 просмотров)

Последний раз редактировалось Stilet; 16.08.2011 в 21:03.
Lime вне форума Ответить с цитированием
Старый 16.08.2011, 17:28   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Возможен ли вариант "тройных указателей" ?
да, может и более.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.08.2011, 18:40   #7
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Двойных, тройных, n-ых... Это запросто может быть поле какой-то структуры, находящейся в экземпляре какого-то объекта в списке, например . Но раз уж нашёлся
Цитата:
pointer+offset которые дают соответствующее с игрой значение
то скорее это не "указатель на указатель на указатель", а просто участок кода находится в библиотеке и при каждом запуске грузится по новому адресу.
пыщь
JTG вне форума Ответить с цитированием
Старый 16.08.2011, 19:03   #8
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
По умолчанию

JTG, тогда возможно ли вообще решить поставленную задачу?
Lime вне форума Ответить с цитированием
Старый 16.08.2011, 19:34   #9
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Не порывшись отладчиком, трудно сказать. Решить-то однозначно можно, только решения "в лоб" может не быть и придётся заниматься реверсингом программы.
пыщь

Последний раз редактировалось JTG; 16.08.2011 в 19:42.
JTG вне форума Ответить с цитированием
Старый 16.08.2011, 19:48   #10
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Ну и причем здесь ReadProcessMemory ?
Она исправно выполняет свю задачу.
mss вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ReadProcessMemory/Не понятные явления coNsept Общие вопросы C/C++ 2 31.07.2011 19:33
Меняющийся контент 9GYAR HTML и CSS 3 20.07.2011 16:01
ReadProcessMemory+TMemoryStream Bad-XxX Общие вопросы Delphi 2 10.10.2010 20:11
Проблема с FindFirst, как указать меняющийся путь? _SacreD_ Общие вопросы Delphi 12 26.12.2007 16:14