|
07.10.2013, 14:53
|
||||||||||
Сигнатуры функций07.10.2013, 14:53. Показов 6017. Ответов 0
Метки нет (Все метки)
Автор: 6a6kin
Содержание:
I. Основы Знаете ли вы, во что превращается код программы на C++ или ассемблере после компиляции? Тот, кто когда-нибудь открывал исполняемые файлы текстовым редактором, видел там только кучу непонятных символов. На самом деле, это последовательность байт, в которую превратилась ваша программа. Все дело в том, что процессор ничего знает о С++, классах, объектах, он даже не видит разницы между положительными и отрицательными числами. Процессор умеет выполнять только микрокоманды, вроде сложения или деления. Эти микрокоманды представляют собой небольшие последовательности байт, из которых и состоит программа. Считывая байты, процессор распознает микрокоманды и выполняет их. Однако исполняемые файлы состоят не только из микрокоманд. Как в Windows, так и в GNU\Linux программа и данные, с которыми она работает, содержаться в специальной оболочке, которая определяет формат файла. В Windows это PE формат, а в GNU\Linux - ELF формат. Каждый файл содержит заголовок, которые сообщает о том, какой формат у этого файла. В случае исполняемых файлов, программа делится на заголовок и секции. Заголовок содержит информацию о самом файле и его секциях. Секции могут содержать различного рода данные, в том числе и микрокоманды. ОС считывает заголовок, чтобы знать, как правильно работать с этим файлом. Процессор не знает, где конец функции, где текстовые данные, а где микрокоманды. Управление работой процессора выполняется с помощью самих микрокоманд. Например, прямо посреди кода можно разместить текст "Hello, brah", но при этом добавить микрокоманды, указывающие процессору, что данную последовательность байт считывать не нужно. Это означает, что функции сами регулируют, где они заканчиваются и никаких разделителей между ними нет. Микрокоманды функций идут друг за другом. Так что же представляют из себя микрокоманды? Условно разделим последовательность байт микрокоманды на следующие части: опкод, операнды. На самом деле, строение микрокоманд более сложное, но для понимания хватит и такого представления. Опкод микрокоманды - её уникальное имя, причем чаще всего, одна асемблерная команда может соответствовать нескольким машинным, что сделано для удобства. Операнды могут быть представлены в виде непосредственных значений, адресов, регистров. Иногда операнд в виде регистра может формировать микрокоманду с другим опкодом. Адрес представляет собой смещение относительно начала файла, в котором содержится функция. И вот мы подошли к теме нашей статьи. Что такое сигнатура функции? Общепринято сигнатурой функции считать уникальное имя функции, позволяющее транслятороу распознать её среди других функций. В GNU\Linux данные имена называются символами. И вроде бы все хорошо, но вот иногда эти имена исключают из программы и найти функцию по этому имени невозможно. Поэтому в контексте наших статей, сигнатура функции - это любая уникальная последовательность байт(которые представляют собой набор микрокоманд функции), существующая только в пределах этой функции. Причем вся последовательность микрокоманд функции также является её сигнатурой. Возникает вопрос: почему бы просто не искать последовательность микрокоманд функции целиком? Во-первых, размер функции может быть очень большим. А во-вторых, как уже обсуждалось ранее, в качестве операндов микрокоманд могут использоваться адреса. И эти адреса могут быть изменены массой различных причин. Именно поэтому необходимо создать шаблон сигнатуры функции, который можно будет использовать для поиска функции в "изменчивой среде". В следующей статье будет рассмотрено применение полученных сигнатур для поиска функций в исполняемом файле. После чего функцию можно перехватить (сплайсинг) посредством изменения её тела, например, вставить трамплин на собственную функцию обработчик. II. Создание шаблона сигнатуры функции Шаблон состоит из двух частей: сигнатуры и маски. Сигнатурой является та самая уникальная последовательность байт. Маска указывает на то, какие части сигнатуры могут изменятся, чтобы игнорировать их при поиске. Для получения нужной нам информации будем использовать Interactive Disassemler(IDA). После открытия исследуемой библиотеки, необходимо включить показ кодов микрокоманд. В меню Options->General... во вкладке Disassembly в поле Number of opcode bytes поставьте 10. После чего слева от ассемблерных микрокоманд появятся их машинное представление. Как только вы нашли требуемуемую функцию, можно приступать к созданию шаблона. Сигнатурой функции является та самая уникальная последовательность байт. Просто скопируйте их из дизассемблера. Главное условие - эта последовательность должна быть уникальна в пределах программы. Я использую 32 байта в качестве сигнатуры, но размер никак не ограничен. Сразу следует отметить, что это должны быть именно ПЕРВЫЕ n байт, так как адресом является точка входа функции, а это и есть её начало. Это упрощает поиск. Далее нужно составить маску сигнатуры, тем самым исключив динамические части. Адреса, как операнды микрокоманд, изменяются всегда. На самом деле, только их исключать из поиска и имеет смысл. Обычно это микрокоманды:
Рассмотрим небольшой пример. После кода идут символы маски, которые соответствуют кодам микрокоманд.
В дополнение о символах. В GNU\Linux библиотеках hlds присутствуют символы функций, с помощью которых можно искать функции. Рекомендуется именно так и делать, так как изменение функции не повлечет за собой изменение символа(исключая случаи, когда изменяются аргументы - обычно символы включают имя функции и её аргументы). В Windows библиотеках символы отсутствуют. Приложение А. Поиск необходимой функции Еще одно узкое место - найти дизассемблированный код функции в IDA. Вот несколько советов:
http://i.creativecommons.org/l/by-sa/3.0/88x31.png This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
4
|
|||||||||||
07.10.2013, 14:53
|
||
|
Ответы с готовыми решениями:
0
Изменятся ли сигнатуры функций в программе при обфускации? Сигнатуры сигнатуры |
07.10.2013, 14:53
|
||
|
Антивирусные сигнатуры Неправильные сигнатуры МК Отправка сигнатуры Проверка сигнатуры файла Сигнатуры класса и библиотеки Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|
|
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики
1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
|
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928
Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
|
|
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего
Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
|
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы
Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
|
|
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока
Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
|
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
|