вторник, 21 февраля 2012 г.

IDA и Appcall: зачем это все?

Начиная с версии IDA Pro 5.6 появился достаточно интересный, но не однозначный функционал, который позволяет вызывать нативные функции из отлаживаемого приложения прямо в процессе его отладки. Называется он appcall, но я встречал мало людей, которые действительно нашли ему применение в реальной жизни. Для себя же я счел его полезным для некоторых вещей в процессе исследования вредоносных программ, о чем и хочу рассказать вам ниже.

Одно самое важное ограничение appcall, это работа только в режиме отладки, то есть с уже запущенной программой, что в моем случае не всегда удобно, так как исследование вредоносных программ не всегда возможно в отладчике IDA. Причин на это достаточно много, начиная от более привычного и удобного для меня интерфейса OllyDbg и заканчивая рядом возможностей ольки, которых просто нет в отладчике IDA. Но при всем при этом, appcall парой может быть полезен. Например, во вредоносной программе используется функция хеширования для сокрытия явного обращения к библиотечным функциям, можно реализовать ее функционал в виде скрипта и обращать непонятные значения во волне читаемые имена функций, но это все же займет больше времени, чем просто вызывать соответствующий блок кода из уже отлаживаемой программы.


К примеру реализовать такую функциональность можно достаточно просто в Immunity Debugger, так как там реализован достаточно мощный интерфейс для python, который позволяет получить доступ практически ко всем функциональным возможностям этого отладчика.


В принципе таким образом мы можем выполнить любую часть кода находящегося в данный момент в памяти отлаживаемого процесса.

С точки зрения удобства реализованный подход в appcall более удобен и продуман. Он позволяет решать некоторые вопросы связанные с автоматизацией процесса фаззинга (например, можно быстро реализовать фаззер для проверки входных параметров различных функций), но нас больше интересует, как  appcall  может быть использован в задачах автоматизации анализа вредоносных программ. Мне уже встречалась англоязычная публикация об использовании appcall для расшифрования строк в одной из последних модификаций Zeus. Но давайте рассмотрим аналог того простейшего примера, что был реализован выше для Immunity Debugger.

s_in = Appcall.byref("encrypted") # создаем ссылку на входной буфер
s_out = Appcall.buffer(" ", sz) # создаем выходной буфер
Appcall.decrypt_buf(s_in, s_out, sz) # вызываем функцию decrypt_buf 
print "decrypted=", s_out.value

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

Python>getmodulehandle = Appcall.proto("__imp__GetModuleHandleW@4", "int (__stdcall *GetModuleHandleW)(LPCWSTR lpModuleName);")
Python>hmod = getmodulehandle(Appcall.unicode("kernel32.dll"))
Python>print hex(hmod)
0x7c800000L

Appcall достаточно интересный функционал и если с ним разобраться, то можно значительно эффективнее решать некоторые повседневные задачи ;)

Что еще почитать по теме:
Appcall user guide [pdf]