Сейчас на форуме: Magister Yoda, johnniewalker, Kybyx, vsv1, r0lka, -Sanchez-, testrev1337 (+3 невидимых)

 eXeL@B —› Крэки, обсуждения —› Парсинг экспорта
Посл.ответ Сообщение

Ранг: 60.6 (постоянный), 20thx
Активность: 0.070
Статус: Участник

Создано: 17 марта 2011 14:32 · Поправил: s0l
· Личное сообщение · #1

Хочу спарсить экспорт библиотеки kernel32.dll
Возникла следующая проблема:
У меня есть ImageBase, AddressTableRVA, NamePointersRVA, но имена в NamePointers располагаются в алфавитном порядке, а адреса - нет.
Для примера: получаю первое имя и первый адрес
Code:
  1. имя - AcquireSRWLockExclusive (000BEDC7)
  2. адрес - 00053С33 (BaseThreadIntThunk)

т.е. как видите, адрес совсем от другой функции.
Прошу чисто теоретически подсказать правильный алгоритм парсинга, в голову ничего не приходит =(




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 17 марта 2011 14:47 · Поправил: BoRoV
· Личное сообщение · #2

s0l пишет:
Хочу спарсить экспорт библиотеки kernel32.dll

Это наверно не на ХР хочешь, т.к. там я такой ф-ии не нашел.

s0l пишет:
Прошу чисто теоретически подсказать правильный алгоритм парсинга, в голову ничего не приходит

Покажи свой, попробуем найти ошибки в нем, если они есть.

-----
Лучше быть одиноким, но свободным © $me




Ранг: 60.6 (постоянный), 20thx
Активность: 0.070
Статус: Участник

Создано: 17 марта 2011 14:50
· Личное сообщение · #3

BoRoV пишет:
Это наверно не на ХР хочешь, т.к. там я такой ф-ии не нашел.

На 7ке, но это не важно

BoRoV пишет:
Покажи свой, попробуем найти ошибки в нем, если они есть.

В коде ошибок нет, все работает верно. Просто алгоритм парсинга никак не придумаю




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 17 марта 2011 14:55
· Личное сообщение · #4

Алгоритм парсинга описан в мануале:

Thus, when the export name pointer table is searched and a matching string is found at position i, the algorithm for finding the symbol’s address is:
i = Search_ExportNamePointerTable (ExportName);
ordinal = ExportOrdinalTable [i];
SymbolRVA = ExportAddressTable [ordinal - OrdinalBase];




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 17 марта 2011 14:58
· Личное сообщение · #5

А что там думать, проще некуда. Это с одного моего старого проекта.
Code:
  1. type
  2.   PDWORDArray = ^TDWORDArray;
  3.   TDWORDArray = array[Word] of DWORD;
  4.   PWordArray = ^TWordArray;
  5.   TWordArray = array[Word] of Word;
  6. var
  7.   ExportDirectory: PImageExportDirectory;
  8.   Functions: PDWORDArray;
  9.   Ordinals: PWordArray;
  10.   Names: PDWORDArray;
  11. ...
  12. ExportDirectory := PImageExportDirectory(RvaToVa(ImageNtHeaders^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress));
  13. Functions := Pointer(RvaToVa(Cardinal(ExportDirectory^.AddressOfFunctions)));
  14. Ordinals := Pointer(RvatoVA(Cardinal(ExportDirectory^.AddressOfNameOrdinals)));
  15. Names := Pointer(RvatoVA(Cardinal(ExportDirectory^.AddressOfNames)));
  16. ...


-----
Лучше быть одиноким, но свободным © $me




Ранг: 60.6 (постоянный), 20thx
Активность: 0.070
Статус: Участник

Создано: 17 марта 2011 15:35
· Личное сообщение · #6

Всем спасибо, вопрос пока исчерпан.
Арчи, я читал о структуре таблицы єкспорта не в оригинале, а в русскоязычной статье. Именно в єтом крылась моя ошибка (-:
Еще раз большое спасибо


 eXeL@B —› Крэки, обсуждения —› Парсинг экспорта
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати