![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 01.03.2013
Сообщений: 39
|
![]()
Здравствуйте, прошу помощи в коде.
Если у кого есть время, приведите пожалуйста пример на основе имеющегося кода, по выводу экспортируемых и импортируемых функций, если не затруднит с комментариями. Читаю Румянцева П.В. "Работа с файлами в Win32" 2-е издание, в теории вроде понятно, а в реализации нет... Код:
Последний раз редактировалось Stilet; 12.04.2013 в 19:16. |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 24.12.2012
Сообщений: 639
|
![]()
Смотрели тут:
http://www.rsdn.ru/article/qna/baseserv/hookapi.xml http://kaimi.ru/2011/09/pe-format-import/ ?
ICQ: 677936656 Gmail: ekEmbed@gmail.com
|
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 01.03.2013
Сообщений: 39
|
![]()
Спасибо, пробую код,
объявляю переменные правильно ли?: DWORD pDATA_DIRECTORY, pExport, nameRVA, ordinalBASE, addressTableEntries, numberOfNamePointers, exportAddressTableRVA, namePointerRVA, ordinalTableRVA;// // p = *(DWORD*)(pBaseAddress + 0x3C /*e_lfanew */) + pBaseAddress; // получаем указатель на DATA_DIRECTORY pDATA_DIRECTORY = (DWORD*)(ImageNtHeaders + 0x78); // получаем указатель на экспорт pExport = ImageNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress; //xExport = pDATA_DIRECTORY[1]; // берем размер, но не проверяем // извлекаем сведения об основных структурах nameRVA = *(DWORD*) (pExport + 0xC) + pBaseAddress;//неясно что такое pBaseAddress (ImageBase?) ordinalBASE = *(DWORD*) (pExport + 0x10); addressTableEntries = *(DWORD*) (pExport + 0x14); numberOfNamePointers = *(DWORD*) (pExport + 0x18); exportAddressTableRVA = (DWORD*) (*(DWORD*) (pExport + 0x1C) + pBaseAddress); namePointerRVA = (DWORD*) (*(DWORD*) (pExport + 0x20) + pBaseAddress); ordinalTableRVA = (WORD* ) (*(DWORD*) (pExport + 0x24) + pBaseAddress); // распечатываем все имена/ординалы/адреса printf( "name ordinal/hint VirtualAddress Forward\n"\ "---------------------------------------------------------------\n"); for (a = 0; a < _MAX(addressTableEntries, numberOfNamePointers); a++) { // два вида обработки - по именам и по ординалам if (a < numberOfNamePointers) { // выделение индекса функций, экспортируемых по именам name = namePointerRVA[a] + pBaseAddress; f_index = ordinalTableRVA[a]; } else { // выделение индекса функций, экспортируемых только по ординалам name = "n/a"; f_index = a; } // определение адреса функции f_address = (DWORD)(exportAddressTableRVA[f_index] + pBaseAddress); // поиск "разрывов" в таблице адресов if (f_address == pBaseAddress) continue; // определение оридинала ordinal = f_index + ordinalBASE; // поиск форвардов (если есть) if ((f_address > (DWORD) pExport) && (f_address < (DWORD) (pExport + xExport))) pForward = (BYTE*)f_address; else pForward = 0; // вывод результатов на терминал printf("%-30s [%03d/%03d] %08Xh %s\n", name, ordinal, a, f_address, (pForward)?pForward:""); } printf("=========================== =================================== =\n"); Вот оригинал: // получаем указатель на PE p = *(DWORD*)(pBaseAddress + 0x3C /*e_lfanew */) + pBaseAddress; // получаем указатель на DATA_DIRECTORY pDATA_DIRECTORY = (DWORD*)(p + 0x78); // получаем указатель на экспорт pExport = pDATA_DIRECTORY[0] + pBaseAddress; xExport = pDATA_DIRECTORY[1]; // берем размер, но не проверяем // извлекаем сведения об основных структурах nameRVA = *(DWORD*) (pExport + 0xC) + pBaseAddress; ordinalBASE = *(DWORD*) (pExport + 0x10); addressTableEntries = *(DWORD*) (pExport + 0x14); numberOfNamePointers = *(DWORD*) (pExport + 0x18); exportAddressTableRVA = (DWORD*) (*(DWORD*) (pExport + 0x1C) + pBaseAddress); namePointerRVA = (DWORD*) (*(DWORD*) (pExport + 0x20) + pBaseAddress); ordinalTableRVA = (WORD* ) (*(DWORD*) (pExport + 0x24) + pBaseAddress); // распечатываем все имена/ординалы/адреса printf( "name ordinal/hint VirtualAddress Forward\n"\ "---------------------------------------------------------------\n"); for (a = 0; a < _MAX(addressTableEntries, numberOfNamePointers); a++) { // два вида обработки - по именам и по ординалам if (a < numberOfNamePointers) { // выделение индекса функций, экспортируемых по именам name = namePointerRVA[a] + pBaseAddress; f_index = ordinalTableRVA[a]; } else { // выделение индекса функций, экспортируемых только по ординалам name = "n/a"; f_index = a; } // определение адреса функции f_address = (DWORD)(exportAddressTableRVA[f_index] + pBaseAddress); // поиск "разрывов" в таблице адресов if (f_address == pBaseAddress) continue; // определение оридинала ordinal = f_index + ordinalBASE; // поиск форвардов (если есть) if ((f_address > (DWORD) pExport) && (f_address < (DWORD) (pExport + xExport))) pForward = (BYTE*)f_address; else pForward = 0; // вывод результатов на терминал printf("%-30s [%03d/%03d] %08Xh %s\n", name, ordinal, a, f_address, (pForward)?pForward:""); } printf("=========================== =================================== =\n"); Последний раз редактировалось Alexey_68; 13.04.2013 в 00:54. |
![]() |
![]() |
![]() |
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Разработка модуля импорта/экспорта файлов pic-формата (delphi 7) | Morkov | Помощь студентам | 0 | 10.12.2012 19:51 |
касательно экспорта из Excel в Powerpoint | Volodymyr | Microsoft Office Excel | 1 | 20.02.2012 14:14 |
Обновление таблицы Access путем импорта данных из DBF | TranzitZP | Microsoft Office Access | 9 | 11.04.2011 00:26 |
Как получить базу индексов таблицы экспорта DLL ? | Wardrag | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 3 | 21.08.2010 21:25 |
Создание билетов путем импорта из таблицы | mistx | Microsoft Office Excel | 2 | 25.02.2009 09:02 |