Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 05.05.2013, 15:47   #1
Alex071
Пользователь
 
Аватар для Alex071
 
Регистрация: 26.05.2011
Сообщений: 19
По умолчанию Поиск вызова библиотечной функции в двоичном коде

Здравствуйте. Имеется задача прочитать ЕХЕ-шник и начти в нем вызовы библиотечных функций (например, scrcopy).
Сначала подумал все будет просто - посмотрел по сигнатуре и сравнил, но потом понял, что в месте вызова функции находится только call xxx, который переходит непонятно куда (для меня непонятно )
+ Если функция находится во вшенней библиотеке, то как можно узнать, что вызывается именно она, если в самом ЕХЕ-шнике ее кода не присутствует?
Дизассемблеры типа IDA успешно и спокойно разпознают вызовы бибилиотечных функций, но я так и не понял, как это делается.
С помощью гугла понял, что IDA использует технологию FLIRT (http://www.idapro.ru/description/flirt/). Но как искать в файле по сигнатуре, если самого кода функции там не нету, не понял..
Если у кого-нибудь есть идеи по этой теме, поделитесь пожалуйста
Alex071 вне форума Ответить с цитированием
Старый 05.05.2013, 17:12   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Почитай про импорт и экспорт функций из dll.

Если функция находится во внешней библиотеке - ссылка на нее будет присутствовать в секции импортов exe-файла. Там будет название dll, из которой она импортируется, и название либо номер функции. И вызов будет осуществляться с помощью call по этой ссылке.
Son Of Pain вне форума Ответить с цитированием
Старый 05.05.2013, 17:35   #3
Alex071
Пользователь
 
Аватар для Alex071
 
Регистрация: 26.05.2011
Сообщений: 19
По умолчанию

Спасибо за ответ!
Уже думал в подобном направлении. Т.е. алгоритм должен быть примерно таким? =>
1. Смотрим в таблицу импорта и сопоставляем адрес вызова с функцией
2. Ищем в ЕХЕ-шнике в разделе кода call <адрес нужной функции>
Но тогда не совсем понятно, как выполнить пункт 1, если в таблице импорта будет только порядковый номер функции.. Т.е. как определить, что в таблице мы нашли именно нужную функцию..
Alex071 вне форума Ответить с цитированием
Старый 05.05.2013, 21:21   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,003
По умолчанию

смотрите искомую длл, и смотрите по имени какой у функции номер.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.05.2013, 10:01   #5
Alex071
Пользователь
 
Аватар для Alex071
 
Регистрация: 26.05.2011
Сообщений: 19
По умолчанию

Так и сделаю Всем большое спасибо!
Alex071 вне форума Ответить с цитированием
Старый 07.05.2013, 15:18   #6
Alex071
Пользователь
 
Аватар для Alex071
 
Регистрация: 26.05.2011
Сообщений: 19
По умолчанию

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

Вот, например, как выглядит код вызова функции strcpy в дизассемблере:
Код:
	strcpy(s2, s1);
003B378A 8D 45 D8             lea         eax,[ebp-28h]  
003B378D 50                   push        eax  
003B378E 8B 4D CC             mov         ecx,dword ptr [ebp-34h]  
003B3791 51                   push        ecx  
003B3792 E8 49 DA FF FF       call        @ILT+475(_strcpy) (3B11E0h) 
...
@ILT+475(_strcpy):
003B11E0 E9 0D 02 00 00       jmp         strcpy (3B13F2h)  
...
strcpy:
003B13F2 FF 25 DC 82 3B 00    jmp         dword ptr [__imp__strcpy (3B82DCh)]
Получается, что все вызовы strcpy перенаправляются на метку "@ILT+475(_strcpy)", а оттуда уже на метку "strcpy".

По идее, получается, что в программе мне нужно искать все команды "call @ILT+475(_strcpy)". Но как узнать, что я должен искать именно такую команду, ведь в таблице импорта нет никакой информации об этой метке. Я там нашел только RVA строк, которые хранят названия функций.
Alex071 вне форума Ответить с цитированием
Старый 07.05.2013, 17:31   #7
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

адрес может быть в регистре, может передаваться откуда то в какой-либо ячейке памяти. задача нетривиальна и не имеет простых решений если необходимо узнать в каком именно месте кода программы вызвается фунция.
по смещениям на ячейку в таблице импотра можно найти все функции, но для этого опять же понадобиться как минимум дизассемблер длин с небольшим анализатором интструкций, анализ функций вызвающих разнообразные коллбэки, етц. это если реализовывать статический поиск. ну или можно динамически перехватив функцию тупо смотреть на адреса возвратов из нее, которые будут следующей после вызова данной функции инструкцией, но опять же это не откроет сразу все ветки программы которые могут вызвать функцию.
PS: ollydbg может поставить брекпойнты на всех найденных ее анализатором вызовах нужной вам функции командой bpx %func_name%
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 07.05.2013, 17:43   #8
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Код:
	strcpy(s2, s1);
003B378A 8D 45 D8             lea         eax,[ebp-28h]  
003B378D 50                   push        eax  
003B378E 8B 4D CC             mov         ecx,dword ptr [ebp-34h]  
003B3791 51                   push        ecx  
003B3792 E8 49 DA FF FF       call        @ILT+475(_strcpy) (3B11E0h)  
...
@ILT+475(_strcpy):
003B11E0 E9 0D 02 00 00       jmp         strcpy (3B13F2h)  
...
strcpy:
003B13F2 FF 25 DC 82 3B 00    jmp         dword ptr [__imp__strcpy (3B82DCh)]
в данном коде компилятор сгенерировал два стаба(хз зачем даже)
call @ILT+475(_strcpy) (3B11E0h) и jmp strcpy (3B13F2h) опкоды е8 и е9 оперируют смещениями относительно окончания этих инструкций(смещения после кода операций и составляют dword). на адреса по этим смещениям передается управление. jmp dword ptr [__imp__strcpy (3B82DCh)] (FF 25) оперирует непосредственным значением в ячейке с абсолютным адресом(адрес также после непосредственно кода операции), коий является адресом ячейки в таблице импорта, которой загрузчик при инициализации вашего модуля задает значение равное адресу точки входа нужной функции (по имени, ординалу и по прочим боундимпортам). по поводу имен функций и всего прочего в таблице импорта смотрите доки по пе-формату благо тыщи их
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 07.05.2013, 17:44   #9
Alex071
Пользователь
 
Аватар для Alex071
 
Регистрация: 26.05.2011
Сообщений: 19
По умолчанию

Спасибо за ответ! буду копатся ) Дело в том, что анализ нужно сделать именно статический. Случаи, когда функция вызывается нестандартными способами (когда ее адрес передается из непонятных мест ) я не рассматриваю.

Updated
Всем огроменное спасибо, все понялось и получилось! Извините за мои глупые вопросы

Последний раз редактировалось Alex071; 08.05.2013 в 14:09.
Alex071 вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обратный порядок битов в двоичном коде. (Си) 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