Получение таблицы импорта из DLL - PullRequest
0 голосов
/ 26 декабря 2018

Присоединение к DLL как дамп памяти с WinDbg выглядит (например)

cdb -z %__appdir__%kernel32.dll

Работает нормально, теперь я могу читать NT_IMAGE_HEADER структура

!dh kernel32 -f

Для чтения таблицы экспорта я использую следующую технику

dd kernel32+262c; * example of an export table RVA;

Количество экспортируемых функций во втором столбце второй строки и смещение относительно начала таблицы экспорта в первом столбце третьей строки.Проверьте это

dd kernel32+353c; * example of offset;
...; * take the first address in output;
da kernel32+4ba5
7c804ba5  "ActivateActCtx"

Бинго!Теперь мы можем использовать da снова и снова, чтобы увидеть другие экспортируемые функции, но это ужасный способ.Так что лучше использовать следующий трюк

? (kernel32+353c); * get hexadecimal address of first exported function;
r? @$t0 = (int *)0x7c80353c; * set the pointer on that address into pseudo-register;
.for (r @$t1 = 0; @$t1 < 3ba; r @$t1 = @$t1 + 1) {da kernel32+(@@c++(@$t0[@$t1]));}

В чем моя проблема?В данный момент я пытаюсь прочитать импортированные функции, но когда я набираю

dps kernel32 + 1000

, где 1000 - это RVA для Import Address Table Directory, у меня есть только часть адресовимен, а не имен.Итак, как я могу получить список всех имен импортируемых функций?Есть ли самый простой способ или я должен написать цикл снова?Как должен выглядеть цикл?

1 Ответ

0 голосов
/ 29 декабря 2018

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

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

, поэтому припопробуйте прочитать некоторые данные из области ненагруженной памяти
, которую вы видите ???(вопросительные знаки)

на самом деле у windbg есть три команды взрыва, которые вы можете использовать для этой цели

они
!showexports { address / mod } !showimports { address / mod } !showresources { address / mod }

команда! showimports также не будетработать с бинарными файлами, загруженными как дамп (cdb может зависнуть при попытке ReadARange и iirc. Я отправил письмо команде windbg очень давно (в эпоху 6.0 или xp), но такое же зависание появляется в 17763 windbg, который является последним на дату публикации

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

, чтобы подтвердить, что вы можете использовать команду! Vadump, и вы увидите, что cdb имеетсопоставленные страницы после размера таблицы импорта

C:\>cdb -c "!dh kernel32;q" -z c:\Windows\System32\kernel32.dll | grep -i "Import.*Address"
    1000 [     DFC] address [size] of Import Address Table Directory

C:\>cdb -c "dd kernel32+1df0;q" -z c:\Windows\System32\kernel32.dll
Microsoft (R) Windows Debugger Version 10.0.16299.15 X86
Loading Dump File [c:\Windows\System32\kernel32.dll]

0:000> cdb: Reading initial command 'dd kernel32+1df0;q'
77de1df0  ???????? ???????? ???????? 90909090  <<<<<<<<<<<<< 
77de1e00  90909090 90909090 90909090 90909090
quit:


C:\>cdb -c "!vadump;q" -z c:\Windows\System32\kernel32.dll

Microsoft (R) Windows Debugger Version 10.0.16299.15 X86
Loading Dump File [c:\Windows\System32\kernel32.dll]

0:000> cdb: Reading initial command '!vadump;q'
BaseAddress: 77de0000
RegionSize:  00001000

BaseAddress: 77de1dfc  <<<<<<<<<<<<<<<
RegionSize:  000c4204

BaseAddress: 77ea6000
RegionSize:  00001000

BaseAddress: 77ea7000
RegionSize:  00001000

BaseAddress: 77ea8000
RegionSize:  0000c000

quit:
...