Анализ DLL-библиотек при помощи программы dumpbin.exe
В комплекте системы разработки Microsoft Visual C++ входит программа dumpbin.exe, предназначенная для запуска из командной строки. С помощью этой утилиты вы сможете проанализировать содержимое любого загрузочного файла в формате COFF, в том числе DLL-библиотеки, определив имена экспортируемых функций, их порядковые номера, имена DLL-библиотек и номера функций, импортируемых из этих библиотек и т. д. Можно даже дизассемблировать секции кода с использованием таблицы символов, если такая имеется в файле.
Выберем для исследования DLL-библиотеку comdlg32.dll, в которой находятся функции для работы со стандартными диалоговыми панелями.
Вначале запустим программу dumpbin.exe, передав ей в качестве параметра имя DLL-библиотеки:
c:\msdev\bin>dumpbin comdg32.dll > lst.txt
Перед запуском программы dumpbin.exe мы скопировали файл comdg32.dll в каталог c:\msdev\bin.
Программа запишет в файл lst.txt информацию о типе файла (DLL-библиотека) и перечислит названия секций и их размер, как это показано ниже:
Microsoft (R) COFF Binary File Dumper Version 3.10.6038
Copyright (C) Microsoft Corp 1992-1996. All rights reserved.
Dump of file comdlg32.dll
File Type: DLL
Summary
4000 .data
1000 .edata
2000 .rdata
2000 .reloc
9000 .rsrc
17000 .text
Ниже мы перечислили названия некоторых стандартных секций (полное описание вы найдете в документации, которая поставляется в составе использованного вами средства разработки приложений для Microsoft Windows NT):
Название | Описание | ||
.data | Секция инициализированных данных | ||
.text | Секция кода | ||
.rdata | Данные, которые можно только читать во время выполнения | ||
.edata | Таблица экспортируемых имен | ||
.reloc | Таблица перемещений | ||
.rsrc | Ресурсы | ||
.bss | Секция неинициализированных данных | ||
.xdata | Таблица обработки исключений | ||
.CRT | Данные библиотеки C, которые можно только читать во время выполнения | ||
.debug | Отладочная информация | ||
.tls | Локальная память задач |
Для просмотра более подробной информации о секции следует воспользоваться параметром /SECTION:
c:\msdev\bin>dumpbin comdg32.dll /SECTION:.data > lst.txt
Результат выполнения этой команды показан ниже:
Microsoft (R) COFF Binary File Dumper Version 3.10.6038
Copyright (C) Microsoft Corp 1992-1996. All rights reserved.
Dump of file comdlg32.dll
File Type: DLL
SECTION HEADER #3
.data name
35E4 virtual size
1A000 virtual address
E00 size of raw data
18C00 file pointer to raw data
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
C8000040 flags
Initialized Data
Not Paged
(no align specified)
Read Write
Summary
4000 .data
Аналогичная информация о секции .text приведена ниже:
Microsoft (R) COFF Binary File Dumper Version 3.10.6038
Copyright (C) Microsoft Corp 1992-1996. All rights reserved.
Dump of file comdlg32.dll
File Type: DLL
SECTION HEADER #1
.text name
16FF9 virtual size
1000 virtual address
17000 size of raw data
400 file pointer to raw data
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
68000020 flags
Code
Not Paged
(no align specified)
Execute Read
Summary
17000 .text
Для просмотра списка имен экспортируемых функций и глобальных переменных запустите программу dumpbin.exe с параметром /EXPORTS:
c:\msdev\bin>dumpbin comdg32.dll /EXPORTS > lst.txt
Список появится в следующем виде:
Microsoft (R) COFF Binary File Dumper Version 3.10.6038
Copyright (C) Microsoft Corp 1992-1996. All rights reserved.
Dump of file comdlg32.dll
File Type: DLL
Section contains the following Exports for comdlg32.dll
0 characteristics
30D0D8ED time date stamp Fri Dec 15 05:09:49 1995
0.00 version
1 ordinal base
23 number of functions
23 number of names
ordinal hint name
1 0 ChooseColorA (00012442)
2 1 ChooseColorW (0001164F)
3 2 ChooseFontA (00009235)
4 3 ChooseFontW (00014028)
5 4 CommDlgExtendedError (0000F92A)
6 5 FindTextA (0001373A)
7 6 FindTextW (0001372A)
8 7 GetFileTitleA (0000FB57)
9 8 GetFileTitleW (0000FAF1)
10 9 GetOpenFileNameA (00004952)
11 A GetOpenFileNameW (0000F9EE)
12 B GetSaveFileNameA (0000493B)
13 C GetSaveFileNameW (0000FA37)
14 D LoadAlterBitmap (0000A450)
15 E PageSetupDlgA (00014277)
16 F PageSetupDlgW (00014373)
17 10 PrintDlgA (0000738E)
18 11 PrintDlgW (00014238)
19 12 ReplaceTextA (0001375A)
20 13 ReplaceTextW (0001374A)
21 14 WantArrows (000122D5)
22 15 dwLBSubclass (000018F7)
23 16 dwOKSubclass (000018C4)
Summary
4000 .data
1000 .edata
2000 .rdata
2000 .reloc
9000 .rsrc
17000 .text
Наряду с именами функций здесь отображаются порядковые номера функций и их адреса (в скобках).
Указав параметр /DISASM, вы можете дизассемблировать секцию кода, однако полученный в результате листинг может оказаться слишком большим и трудным для анализа. Вот фрагмент такого листинга:
Microsoft (R) COFF Binary File Dumper Version 3.10.6038
Copyright (C) Microsoft Corp 1992-1996. All rights reserved.
Dump of file comdlg32.dll
File Type: DLL
77DF1000: 83 3D EC C4 E0 77 cmp dword ptr ds:[77E0C4ECh],0
00
77DF1007: 56 push esi
77DF1008: 75 2D jne 77DF1037
77DF100A: 83 3D 8C C7 E0 77 cmp dword ptr ds:[77E0C78Ch],0
00
77DF1011: 8B 74 24 08 mov esi,dword ptr [esp+8]
77DF1015: 0F 84 93 97 00 00 je 77DFA7AE
77DF101B: 83 FE 01 cmp esi,1
77DF101E: 1B C0 sbb eax,eax
77DF1020: 24 FE and al,0FEh
77DF1022: 05 02 7F 00 00 add eax,7F02h
77DF1027: 50 push eax
77DF1028: 6A 00 push 0
В заключение этого раздела приведем список параметров программы dumpbin.exe.
Параметр | Описание |
/ALL | Просмотр всей доступной информации, исключая листинг дизассемблирования |
/ARCHIVEMEMBERS | Просмотр минимальной информации об объектах библиотеки |
/DISASM | Дизассемблирование секции кода |
/EXPORTS | Просмотр экспортируемых имен |
/FPO | Просмотр записи FPO (Frame Pointer Optimization) |
/HEADERS | Просмотр заголовка файла и заголовков каждой секции, либо заголовка каждого объекта, расположенного в библиотеке |
/IMPORTS | Просмотр импортированных имен |
/LINENUMBERS | Просмотр номеров строк формата COFF |
/LINKERMEMBER | Просмотр доступных символов, опередленных в библиотеке как public |
/OUT:ИмяФайла | Запись выходной информации не на стандартное устройство вывода (консоль), а в файл с именем ИмяФайла |
/RAWDATA | Просмотр дампа каждой секции |
/RELOCATIONS | Просмотр таблицы перемещений |
/SECTION:Секция | Просмотр информации только о секции, имеющей имя Секция |
/SUMMARY | Просмотр минимальной информации о секциях |
/SYMBOLS | Просмотр таблицы символов формата COFF |