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