Вопрос /del

sapphire dev
Пользователь
Статус
Оффлайн
Регистрация
15 Мар 2018
Сообщения
190
Реакции[?]
124
Поинты[?]
36K
/del
 
Последнее редактирование:
Пользователь
Статус
Оффлайн
Регистрация
17 Июл 2021
Сообщения
463
Реакции[?]
118
Поинты[?]
10K
Как понимать прибавленное смещение к паттерну?
У тебя есть паттерн и функция для поиска смещения по нему. Ты вызываешь функцию с паттерном, в результате он выводит тебе смещение, и ты прибавляешь к нему еще одно смещение, для того, чтобы получить нужное значение.

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

Почему нельзя чистым паттерном?
Не всегда удается сделать паттерн для инструкции. На это бывают разные причины. Поэтому делают паттерн ближайшей инструкции и уже прибавляют к нему смещение, чтобы получить желаемый результат.
 
sapphire dev
Пользователь
Статус
Оффлайн
Регистрация
15 Мар 2018
Сообщения
190
Реакции[?]
124
Поинты[?]
36K
У тебя есть паттерн и функция для поиска смещения по нему. Ты вызываешь функцию с паттерном, в результате он выводит тебе смещение, и ты прибавляешь к нему еще одно смещение, для того, чтобы получить нужное значение.


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


Не всегда удается сделать паттерн для инструкции. На это бывают разные причины. Поэтому делают паттерн ближайшей инструкции и уже прибавляют к нему смещение, чтобы получить желаемый результат.
Спасибо, про первое я уже сам понял поковырявшись в иде и посмотрев на примере cachedbones))
 
std::X$$V::Z::_Func_impl_no_alloc
Пользователь
Статус
Оффлайн
Регистрация
30 Мар 2019
Сообщения
389
Реакции[?]
103
Поинты[?]
1K
Как понимать прибавленное смещение к паттерну? Как искать на пример его в иде и зачем их вообще добавляют? Почему нельзя чистым паттерном? пример: Посмотреть вложение 173099
1632475781965.png
Рассмотрим
call FUNC
По байтам у нас вот что:
1632475099231.png
Сразу подсказка, e8 - это сама call инструкция
f9 - смещение относительно следующей инструкции, которая у нас
1632475841616.png
f9 - это -007 (
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
Адрес следующей инструкции у нас 7, значит по законам простой математики вычитаем из адреса смещение. 7 - 7 = 0, следовательно адрес нашей функции 0

Паттерн даёт адрес на начало инструкции, а нам нужен именно итоговый адрес, сама call инструкция весит (7 - 2) 5 байт. Из них первый это обозначение инструкции (e8), значит остальные 4 байта - наш указатель на функцию. Теперь по логике нам просто нужно прибавить к адресу инструкции, размер самого флага, обозначения инструкции. И получаем CALLADDR + 0x1 == FUNC_ADDR

Конечно объяснение чуть чуть не верное, но я пытался максимально просто и удобно
 
midnight.im
Администратор
Статус
Оффлайн
Регистрация
1 Июл 2015
Сообщения
1,650
Реакции[?]
2,172
Поинты[?]
161K
Как понимать прибавленное смещение к паттерну? Как искать на пример его в иде и зачем их вообще добавляют? Почему нельзя чистым паттерном? пример: Посмотреть вложение 173099
обычно паттерны используют для поиска мест, куда вернется вызов функции, адрес функции, или же поиск dword/qword нужных тебе для работы.

компиляторы в большинстве своем генерируют один и тот же код. следовательно паттерны будут на том же месте.

вопросами, в IDA Pattern style, или же вопросами в маске помечаются места, где последовательность набора байт может меняться от версии к версии(например qword/dword). смещения используют для того, чтобы получить нужное место. в случае с e8 ? ? ? ? + 0x1 мы получаем адрес на те 4 байта которые помечены в паттерне как вопросик. далее уже в зависимости от твоей необходимости обрабатывается адрес. получается адрес функции(в твоем случае), или же адрес на qword/dword.

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

например:

мне нужно получить dword_152f25a8
сделав паттерн вида: 8b 0d ? ? ? ? 56, при его поиске мне выдаст очень большое количество вхождений.
для получения адреса 152f25a8 мне нужно к этому паттерну при его нахождении сделать + 0x2
но так как вхождений очень много, я могу найти далеко не тот вариант который нужен мне.
тогда я могу пойти по варианту увеличения байт в паттерне. обычно увеличивают вниз. но в данном случае мы увеличим наверх, для того чтобы показать на примере как это работает.

паттерн вида:
89 4d f4 8b 0d ? ? ? ? 56 уже имеет всего два вхождения. первое из которых является нужным мне.
но смещение 0x2 уже не актуально для этого паттерна. и смещение теперь будет 0x5. так как мы добавили 3 байта в начало.
 
Похожие темы
Ответы
9
Просмотры
310
Ответы
0
Просмотры
112
Ответы
0
Просмотры
133
Ответы
0
Просмотры
246
Сверху Снизу