|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
05.05.2013, 15:47 | #1 |
Пользователь
Регистрация: 26.05.2011
Сообщений: 19
|
Поиск вызова библиотечной функции в двоичном коде
Здравствуйте. Имеется задача прочитать ЕХЕ-шник и начти в нем вызовы библиотечных функций (например, scrcopy).
Сначала подумал все будет просто - посмотрел по сигнатуре и сравнил, но потом понял, что в месте вызова функции находится только call xxx, который переходит непонятно куда (для меня непонятно ) + Если функция находится во вшенней библиотеке, то как можно узнать, что вызывается именно она, если в самом ЕХЕ-шнике ее кода не присутствует? Дизассемблеры типа IDA успешно и спокойно разпознают вызовы бибилиотечных функций, но я так и не понял, как это делается. С помощью гугла понял, что IDA использует технологию FLIRT (http://www.idapro.ru/description/flirt/). Но как искать в файле по сигнатуре, если самого кода функции там не нету, не понял.. Если у кого-нибудь есть идеи по этой теме, поделитесь пожалуйста |
05.05.2013, 17:12 | #2 |
Участник клуба
Регистрация: 23.12.2010
Сообщений: 1,129
|
Почитай про импорт и экспорт функций из dll.
Если функция находится во внешней библиотеке - ссылка на нее будет присутствовать в секции импортов exe-файла. Там будет название dll, из которой она импортируется, и название либо номер функции. И вызов будет осуществляться с помощью call по этой ссылке. |
05.05.2013, 17:35 | #3 |
Пользователь
Регистрация: 26.05.2011
Сообщений: 19
|
Спасибо за ответ!
Уже думал в подобном направлении. Т.е. алгоритм должен быть примерно таким? => 1. Смотрим в таблицу импорта и сопоставляем адрес вызова с функцией 2. Ищем в ЕХЕ-шнике в разделе кода call <адрес нужной функции> Но тогда не совсем понятно, как выполнить пункт 1, если в таблице импорта будет только порядковый номер функции.. Т.е. как определить, что в таблице мы нашли именно нужную функцию.. |
05.05.2013, 21:21 | #4 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
смотрите искомую длл, и смотрите по имени какой у функции номер.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
06.05.2013, 10:01 | #5 |
Пользователь
Регистрация: 26.05.2011
Сообщений: 19
|
Так и сделаю Всем большое спасибо!
|
07.05.2013, 15:18 | #6 |
Пользователь
Регистрация: 26.05.2011
Сообщений: 19
|
Копался - копался я с этими таблицами импорта, так и непонял, существует ли возможность определить адреса вызова футкций до загрузки программы в память? Напримет, в случае непривязанного импорта, если я все правильно понял, адреса импортируемых функций записывваются в время загрузки программы.. но тогда как можно заранее определить, какие инструкции искать?
Вот, например, как выглядит код вызова функции strcpy в дизассемблере: Код:
По идее, получается, что в программе мне нужно искать все команды "call @ILT+475(_strcpy)". Но как узнать, что я должен искать именно такую команду, ведь в таблице импорта нет никакой информации об этой метке. Я там нашел только RVA строк, которые хранят названия функций. |
07.05.2013, 17:31 | #7 |
Форумчанин
Регистрация: 23.04.2009
Сообщений: 346
|
адрес может быть в регистре, может передаваться откуда то в какой-либо ячейке памяти. задача нетривиальна и не имеет простых решений если необходимо узнать в каком именно месте кода программы вызвается фунция.
по смещениям на ячейку в таблице импотра можно найти все функции, но для этого опять же понадобиться как минимум дизассемблер длин с небольшим анализатором интструкций, анализ функций вызвающих разнообразные коллбэки, етц. это если реализовывать статический поиск. ну или можно динамически перехватив функцию тупо смотреть на адреса возвратов из нее, которые будут следующей после вызова данной функции инструкцией, но опять же это не откроет сразу все ветки программы которые могут вызвать функцию. PS: ollydbg может поставить брекпойнты на всех найденных ее анализатором вызовах нужной вам функции командой bpx %func_name%
Нет, ну правда..
|
07.05.2013, 17:43 | #8 |
Форумчанин
Регистрация: 23.04.2009
Сообщений: 346
|
Код:
call @ILT+475(_strcpy) (3B11E0h) и jmp strcpy (3B13F2h) опкоды е8 и е9 оперируют смещениями относительно окончания этих инструкций(смещения после кода операций и составляют dword). на адреса по этим смещениям передается управление. jmp dword ptr [__imp__strcpy (3B82DCh)] (FF 25) оперирует непосредственным значением в ячейке с абсолютным адресом(адрес также после непосредственно кода операции), коий является адресом ячейки в таблице импорта, которой загрузчик при инициализации вашего модуля задает значение равное адресу точки входа нужной функции (по имени, ординалу и по прочим боундимпортам). по поводу имен функций и всего прочего в таблице импорта смотрите доки по пе-формату благо тыщи их
Нет, ну правда..
|
07.05.2013, 17:44 | #9 |
Пользователь
Регистрация: 26.05.2011
Сообщений: 19
|
Спасибо за ответ! буду копатся ) Дело в том, что анализ нужно сделать именно статический. Случаи, когда функция вызывается нестандартными способами (когда ее адрес передается из непонятных мест ) я не рассматриваю.
Updated Всем огроменное спасибо, все понялось и получилось! Извините за мои глупые вопросы Последний раз редактировалось Alex071; 08.05.2013 в 14:09. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Обратный порядок битов в двоичном коде. (Си) | ivan1492 | Помощь студентам | 4 | 18.03.2013 21:44 |
(Visual Studio С++) циклический сдвиг, преобразования с числами в двоичном коде. | leftonedead | Помощь студентам | 2 | 16.12.2012 19:10 |
Поиск в двоичном дереве. | hgfdd | Общие вопросы C/C++ | 1 | 15.11.2012 01:32 |
представить картинку в двоичном коде | Dimarik | Общие вопросы C/C++ | 22 | 16.04.2011 22:52 |