Уроки Iczelion'а




Урок 7. Таблица экспорта - часть 8


ShowTheFunctions endp end start

Анализ:

mov edi,pNTHdr assume edi:ptr IMAGE_NT_HEADERS mov edi, [edi].OptionalHeader.DataDirectory.VirtualAddress .if edi==0 invoke MessageBox,0, addr NoExportTable,addr AppName,MB_OK+MB_ICONERROR

ret .endif

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

mov eax,[edi].NumberOfFunctions invoke RVAToFileMap, pMapping,[edi].nName invoke wsprintf, addr temp,addr ExportTable, eax, [edi].nBase, [edi].NumberOfFunctions, [edi].NumberOfNames, [edi].AddressOfFunctions, [edi].AddressOfNames, [edi].AddressOfNameOrdinals invoke AppendText,hDlg,addr temp

Мы отображаем важную информацию в структуре IMAGE_EXPORT_DIRECTORY в edit control'е.

push [edi].NumberOfNames pop NumberOfNames push [edi].nBase pop Base

Так как мы хотим перечислить вс имена функций, нам требуется знать, как много имен в таблице экспорта. nBase используется, когда мы хотим сконвертировать индексы, содержащиеся в массиве AddressOfFunctions в ординалы.

invoke RVAToFileMap,pMapping,[edi].AddressOfNames mov esi,eax invoke RVAToFileMap,pMapping,[edi].AddressOfNameOrdinals mov ebx,eax invoke RVAToFileMap,pMapping,[edi].AddressOfFunctions mov edi,eax

Адреса трех массивов сохранены в esi, ebx и edi, готовые для использования.

.while NumberOfNames>0

Продолжаем, пока все имена не будут обработанны.

invoke RVAToFileMap,pMapping,dword ptr [esi]

Так как esi указывает на массив RVA экспортируемых функций, разъименование ее даст RVA настоящего имени. Мы сконвертируем ее в виртуальный адрес, который будет передан затем wsрrintf.

mov dx,[ebx] movzx edx,dx mov ecx,edx add ecx,Base

ebx указывает на массив ординалов. Элементы этого массива размеров в слово.

Таким образом мы сначала должны сконвертировать значение в двойное слово. edx и ecx содержит индекс массива AddressOfFunctions. Мы добавляем значение nBase к ecx, чтобы получить номер ординала функции.

shl edx,2 add edx,edi

Мы умножаем индекс на 4 (каждый элемент в массиве AddressOfFunctions размером 4 байта), а затем, добавляем адрес массива AddressOfFunctions к нему. Таким образом edx указывает на RVA функции.

invoke wsprintf, addr temp,addr template,dword ptr [edx],ecx,eax invoke AppendText,hDlg,addr temp

Мы отображаем RVA, ординал и имя функции в edit control'е.

dec NumberOfNames add esi,4 add ebx,2 .endw

Обновим счетчик и адреса текущих элементов массивов AddressOfNames и AddressOfNameOrdinals. Продолжаем, пока все имена не будут обработаны.

[C] Iczelion, пер. Aquila.






Содержание  Назад