Операционная система Microsoft Windows 3.1 для программиста -том 3

       

Анализ DLL-библиотек при помощи утилиты tdump.exe


В комплекте системы разработки Borland Turbo C++ for Windows входит утилита tdump.exe , предназначенная для работы в среде MS-DOS. С помощью этой утилиты вы сможете проанализировать содержимое любой DLL-библиотеки, определив имена экспортируемых функций, их порядковые номера, имена DLL-библиотек и номера функций, импортируемых из этих библиотек и т. д.

В системном каталоге Windows имеется DLL-библиотека toolhelp.dll, предназначенная для создания отладочных средств и работы с внутренними структурами данных Windows. Мы выбрали эту библиотеку для наших исследований в основном из-за ее небольшого размера. Описание самой библиотеки выходит за рамки данного тома "Библиотеки системного программиста".

Итак, скопируйте библиотеку в любой временный каталог и введите в среде MS-DOS (или в среде виртуальной машины MS-DOS) следующую команду:

tdump toolhelp.dll toolhelp.map

В результате в файл toolhelp.map будет записано подробное описание библиотеки toolhelp.dll. Мы приведем полученный листинг с нашими комментариями.

Turbo Dump Version 3.1 Copyright (c) 1988, 1992 Borland International Display of File TOOLHELP.DLL

В начале файла DLL-библиотеки находится заголовок в формате MS-DOS. Он нас не интересует.

Old Executable Header

DOS File Size 3730h ( 14128. ) Load Image Size 359h ( 857. ) Relocation Table entry count 0000h ( 0. ) Relocation Table address 0040h ( 64. ) Size of header record (in paragraphs) 0004h ( 4. ) Minimum Memory Requirement (in paragraphs) 0000h ( 0. ) Maximum Memory Requirement (in paragraphs) FFFFh ( 65535. ) File load checksum 0000h ( 0. ) Overlay Number 0000h ( 0. )

Initial Stack Segment (SS:SP) 0000:00B8 Program Entry Point (CS:IP) 0000:0000

Далее в листинге приводится информация о заголовке загрузочного файла в формате Windows. Это так называемый заголовок нового исполняемого формата.

New Executable header Operating system Windows File Load CRC 0AABAA86Bh Program Entry Point (CS:IP) 0001:016A Initial Stack Pointer (SS:SP) 0000:0000 Auto Data Segment Index 0002h ( 2. ) Initial Local Heap Size 0200h ( 512. ) Initial Stack Size 0000h ( 0. ) Segment count 0002h ( 2. ) Module reference count 0002h ( 2. ) Moveable Entry Point Count 0000h ( 0. ) File alignment unit size 0010h ( 16. ) DOS File Size 3730h ( 14128. ) Linker Version 5.20






Обратите внимание, что в заголовке присутствует информация об адресе точки входа (Program entry Point). Начальное содержимое указателя стека (Initial Stack Pointer) равно нулю, так же как и начальный размер стека (Initial Stack Size). Это понятно, так как DLL-библиотека не имеет собственного стека.

В то же время начальный размер локальной области данных отличен от нуля и равен 512 байт (Initial Local Heap Size). Из заголовка можно также определить, что модуль DLL-библиотеки состоит из двух сегментов (Segment Count).

Далее в листинге приведены различные флаги. В частности, видно, что сегмент данных DGROUP имеет атрибуты single и может использоваться совместно различными приложениями (shared). Данный модуль может работать только в защищенном режиме (Protected mode only) и является ни чем иным, как DLL-библиотекой (Module type - Dynamic link Library(DLL)).

Program Flags DGROUP : single (shared) Global initializaton : No Protected mode only : Yes Application type : Uses windowing API Self Loading : No Errors in image : No Module type : Dynamic link Library (DLL) Other EXE Flags 2.X protected mode : No 2.X proportional font : No Gangload area : Yes Start of Gangload Area 03E0h Length of Gangload Area 3160h Miminum code swap area size 0 Expected Windows Version 3.00

Затем в листинге перечисляются различные таблицы с указанием их смещения и размера:

Segment Table Offset: 00C0h Length: 0010h Resource Table Offset: 00D0h Length: 0018h Resident Names Table Offset: 00E8h Length: 0012h Module Reference Table Offset: 00FAh Length: 0004h Imported Names Table Offset: 00FEh Length: 000Dh Entry Table Offset: 010Bh Length: 0070h Nonresident Names Table Offset: 017Bh Length: 0236h

Это таблица сегментов. В ней описаны два сегмента. Первый сегмент является сегментом кода, второй - сегментом данных.

Segment Table offset: 00C0h

Segment Number: 01h Segment Type: CODE Alloc Size : 2EEEh Sector Offset: 0040h File length: 2EEEh Attributes: Preloaded Relocations

Segment Number: 02h Segment Type: DATA Alloc Size : 0120h Sector Offset: 033Eh File length: 0120h Attributes: Sharable Preloaded



Далее приводится информация о ресурсах DLL-библиотеки. Таблица ресурсов описывает единственный ресурс типа Version info, описывающий версию модуля.

Resource Table offset: 00D0h

Sector size: 0010h

type: Version info Identifier: 1 offset: 03540h length: 01F0h Attributes: Moveable Shareable

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

Resident Name Table offset: 00E8h Module Name: 'TOOLHELP' Name: WEP Entry: 0001

Таблица ссылок на модули содержит имена модулей (DLL-библиотек), на которые ссылаются функции, расположенные в исследуемой библиотеке. Как видно из листинга, функции библиотеки toolhelp.dll ссылаются на модули KERNEL и USER. Эти модули являются основными компонентами операционной системы Windows и расположены, соответственно, в файлах krnl386.exe, krnl286.exe и user.exe.

Module Reference Table offset: 00FAh Module 1: KERNEL Module 2: USER

Imported Names Table offset: 00FEh name offset KERNEL 0001h USER 0008h

Таблица входов (Entry Table) описывает экспортируемые функции. Для каждой функции приводится ее порядковый номер и смещение.

Entry Table offset: 010Bh Fixed Segment Records ( 1 Entries) Segment: 0001h Entry 1: Offset: 018Ah Exported Single data

Null Entries: 48

Fixed Segment Records ( 34 Entries) Segment: 0001h Entry 50: Offset: 057Bh Exported Single data Entry 51: Offset: 0318h Exported Single data Entry 52: Offset: 0399h Exported Single data Entry 53: Offset: 02A2h Exported Single data Entry 54: Offset: 0417h Exported Single data Entry 55: Offset: 04A9h Exported Single data Entry 56: Offset: 090Eh Exported Single data Entry 57: Offset: 095Eh Exported Single data Entry 58: Offset: 09E9h Exported Single data Entry 59: Offset: 0A90h Exported Single data Entry 60: Offset: 0AD9h Exported Single data Entry 61: Offset: 0B15h Exported Single data Entry 62: Offset: 0B8Ch Exported Single data Entry 63: Offset: 0CAAh Exported Single data Entry 64: Offset: 0CEDh Exported Single data Entry 65: Offset: 0D2Eh Exported Single data Entry 66: Offset: 0F1Ch Exported Single data Entry 67: Offset: 0F67h Exported Single data Entry 68: Offset: 0FCAh Exported Single data Entry 69: Offset: 28B0h Exported Single data Entry 70: Offset: 2925h Exported Single data Entry 71: Offset: 11CEh Exported Single data Entry 72: Offset: 13F4h Exported Single data Entry 73: Offset: 1B72h Exported Single data Entry 74: Offset: 1C29h Exported Single data Entry 75: Offset: 2060h Exported Single data Entry 76: Offset: 2111h Exported Single data Entry 77: Offset: 26EAh Exported Single data Entry 78: Offset: 29C4h Exported Single data Entry 79: Offset: 2B6Ch Exported Single data Entry 80: Offset: 2DAEh Exported Single data Entry 81: Offset: 0D68h Exported Single data Entry 82: Offset: 0D97h Exported Single data Entry 83: Offset: 0DC0h Exported Single data



Имена и порядковые номера экспортируемых функций приведены в таблице нерезидентных имен (Non-Resident Name Table):

Non-Resident Name Table offset: 017Bh Module Description: 'TOOLHELP - Debug/Tool Helper library' Name: TASKSETCSIP Entry: 81 Name: MEMMANINFO Entry: 72 Name: STACKTRACEFIRST Entry: 66 Name: MEMORYWRITE Entry: 79 Name: GLOBALINFO Entry: 53 Name: TASKNEXT Entry: 64 Name: CLASSNEXT Entry: 70 Name: GLOBALENTRYHANDLE Entry: 54 Name: GLOBALHANDLETOSEL Entry: 50 Name: INTERRUPTREGISTER Entry: 75 Name: STACKTRACECSIPFIRST Entry: 67 Name: LOCALNEXT Entry: 58 Name: INTERRUPTUNREGISTER Entry: 76 Name: MODULENEXT Entry: 60 Name: LOCALINFO Entry: 56 Name: TASKFINDHANDLE Entry: 65 Name: TASKSWITCH Entry: 83 Name: MEMORYREAD Entry: 78 Name: NOTIFYREGISTER Entry: 73 Name: GLOBALNEXT Entry: 52 Name: TIMERCOUNT Entry: 80 Name: MODULEFINDHANDLE Entry: 62 Name: MODULEFIRST Entry: 59 Name: GLOBALENTRYMODULE Entry: 55 Name: STACKTRACENEXT Entry: 68 Name: GLOBALFIRST Entry: 51 Name: SYSTEMHEAPINFO Entry: 71 Name: TERMINATEAPP Entry: 77 Name: TASKFIRST Entry: 63 Name: NOTIFYUNREGISTER Entry: 74 Name: TASKGETCSIP Entry: 82 Name: CLASSFIRST Entry: 69 Name: MODULEFINDNAME Entry: 61 Name: LOCALFIRST Entry: 57

Далее в листинге описываются ссылки на импортируемые модули. Каждая такая ссылка состоит из имени модуля (в нашем случае это KERNEL или USER) и порядкового номера импортируемой функции. Сделав дамп файла krnl386.exe при помощи утилиты tdump.exe, вы сможете определить, что ссылке KERNEL.3 соответствует функция GetVersion, ссылке KERNEL.4 - функция LocalInit, а ссылке KERNEL.5 - функция LocalAlloc.

Segment Relocation Records

Segment 0001h relocations

type offset target BASE 2BBBh 0001h:0000h BASE 2E93h 0002h:0000h PTR 020Fh KERNEL.3 PTR 0177h KERNEL.4 PTR 27D9h KERNEL.5 PTR 28A5h KERNEL.7 PTR 2761h KERNEL.137 OFFS 2D47h KERNEL.114 BASE 0214h KERNEL.18 PTR 2E66h USER.13 PTR 0E2Bh KERNEL.150 PTR 01EAh KERNEL.28 PTR 27B0h KERNEL.36 PTR 23E5h KERNEL.170 PTR 223Dh KERNEL.47 PTR 23FDh KERNEL.176 PTR 224Fh KERNEL.50 PTR 0B66h USER.430 PTR 28F6h USER.179 PTR 29A5h KERNEL.72 OFFS 2EC1h KERNEL.178 PTR 1D79h KERNEL.202 OFFS 27EFh 0001h:16C5h LOBYTE 2ACEh KERNEL.114 additive LOBYTE 2CA4h KERNEL.114 additive Relocations: 25


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