Сейчас на форуме: _MBK_, asfa (+5 невидимых)

 eXeL@B —› Вопросы новичков —› ФОРМАТ ИСПОЛНЯЕМЫХ ФАЙЛОВ PortableExecutables (PE) -> DLL
Посл.ответ Сообщение

Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 20 марта 2009 18:26 · Поправил: at0s
· Личное сообщение · #1

прочитал статью
CRACKL@B Библиотека статей по исследованию защиты программ.htm
ФОРМАТ ИСПОЛНЯЕМЫХ ФАЙЛОВ PortableExecutables (PE),

и попытался покопать DLL файл. У меня возникла проблема с таблицей адресов экспорта

[5.2] Таблица адресов экспорта (Address Table)
Данная структура данных содержит адреса экспортируемых функций (их точки входа)
экспортируемых данных и т.п.
в формате DWord RVA (по 4 байта на элемент). Для доступа к данным используется
ординал функции с коррекцией на базу ординалов (Ordinal Base).

не могу разобраться откуда отсчитывать смещение Name Pointers RVA,
Address Table RVA и т.д.
от начала файла - фигня получается (что-то вроде C346A834H)

если можно поподробнее про эту часть

вот отрывки кода


#include <winnt.h>

_IMAGE_OPTIONAL_HEADER peh;
_IMAGE_SECTION_HEADER obj_entry[10];
_IMAGE_EXPORT_DIRECTORY expdir;
_IMAGE_FILE_HEADER fh;
DWORD SigBytes;
PImageExportDirectory *ExportDir;
char names[5][255];

in = fopen(infilename,"rb") ))

fread (&dh, 1, sizeof(dh), in ); // dos header
fseek(in, dh.PEOFFS, SEEK_SET);

fread (&SigBytes, sizeof(SigBytes), 1, in);// PE
fread (&fh, sizeof(fh), 1, in); // file header
fread (&peh, sizeof(peh), 1, in); // PE header

for(i = 0; i < fh.NumberOfSections; i++ ) // Sections
m = fread(&obj_entry[i], sizeof(obj_entry[i]), 1, in);

fseek(in, obj_entry[4].PointerToRawData , SEEK_SET); // 4 - sekciya exporta
fread(&expdir, sizeof(expdir), 1, in); // do six por vse tochno
//----------------- вот дальше - проблема ---------------------------------------------------
fseek(in, expdir.AddressOfFunctions , SEEK_SET); // ??????????
for(i = 0; i < expdir.NumberOfFunctions; i++ )
fread( &adrs[i], sizeof(adrs[i]), 1, in);



Ранг: 284.8 (наставник), 6thx
Активность: 0.150
Статус: Участник

Создано: 20 марта 2009 19:12
· Личное сообщение · #2

at0s
ну во-первых адресс таблицы экспорта правильнее получать из массива директорий в PE OptionalHeader

и второе. прочитай про экспорт тут - www.rsdn.ru/article/baseserv/pe_coff.xml



Ранг: 28.6 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 20 марта 2009 19:50
· Личное сообщение · #3

at0s
Скорее всего ты не учитываешь выравнивание заголовка PE файла, поэтому читаешь совсем не оттуда откуда нужно.




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

Создано: 20 марта 2009 20:04 · Поправил: BoRoV
· Личное сообщение · #4

inferno_mteam пишет:
Скорее всего ты не учитываешь выравнивание заголовка PE файла, поэтому читаешь совсем не оттуда откуда нужно.

да ни в этом дело, как уже было отмечено RSI пишет: адресс таблицы экспорта правильнее получать из массива директорий в PE OptionalHeader, а он хочет прочитать с 5 секции смещение начала экспорта, когда его нужно найти переводом этого адреса peh.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress в смещение

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




Ранг: 28.6 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 20 марта 2009 20:42
· Личное сообщение · #5

BoRoV пишет:
да ни в этом дело

В этом тоже, т.к. даже с валидной obj_entry[4].PointerToRawData он будет читать с диска по смещениям относительно ImageBase. Короче присоединяюсь к RSI и отправляю автора топика rftm



Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 20 марта 2009 20:45
· Личное сообщение · #6

спасибо НО,
я получаю таблицу экспорта, все данные совпадают с показанными PEiD
но как высчитать смещение функции в файле испольэуя эти данные ?
пробовал так как высчитывается точка входа в ЕХЕ - не то получается.
формулу ????




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

Создано: 20 марта 2009 23:00
· Личное сообщение · #7

Там массив обычных RVA, точка входа тоже в RVA. Читай ман на сайте мелкомягких по ПЕ-формату, грузи в отладчик свою прогу, файл в редактор какой-нить, типа CFF Explorer, и трассируй пошагово, ищи, где не совпадают результаты твоей проги и пе-редактора.



Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 марта 2009 03:59 · Поправил: at0s
· Личное сообщение · #8

peh.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress возвращает то же значение что и мой код, указатель на таблицу экспорта, 0х59000, ничего не изменилось. может я чего-то не понимаю (не так выражаюсь)?????
Например: физическое смещение точки входа в ЕХЕ высчитывается так -

fis_entry[0] = peh.EntrypointRVA + obj_entry[0].fis_offset - obj_entry[0].section_rva;

кто на практике знает, кто может, напишите также просто ( формулу ),
как добраться до N-ой функции (на диске) в DLL файле
спасибо за терпение



Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 марта 2009 23:34 · Поправил: at0s
· Личное сообщение · #9

Модераторам. Может Вы поспешили с переносом этого вопроса в форум для новичков ?

Вопрос или очень легкий, по этому никто не отвечает, или не для новичков.

Поймите правильно, я программирую больше чем возраст некоторых участников ( 1 - ая машина БЭСМ, СМ-4, СМ-1420... ), последнюю системную прогу писал под ДОС, потом под совершенно другие платформы .
Windows только осваиваю . К чему я это, не пишите как ребенку , я пойму и более сложный язык




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

Создано: 22 марта 2009 08:58 · Поправил: Archer
· Личное сообщение · #10

Дело не в том, что сложно. А лень всем втыкать в твой кодес.
А тебе лень повтыкать ман по ПЕ-формату и посравнивать работу своей софтины с работой какого-нить PETools или CFF Explorer.
Адрес Н-й секции в физическом файле лежит прямо в таблице секций и называется Raw Offset.


 eXeL@B —› Вопросы новичков —› ФОРМАТ ИСПОЛНЯЕМЫХ ФАЙЛОВ PortableExecutables (PE) -> DLL
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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