![]() |
eXeL@B —› Вопросы новичков —› ФОРМАТ ИСПОЛНЯЕМЫХ ФАЙЛОВ PortableExecutables (PE) -> DLL |
Посл.ответ | Сообщение |
|
Создано: 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); ![]() |
|
Создано: 20 марта 2009 19:12 · Личное сообщение · #2 |
|
Создано: 20 марта 2009 19:50 · Личное сообщение · #3 |
|
Создано: 20 марта 2009 20:04 · Поправил: BoRoV · Личное сообщение · #4 inferno_mteam пишет: Скорее всего ты не учитываешь выравнивание заголовка PE файла, поэтому читаешь совсем не оттуда откуда нужно. да ни в этом дело, как уже было отмечено RSI пишет: адресс таблицы экспорта правильнее получать из массива директорий в PE OptionalHeader, а он хочет прочитать с 5 секции смещение начала экспорта, когда его нужно найти переводом этого адреса peh.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress в смещение ----- Лучше быть одиноким, но свободным © $me ![]() |
|
Создано: 20 марта 2009 20:42 · Личное сообщение · #5 |
|
Создано: 20 марта 2009 20:45 · Личное сообщение · #6 |
|
Создано: 20 марта 2009 23:00 · Личное сообщение · #7 |
|
Создано: 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 файле спасибо за терпение ![]() ![]() |
|
Создано: 21 марта 2009 23:34 · Поправил: at0s · Личное сообщение · #9 Модераторам. Может Вы поспешили с переносом этого вопроса в форум для новичков ? Вопрос или очень легкий, по этому никто не отвечает, или не для новичков. Поймите правильно, я программирую больше чем возраст некоторых участников ( 1 - ая машина БЭСМ, СМ-4, СМ-1420... ), последнюю системную прогу писал под ДОС, потом под совершенно другие платформы ![]() Windows только осваиваю ![]() ![]() ![]() ![]() ![]() ![]() |
|
Создано: 22 марта 2009 08:58 · Поправил: Archer · Личное сообщение · #10 |
![]() |
eXeL@B —› Вопросы новичков —› ФОРМАТ ИСПОЛНЯЕМЫХ ФАЙЛОВ PortableExecutables (PE) -> DLL |