Вопрос Что такое паттерны и сигнатуры?

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
7 Янв 2025
Сообщения
21
Реакции
4
Что это,для чего нужны,чем отличаются.Я знаю только,что это надо для нахождения переменных и функций.Заранее спасибо (да,я не умею искать инфу в инете)
 
я не умею искать инфу в инете
а это очень печально
ассемблер скорее всего тоже не знаешь?

объясняю. сидишь ты, еблищем щёлкаешь и хуяк нашёл entitylist (к примеру):
1759348471273.png


видишь 4C 8B и тд? это байты инструкции (инструкция это строка mov r9, ...)

видишь 63B042 слева серым цветом? это адрес инструкции (в моём случае оффсет, т.к. image base = 0 в иде я поставил). весь код как-бы в этой куче. условно если кто-то добавит выше новую функцию, то будет уже не 63B042 а 64B050 (например). и тебе придётся опять открывать иду и искать ентитилист по новой

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

1. Вытаскиваем 1CF0A70
смотрим, какие байты за что отвечают
4C 8B 0D 27 5A 6B 01
4C - rex.r префикс, просто забей, тебе сейчас это не нужно
8B - это опкод инструкции mov
0D - modrm, описывает что это mov r9, [rip + displacement32]
27 5A 6B 01 - смещение
чтобы найти entitylist нужно вычислить rip + displacement32. displacement32 - это 4 байтовый оффсет (оффсет я тебе уже дал, 4 байтовый потому что 32бит/8 = 4байт). rip - адрес на следующую инструкцию.

Сначала тренируемся без кода. Открываешь HxD (hex редактор) и кидаешь туда 4C 8B 0D 27 5A 6B 01. выделяешь смещение
1759349432569.png

почему uint32 уже объяснял. 23812647 - смещение. в иде видим, что адрес инструкции 63B042. размер - 7 байт (просто посчитать количество байт в 4C 8B 0D 27 5A 6B 01 инструкции). проверяем: 0x63B042 + 7 + 23812647 =
1759349504444.png

1759349508859.png

всё верно

2. составляем сигнатуру

смещение также может меняться. байты, которые могут меняться заменяем на wildcard (знак вопроса, кстати без разницы, можно два знака вопроса).

4C 8B 0D остаются неизменными, а далее идут 4 байта. 4C 8B 0D ? ? ? ?. проверяем на совпадения:
1759349643451.png

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

1759350188933.png

test r9, r9 - вроде никакого смещения нету. 4C 8B 0D ? ? ? ? 4D 85 C9
1759350188964.png

опять много совпадений. в итоге так далее следующие инструкции прибавляешь каждый раз, сверяешь совпадения и приходишь к:
4C 8B 0D ? ? ? ? 4D 85 C9 74 ? 41 83 F8 ? 74 ? 41 8B C8 81 E1 ? ? ? ? 8B C1 C1 E8 ? 4D 8B 14 C1

затем пишешь сканер сигнатур и получаешь найденный адрес. используешь предыдущую формулу, заменяя displacement32 на read<dword>(address + 3) и rip как адрес инструкции.

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

надеюсь понятно объяснил :pepe14:
 

Вложения

  • 1759349740429.png
    1759349740429.png
    7 KB · Просмотры: 6
  • 1759349777392.png
    1759349777392.png
    19.9 KB · Просмотры: 6
а это очень печально
ассемблер скорее всего тоже не знаешь?

объясняю. сидишь ты, еблищем щёлкаешь и хуяк нашёл entitylist (к примеру):
Посмотреть вложение 316949

видишь 4C 8B и тд? это байты инструкции (инструкция это строка mov r9, ...)

видишь 63B042 слева серым цветом? это адрес инструкции (в моём случае оффсет, т.к. image base = 0 в иде я поставил). весь код как-бы в этой куче. условно если кто-то добавит выше новую функцию, то будет уже не 63B042 а 64B050 (например). и тебе придётся опять открывать иду и искать ентитилист по новой

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

1. Вытаскиваем 1CF0A70
смотрим, какие байты за что отвечают
4C 8B 0D 27 5A 6B 01
4C - rex.r префикс, просто забей, тебе сейчас это не нужно
8B - это опкод инструкции mov
0D - modrm, описывает что это mov r9, [rip + displacement32]
27 5A 6B 01 - смещение
чтобы найти entitylist нужно вычислить rip + displacement32. displacement32 - это 4 байтовый оффсет (оффсет я тебе уже дал, 4 байтовый потому что 32бит/8 = 4байт). rip - адрес на следующую инструкцию.

Сначала тренируемся без кода. Открываешь HxD (hex редактор) и кидаешь туда 4C 8B 0D 27 5A 6B 01. выделяешь смещение
Посмотреть вложение 316950
почему uint32 уже объяснял. 23812647 - смещение. в иде видим, что адрес инструкции 63B042. размер - 7 байт (просто посчитать количество байт в 4C 8B 0D 27 5A 6B 01 инструкции). проверяем: 0x63B042 + 7 + 23812647 =
Посмотреть вложение 316951
Посмотреть вложение 316952
всё верно

2. составляем сигнатуру

смещение также может меняться. байты, которые могут меняться заменяем на wildcard (знак вопроса, кстати без разницы, можно два знака вопроса).

4C 8B 0D остаются неизменными, а далее идут 4 байта. 4C 8B 0D ? ? ? ?. проверяем на совпадения:
Посмотреть вложение 316953
дохуя. значит нам нужно в сигнатуру добавить следующие байты других инструкций, и также нужно убедиться, что там нету никаких смещений, иначе там тоже нужно использовать wildcard.

Посмотреть вложение 316961
test r9, r9 - вроде никакого смещения нету. 4C 8B 0D ? ? ? ? 4D 85 C9
Посмотреть вложение 316962
опять много совпадений. в итоге так далее следующие инструкции прибавляешь каждый раз, сверяешь совпадения и приходишь к:
4C 8B 0D ? ? ? ? 4D 85 C9 74 ? 41 83 F8 ? 74 ? 41 8B C8 81 E1 ? ? ? ? 8B C1 C1 E8 ? 4D 8B 14 C1

затем пишешь сканер сигнатур и получаешь найденный адрес. используешь предыдущую формулу, заменяя displacement32 на read<dword>(address + 3) и rip как адрес инструкции.

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

надеюсь понятно объяснил :pepe14:
Долго писал?Объяснил очень понятно
 
Назад
Сверху Снизу