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

[UFO: Extraterrestrials] Поиск статического адреса

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

Собственно такая проблема. Хочу сделать табличку Cheat Engine для этой игры.

 

Решил начать с очков действия, анйти структуру игрока и уже потом пытаться делать насколько это возможно скрипты.

Ищу очки действия, брекпойнт на доступ, нахожу адрес и смещение (esi+04/edi+04 в зависимости от функции).

Ищу указатель на edi. Нахожу указатель. Ставлю брекпойнт на доступ и нахожу адрес и смещение (ebx+0c).

Ищу указатель на ebx. Нахожу пару адресов.

И тут вот возникает проблема. По брекпойнту на доступ только одна функция с постоянно нарастающим счетчиком вызовов. вида mov ebx,[ebx]. От моих действий не меняется абсолютно ничего, никаких новых инструкций.

 

Как искать дальше?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
17 часов назад, inturist сказал:

вида mov ebx,[ebx]. От моих действий не меняется абсолютно ничего

Заметь, дебагер показывает только конечный адрес, то есть после выполнения mov ebx,[ebx] он покажет тебе не нужное смещение, а твой же адрес.
Потому перейди в отладчик - поставь бряк на этот адрес, и как только бряк поймает поток посмотри вправо - там появятся все регистры. Скопируй оттуда ebx, в нём должен быть правильный адрес. Это смещение +0. После можешь убрать бряк и запустить выполнение. Все нужные функции найдёшь в Debug.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
36 минут назад, inaginary сказал:

Потому перейди в отладчик - поставь бряк на этот адрес, и как только бряк поймает поток посмотри вправо - там появятся все регистры. Скопируй оттуда ebx, в нём должен быть правильный адрес. Это смещение +0. После можешь убрать бряк и запустить выполнение. 

В этом то и проблема : игра крайне не любит брекпойнты на исполнение. Зависает и CE и сама игра намертво.

Ну и все же смущает то что найденная единственная инструкция, обращающаяся к последнему адресу, обращается к нему независимо от того, делаю ли я в игре хоть что либо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
38 минут назад, inturist сказал:

обращается к нему независимо от того, делаю ли я в игре хоть что либо.

Всё правильно, там же есть элементы здоровья и тд? Игре же надо знать сколько и по какому адресу, что бы показать тебе на экран. Так что это то как раз не удивительно. На счёт отладчика, попробуй изменить тип в настройках.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
14 минут назад, inaginary сказал:

Всё правильно, там же есть элементы здоровья и тд? Игре же надо знать сколько и по какому адресу, что бы показать тебе на экран. Так что это то как раз не удивительно. На счёт отладчика, попробуй изменить тип в настройках.

 

Пробовал. Все равно какой тип отладчика. Хоть VEH хоть Window хоть Kernel. Если ставишь на этих инструкциях брекпойнт -- все падает.

 

Попробовал искать через другие значения (хп, патроны для оружия) -- таже петрушка. Сначала смещение 4, потом 0с а потом все сводится к тому самому ebx, [ebx], к которому игра обращается три тыщи раз за секунду. Что слегка подозрительно.

Изменено пользователем inturist

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
20 минут назад, inturist сказал:

все сводится к тому самому ebx, [ebx]

Так может и не мучиться а написать скрипт который будет в метку записывать адрес игрока, а повесить его на эту инструкцию. Или же сделать запись того адреса в метку перед тем как он запишет сам себя. Вроде такого:
 

your_code:
mov [labelw],ebx
code:
mov ebx,[ebx]

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, inaginary сказал:

который будет в метку записывать адрес игрока,

Я уже писал. Эта инструкция вызывается игрой кучу раз в секунду. При этом новых инструкций при выстреле/ходьбе не появляется. Не факт что она вообще берет только адрес игрока.

 

Собственно вот в скринах: 

 

Смотрим доступ к очкам действия. Первая инструкция наращивает счетчик вне зависимости от того трачу в игре стамину или нет. Ее игнорим, тратим стамину и выбираем одну из появившихся.

Спойлер

Ps67dYg.png

 

Находим указатель на начало структуры стамины и смотрим что уже обращается к нему. Опять, первую инструкцию игнорим, тратим стамину и находим адрес начала структуры, в которой лежит указатель на начало структуры стамины.

Спойлер

4w3Y4r0.png

 

А вот тут и возникает проблема. Находим указатель на начало предыдущей структуры, смотрим что у нему получаем доступ. Видим первую инструкцию которая наращивает счетчик вызовов до бесконечности. Тратим стамину и.... ничего.

Спойлер

K2Ljven.png

 

Большие изображения и код прячем под спойлер

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, inturist сказал:

Тратим стамину и.... ничего

Ты слишком банально себе это всё представляешь, тк ты искал адрес который (ключевое слово) храниться в другом, совсем не обязательно что там инструкции будут руководствоваться той же логикой что и предыдущие. Попробуй сделать скрипт и уже дальше смотри, если прямо проблема то повесь опять же скрипт на одну из первых инструкций и получай оттуда адрес игрока.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
5 минут назад, inaginary сказал:

Ты слишком банально себе это всё представляешь

Возможно. Все же особого опыта у меня нет. Но логика подсказывает что указатель это ссылка на некий объект, который инициализируется в вышестоящем объекте и так вверх вверх до запуска инициализации первого обьекта, где и можно найти тот самый пресловутый статический адрес для цепочки указателей. 

 

Смог поставить брекпойнт. Адреса в ebx меняются при каждом следующем выполнении. Возможно какая нибудь функция отрисовки/получения любого значения.

Но тогда значит что получить указатель на структуру игрока и соответственно стамины/хп и прочих атрибутов не получится (возможно ввиду полного отсутствия таких структур :) ).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
49 минут назад, inturist сказал:

Смог поставить брекпойнт.

На mov ebx,[ebx] при таком количестве адресов, с которыми работает эта инструкция, ставить брекпоинт бестолку.

Попробуй сделать трассировку (лучше именно условную - т.е. именно по адресу стамины) на третьей инструкции первого скриншота.
часто, если даже вылетала игра, трассировка оставалось,
А вот уже в трассировке и посмотри, что будет в ebx (при срабатывании инструкции  mov ebx,[ebx] ).  

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
39 минут назад, Garik66 сказал:

Попробуй сделать трассировку (лучше именно условную - т.е. именно по адресу стамины) на третьей инструкции первого скриншота.

Может быть третьего скриншота таки?)

Попробую но игра крешится теперь и при попытке брекпойнта на доступ к этой записи....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 минуту назад, inturist сказал:

Может быть третьего скриншота таки?)

1 скриншота (3 инструкция

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 минуту назад, Garik66 сказал:

1 скриншота (3 инструкция

ebx ebx на третьем скрине, как мне поможет трассировка первого значения? Регистр к этому моменту будет три тыщи раз уже перезаписан.

И да. Как вообще трассировка с остановкой по условию работает? Указал [ebx]==0x1CDF1940 останавливает когда адрес лежащий в ebx равен чему угодно кроме....

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 минуты назад, inturist сказал:

как мне поможет трассировка первого значения?

Ты ни разу не делал трассировку?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Только что, Garik66 сказал:

Ты ни разу не делал трассировку?

если бы делал не задавал бы вопросы о том как оно работает. Максимум искал указатели снизу вверх через Find what access to adresss

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
5 минут назад, inturist сказал:

если бы делал не задавал бы вопросы о том как оно работает. Максимум искал указатели снизу вверх через Find what access to adresss

Ну тогда по работай с ней не в своей игре , а например в Туториале СЕ и посмотри, что и как. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
10 минут назад, Garik66 сказал:

Ну тогда по работай с ней не в своей игре , а например в Туториале СЕ и посмотри, что и как. 

По break and trace методики использования в инете на русском понятном языке не обнаружил. Как мне поможет туториал если неясно как даже на примере туториала искать?)

По поиску снизу вверх напротив примеров хватает.

Изменено пользователем inturist

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
25 минут назад, inturist сказал:

Как мне поможет туториал если неясно как даже на примере туториала искать?)

Попробуй посмотреть вот этот урок от @Xipho

Спойлер

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
17 минут назад, Garik66 сказал:

Попробуй посмотреть вот этот урок от @Xipho

Видел уже этот урок поэтому представляю где найти трассировку. НО как трассировать с условием тут ни слова

Если трассировать инструкцию mov ebx,[ebx] то там просто рандомные адреса.

Если трассировать инструкцию fld dword ptr [edi+04] то указатель на адрес третьего скрина не найти -- она вообще походу в другой функции. Это если без условий. А с условиями -- то ли не работают то ли работают контринтуитивно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
55 минут назад, inturist сказал:

Если трассировать инструкцию fld dword ptr [edi+04]

Прошу прощения - отходил (покушать)

Я после работы (сильно уставший), но попробую сейчас записать небольшой урок по твоему вопросу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, inturist сказал:

Если трассировать

Видео скоро будет здесь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
19 часов назад, Garik66 сказал:

Видео скоро будет здесь.

Спасибо за видео, в принципе примерно так и пробовал искать. Проблема возникает в том что трассировка отображает дерево сразу и в списке брекпойнтов не появляется. А если ставить процесс на паузу, ставить трассировку и условие на брекпойнт то наоборот дерево пустое что не делай после снятия с паузы. И через какое то время игра вылетает. Условие EDI==0x160ac290 (если брать как на первом скрине.)

Изменено пользователем inturist

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 10.02.2019 в 17:19, inturist сказал:

Спасибо за видео, в принципе примерно так и пробовал искать. Проблема возникает в том что трассировка отображает дерево сразу и в списке брекпойнтов не появляется. А если ставить процесс на паузу, ставить трассировку и условие на брекпойнт то наоборот дерево пустое что не делай после снятия с паузы. И через какое то время игра вылетает. Условие EDI==0x160ac290 (если брать как на первом скрине.)

Зачем все усложнять, если у тебя есть АДРЕС(например 1609EA60), с которым работает что-то типа "mov ebx,[ebx]" тогда значение, которое тебе надо будет искать, это тот самый адрес. (Вбиваешь этот же 1609EA60 в сканер, ведь это будет значением следующего указателя). Математика 5 класс =/ и никаких отладчиков ненадо.

Хотя если сканер выбивает больше, чем 1 результат, тогда только с использованием отладки, как делал Garik

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 12.02.2019 в 22:49, Sanic сказал:

Зачем все усложнять, если у тебя есть АДРЕС(например 1609EA60), с которым работает что-то типа "mov ebx,[ebx]"

Через обычный поиск все доходит до третьего скрина с инструкцией обрабатывающей овердофига адресов. Ну а трассировка с фильтром чтобы добраться до этой инструкции и посмотреть значение в ebx не работает в принципе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, inturist сказал:

Через обычный поиск все доходит до третьего скрина с инструкцией обрабатывающей овердофига адресов. Ну а трассировка с фильтром чтобы добраться до этой инструкции и посмотреть значение в ebx не работает в принципе.

А какая тебе разница, сколько адресов обрабатывает инструкция, главное, это если инструкция выглядит типа так "mov ebx,[ebx]", копируешь не то, что в ebx после выполнения инструкции, а копируешь сам адрес, с которого читает эта инструкция и вбиваешь его в сканер. Отпиши, что найдет.

Поделиться сообщением


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

×

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

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