Реальная задача на IDAPython


Илья 05/02/2011 Комментарии отключены

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

Как известно, IDA является основным инструментом вирусных аналитиков, используемым для статического анализа отловленной малвари. Малварь же, в свою очередь, стремится как можно сильнее усложнить процедуру исследования. Очень часто при исследовании вредоносных программ обнаруживается, что приложение не импортирует никаких функций. Или, например, заменяет имена API — вызовов хэшами, определяя адрес нужной функции путем поиска в таблице экспорта, вычисляя хэш для каждого имени и сравнивая с желаемым. Рассмотрим этот прием подробнее.

[box type="info"]Повторюсь еще раз — только качественная оптимизация сайтов, например, какую делают специалисты из adlabs.com.ua, способна дать реальные результаты в продвижении вашего сайта.[/box]

Программа из РЕВ (Process Environment Block] получает адрес библиотеки kernel32.dll и в ее таблице экспорта ищет по хэшу адреса LoadLibrary и GetProcAddress. С помощью этих двух вызовов можно подгружать остальные библиотеки и искать в них адреса нужных функций. Вообще функция GetProcAddress даже не нужна, так как, зная адрес библиотеки, можно самостоятельно получить адрес нужной функции из таблицы экспорта.

Это популярный механизм, который нередко используется в малвари. Итак, вырисовывается вполне понятная задача — написать скрипт, который автоматизировал бы поиск названий функций и упростил таким образом жизнь реверсера. Чтобы разговор был предметным, напишем небольшое подопытное приложение, которое будет использовать вышеперечисленные техники маскировки. Весь функционал приложения будет сводиться к выводу сообщения «НеИо, world!» при помощи функции MessageBox.

Для этого нам потребуется всего три типа вызовов: GetKernelAddressO для получения адреса kernel32.dll, CalcHashO для вычисления хэша по имени функции, а также GetProcAddressExl для получения адреса функции по хэшу. Полный исходный код тестового приложения ты найдешь на диске:

int main (
HMODULE kernel32, user32;
получаем адрес kernel32.dll
kernel32 = GetKernelAddressO;
получаем адрес функции LoadLibraryA
tLoadLibraryA pLoadLibraryA =
GetProcAddressExl kernel32, 0xC8AC8026 ); загружаем библиотеку user32.dll user32 = pLoadLibraryA
GetProcAddressExl user32, 0xABBC680D ); pMessageBoxA ; return 0;
)

Как видишь, никаких вызовов API — функций в чистом виде. Обращение к MessageBox превратилось в call . Причем в случае настоящей малвари были бы зашифрованы еще и строки. На практике такой простой прием может значительно увеличить время анализа приложения. Как быть?

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

В нашем текстовом образце — всего несколько вызовов, поэтому нет большой проблемы просто запустить отладчик и посмотреть, куда приведет нас call. Но что делать, когда таких вызовов сотни? Вот тут — то и понадобятся возможности IDAPython.

Коментарии закрыты