Для чего нужны сигнатуры?
Сигнатуры представляют собой последовательность байтов, необходима это последовательность, чтобы найти определенную функцию или определенную область кода игры.
Байты представляют собой ассеблерные инструкции. Т.е по факту это сам код игры только в ассемблерном представлении. А сами инструкции асемблера можно представить в виде HEX-чисел.
Получается что мы ищем этот паттерн байтов в коде игры и получаем адрес.
Например:
Чтобы представить скомпилированный код игры в ассемблерном виде нам необходим дизассемблер. В большинстве случаев используется либо Ghidra, либо IDA.
Я буду показывать на примере IDA PRO. Именно PRO, т.к в ней есть представление инструкций асемблера в псевдокод.
Ищем необходимую функцию сначала в исходниках игры. (Их можно найти на GitHub).
Например возьмем RadiusFlash. Сигнатура этой функции используется в расширении Blind Hook
RadiusFlash вызывается в другой функции в которой есть строки. Нам они и нужны, именно по строкам осуществляется поиск сигнатур.
По итогу будет выглядеть как-то так:
Теперь сгенерируем строки: View -> Open subviews -> Strings
В окне нажмем Ctrl + F, чтобы осуществить поиск строки и введем: Flashbang.Explode (посмотрите 1 скриншот, если не понимаете почему именно эта строка).
Переходим к строке и оказываемся в секции .rodata. Сюда компилятор складывает все константные значения, в том числе и строки.
Чтобы найти ту функцию, в которой эта строка используется нажмем X. Sub_XXXXXX – это функция. Их тут аж 3 штуки, но нам необходима 2. Вы можете сами потыкать по ним и посмотреть, что они из себя представляют.
Также вы можете сгенерировать псевдокод, чтобы понять как примерно эти функции выглядят.
1 и 3 функции вот такие:
А вторая нам подходит. Выше вызова функции со строкой Flashbang.Explode и находится RadiusFlash. Переходим к этой функции.
Получить сигнатуру RadiusFlash нам поможет скрипт.
makesig.idc скачать его можно здесь: https://github.com/pmrowla/sourcemod-central/tree/master/tools/ida_scripts
Теперь нам необходимо выполнить скрипт, который как раз позволит получить нам уникальный паттерн байтов из начала функции.
Итог:
Также добавлю откуда эти байты появились, если мы посмотрим ассемблерное представление функции, то получим как раз эти байты. Просто скрипт нам помогает найти именно УНИКАЛЬНУЮ последовательность байтов, а также подставляет пропуски(\x2A), там где это нужно, подробнее про это вы можете почитать здесь - Signature scanning - AlliedModders Wiki
Сигнатуры представляют собой последовательность байтов, необходима это последовательность, чтобы найти определенную функцию или определенную область кода игры.
Байты представляют собой ассеблерные инструкции. Т.е по факту это сам код игры только в ассемблерном представлении. А сами инструкции асемблера можно представить в виде HEX-чисел.
Получается что мы ищем этот паттерн байтов в коде игры и получаем адрес.
Например:
\x55\x89\xE5\x53\x83\xEC\x04\x8B\x5D\x2A\x8B\x83\x2A\x2A\x2A\x2A\x85\xC0\x74\x2A\x8B\x10\x85\xD2\x74\x2A\x83\xEC\x08
Чтобы представить скомпилированный код игры в ассемблерном виде нам необходим дизассемблер. В большинстве случаев используется либо Ghidra, либо IDA.
Я буду показывать на примере IDA PRO. Именно PRO, т.к в ней есть представление инструкций асемблера в псевдокод.
Ищем необходимую функцию сначала в исходниках игры. (Их можно найти на GitHub).
Например возьмем RadiusFlash. Сигнатура этой функции используется в расширении Blind Hook
RadiusFlash вызывается в другой функции в которой есть строки. Нам они и нужны, именно по строкам осуществляется поиск сигнатур.
- Исходники папки game(кроме папки client) – server.so/dll
- Исходники папки engine – engine.so/dll
По итогу будет выглядеть как-то так:
Теперь сгенерируем строки: View -> Open subviews -> Strings
В окне нажмем Ctrl + F, чтобы осуществить поиск строки и введем: Flashbang.Explode (посмотрите 1 скриншот, если не понимаете почему именно эта строка).
Переходим к строке и оказываемся в секции .rodata. Сюда компилятор складывает все константные значения, в том числе и строки.
Чтобы найти ту функцию, в которой эта строка используется нажмем X. Sub_XXXXXX – это функция. Их тут аж 3 штуки, но нам необходима 2. Вы можете сами потыкать по ним и посмотреть, что они из себя представляют.
1 и 3 функции вот такие:
Получить сигнатуру RadiusFlash нам поможет скрипт.
makesig.idc скачать его можно здесь: https://github.com/pmrowla/sourcemod-central/tree/master/tools/ida_scripts
Теперь нам необходимо выполнить скрипт, который как раз позволит получить нам уникальный паттерн байтов из начала функции.
Итог:
Также добавлю откуда эти байты появились, если мы посмотрим ассемблерное представление функции, то получим как раз эти байты. Просто скрипт нам помогает найти именно УНИКАЛЬНУЮ последовательность байтов, а также подставляет пропуски(\x2A), там где это нужно, подробнее про это вы можете почитать здесь - Signature scanning - AlliedModders Wiki