И все — таки. Посмотреть список функций, вообще говоря, можно и стандартными средствами 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.












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