Прошу помощи.
Хочу научится искать оффсеты в игре. Элементарное, я умею (поиск ХП, МП и подобное), а вот, допустим, добраться до окна почты и прочитать письмо ( то есть что бы , при открытой почте и письме, в программу выводилось, допустим, содержимое письма, количество писем в почтовом ящике.) не умею Для этого нужны оффсеты, прошу подробно описать - как их искать? Почтовый ящик - всего лишь пример
Lermontov, способ в основном один: ищем адрес интересующего значения, смотрим команды, которые взаимодействуют с этим адресом.
В командах уже и будут смещения до данного адреса.
Например, получился адрес 0x100004, по которому лежит нужная инфа. Через Cheat Engine ставим BP (BreakPoint) на доступ к этому адресу, пробуем что-нибудь сделать, чтобы клиент к нему обратился (в случае с письмом, например, ещё раз щёлкаем на нём или открываем). Там видим команду типа такой: mov edi, [esi+4].
В данном случае 4 - смещение. Вычитаем его из нашего адреса: 0x100000. Это значение ищем в памяти клиента.
Нашли несколько - берём любое (лучше брать из начала списка, кроме случаев, когда адреса имеют вид 0012XXXX - это скорей всего относится к интерфейсу) и добавляем в таблицу. Обозначим это значение за X. Ставим такой же BP на этот X. Получаем, например, команду mov eax, [edx+10]. Значит из только что добавленного значения X вычитаем 10 и ищем результат в памяти. Повторять, пока не доберёмся до базового адреса (или до любого статического).
Собираем оффсеты по цепочке: [[[[BA] +X] +10] +4] (или упрощённая запись: BA +X +10 +4).
Таким образом обычно и поступают.
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3
Последний раз редактировалось BritishColonist; 03.04.2012 в 01:46.
BritishColonist, В моем понимании BP , вот это окошко [Ссылки могут видеть только зарегистрированные пользователи. ]
Если не так, прошу "наставить на истинный пусть"
Lermontov, читать из памяти можно по адресам, лежащим в переменных целого типа, а помещать результат последнего чтения - в тип дробный. Т.е. нужны две переменные. Только на самом последнем этапе, нужно ложить значение в single.
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3
function TProcess.readSingle(addr : cardinal) : single;
var
tmp, bytesread : cardinal;
begin
if addr = 0 then result := 0 else
try
ReadProcessMemory(self.processHandle, pointer(addr), @tmp, sizeof(cardinal), bytesread);
if (tmp = $7F808080) or (tmp > $FF800000) then result := 0.00 else result := PSingle(@tmp)^;
except
result := 0.00;
end;
end;