Поле OrdinalBase таблицы экспорта PE игнорируется? - PullRequest
7 голосов
/ 13 апреля 2011

По моему опыту и опыту других (http://webster.cs.ucr.edu/Page_TechDocs/pe.txt), в документе спецификации PE / COFF неправильно утверждается, что индексы таблицы адресов экспорта, содержащиеся в порядковой таблице, относятся к порядковой базе, и даже приводится неверный пример (раздел5.3) На самом деле индексы в Порядковой таблице - это индексы, основанные на 0, в Таблице адресов для обычного случая, когда Порядковый номер = 1. Я видел это в сгенерированных библиотеках VS Studio PE и в системных библиотеках, таких как Kernel32.dll.

У меня такой вопрос: вы когда-нибудь наблюдали двоичный файл с порядковым основанием, которое не было равно 1? Я хочу знать, является ли это ошибкой, равной единице, или не применяется ли порядковая базак порядковым записям в таблице.

Ответы [ 3 ]

4 голосов
/ 13 апреля 2011

Вот дамп для mfc42.dll, версия 6.06.8064.0.

Microsoft (R) COFF/PE Dumper Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file mfc42.dll

File Type: DLL

  Section contains the following exports for MFC42.dll

    00000000 characteristics
    4D79A4A3 time date stamp Fri Mar 11 05:27:15 2011
        0.00 version
           5 ordinal base
        6939 number of functions
           6 number of names

    ordinal hint RVA      name

          5    0 0000ED7C ?classCCachedDataPathProperty@CCachedDataPathProperty@@2UCRuntimeClass@@B
          6    1 0000ED44 ?classCDataPathProperty@CDataPathProperty@@2UCRuntimeClass@@B
          7    2 000DEEAC DllCanUnloadNow
          8    3 000DEE6C DllGetClassObject
          9    4 000DED0A DllRegisterServer
         10    5 000DEEDE DllUnregisterServer
        256      0004F84F [NONAME]
        [...]
       6943      0003B412 [NONAME]

Вот как это выглядит в двоичном файле:

;
; Export directory for MFC42.dll
;
                dd 0                    ; Characteristics
                dd 4D79A4A3h            ; TimeDateStamp: Fri Mar 11 05:27:15 2011
                dw 0                    ; MajorVersion
                dw 0                    ; MinorVersion
                dd rva aMfc42_dll       ; Name
                dd 5                    ; Base
                dd 1B1Bh                ; NumberOfFunctions
                dd 6                    ; NumberOfNames
                dd rva functbl          ; AddressOfFunctions
                dd rva nametbl          ; AddressOfNames
                dd rva nameordtbl       ; AddressOfNameOrdinals
;
; Export Address Table for MFC42.dll
;
functbl         dd rva ?classCCachedDataPathProperty@CCachedDataPathProperty@@2UCRuntimeClass@@B; 0
                dd rva ?classCDataPathProperty@CDataPathProperty@@2UCRuntimeClass@@B; 1
                dd rva DllCanUnloadNow  ; 2
                dd rva DllGetClassObject; 3
                dd rva DllRegisterServer; 4
                dd rva DllUnregisterServer; 5
                dd 0F5h dup(rva __ImageBase); 6
                dd rva ??0_AFX_CHECKLIST_STATE@@QAE@XZ; 251
                [...]
;
; Export Names Table for MFC42.dll
;
nametbl         dd rva a?classccachedd, rva a?classcdatapat, rva aDllcanunloadno
                dd rva aDllgetclassobj, rva aDllregisterser, rva aDllunregisters
;
; Export Ordinals Table for MFC42.dll
;
nameordtbl      dw 0, 1, 2, 3, 4, 5

Так что даправо и индексы в порядковой таблице на основе 0 .

3 голосов
/ 08 декабря 2013

Это не единичная ошибка, и Порядковая база применяется не к записям Порядковой таблицы, а к вычислению самого порядкового номера.И да, спецификация Microsoft PE (http://msdn.microsoft.com/en-us/library/windows/hardware/gg463119.aspx, раздел 5.3.4) неверна.Вот как должны быть выполнены расчеты:

i = Search_ExportNamePointerTable(ExportName);
ordinal = ExportOrdinalTable[i] + OrdinalBase;  // The "+ OrdinalBase" is missing in the official PE specification
SymbolRVA = ExportAddressTable[ordinal - OrdinalBase];

Или, выраженные по-другому:

i = Search_ExportNamePointerTable(ExportName);
offset = ExportOrdinalTable[i];
SymbolRVA = ExportAddressTable[offset];
ordinal = OrdinalBase + offset;

Если я дам мне свой файл mfc42.dll ...

dumpbin mfc42.dll /exports |more

... вот что я получаю:

Microsoft (R) COFF/PE Dumper Version 12.00.20827.3
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file mfc42.dll

File Type: DLL

  Section contains the following exports for MFC42.dll

    00000000 characteristics
    4D798B26 time date stamp Fri Mar 11 03:38:30 2011
        0.00 version
           5 ordinal base
        6888 number of functions
           8 number of names

    ordinal hint RVA      name

       1452    0 000EF5D8 ?AfxFreeLibrary@@YAHPEAUHINSTANCE__@@@Z
       1494    1 000EF5A4 ?AfxLoadLibrary@@YAPEAUHINSTANCE__@@PEBD@Z
       1497    2 000F8344 ?AfxLockGlobals@@YAXH@Z
       1587    3 000F83DC ?AfxUnlockGlobals@@YAXH@Z
          7    4 000FC83C DllCanUnloadNow
          8    5 000FC7E0 DllGetClassObject
          9    6 000FC870 DllRegisterServer
         10    7 000FC87C DllUnregisterServer
          5      0001C910 [NONAME]
          6      0001C8E8 [NONAME]
        256      0005DEC0 [NONAME]
        257      000423C0 [NONAME]
        258      00042400 [NONAME]
        259      00042440 [NONAME]
        [...]

Выше 7-й функцией (например) является DllRegisterServer, которая соответствует 7-му слову (0x0004) в порядковой таблице экспорта в приведенной нижешестнадцатеричный дамп mfc42.dll.Начало: A7 05.

59 CC 12 00 6B CC 12 00 A7 05 D1 05 D4 05 2E 06
02 00 03 00 04 00 05 00 4D 46 43 34 32 2E 64 6C

Расчеты:

i = Search_ExportNamePointerTable("DllRegisterServer") = 7 - 1 = 6  // zero-based
offset = ExportOrdinalTable[6] = 4
SymbolRVA = ExportAddressTable[4] = ...
ordinal = OrdinalBase + offset = 5 + 4 = 9
1 голос
/ 20 июня 2012

NO, поле OrdinalBase таблицы каталога экспорта PE НЕ игнорируется!

Пример, приведенный выше (mfc42.dll), является хорошим (поскольку его порядковая база не равна 1).

Вот два замечания по этому вопросу:

. вывод инструмента «Дамп» является верным в том, что касается порядкового поля. Это показывает, что поле Base равно 5. Это означает, что при импорте экспортированной функции из mfc42.dll по имени вычисленное смещение в таблице адресов экспорта будет x-5. Спецификация Microsoft, раздел 5.3, верна.

. Выходные данные инструмента Dump НЕ верны в отношении подсказки. В таблицах экспорта нет поля подсказок, ТОЛЬКО в таблицах импорта есть поле подсказок.

Фактически, Порядковая База применяется НЕ в Порядковой Таблице, НО при получении индекса Таблицы адресов!

...