Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2013, 00:03   #1
Alexey_68
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 39
По умолчанию Таблицы импорта и экспорта

Здравствуйте, прошу помощи в коде.
Если у кого есть время, приведите пожалуйста пример на основе имеющегося кода, по выводу экспортируемых и импортируемых функций, если не затруднит с комментариями.
Читаю Румянцева П.В. "Работа с файлами в Win32" 2-е издание, в теории вроде понятно, а в реализации нет...
Код:
#include <windows.h>
#include <stdio.h>
#include <winnt.h>

int main()
{
   HANDLE hFile;
   BYTE *BaseAddress;
   WORD x;
   DWORD FileSize, BR, PE, OEP;
   int i;

   IMAGE_DOS_HEADER *ImageDosHeader;
   IMAGE_NT_HEADERS32 *ImageNtHeaders;
   IMAGE_OPTIONAL_HEADER32 *ImageOptionalHeader;
   IMAGE_DATA_DIRECTORY *ImageDataDirectory;
   IMAGE_EXPORT_DIRECTORY *ImageExportDirectory;
   IMAGE_SECTION_HEADER *ImageSectionHeader;


   char FileName[MAX_PATH];
//char FileName []="test.exe";
   char SectionName[9] = { 0 };


   printf("%s\n","Enter filename...");
   scanf("%s", FileName);

   printf("%s\n","Open file...");

   hFile = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, 0,
	  OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

   if (hFile == INVALID_HANDLE_VALUE)
   {
	  printf("%s\n","Cannot open file...");
	  return 0;
   }

   FileSize = GetFileSize(hFile, NULL);
   BaseAddress = (BYTE *) malloc(FileSize);

   if (!ReadFile(hFile, BaseAddress, FileSize, &BR, NULL))
   {
	  printf("Cannot read file...\n");
	  free(BaseAddress);
	  CloseHandle(hFile);
	  return 0;
   }

   ImageDosHeader = (IMAGE_DOS_HEADER *) BaseAddress;



   if (ImageDosHeader->e_magic != IMAGE_DOS_SIGNATURE)
   {
	  printf("Invalid Dos Header\n");
	  free(BaseAddress);
	  CloseHandle(hFile);
	  return -1;
   }

   ImageNtHeaders = (IMAGE_NT_HEADERS *)
	  (ImageDosHeader->e_lfanew + (DWORD) ImageDosHeader);

printf("This PE Signature - %x\n ", ImageNtHeaders->Signature);

....................



   free(BaseAddress);
   CloseHandle(hFile);

   system("pause");

   return 0;
}
С Уважением Алексей.

Последний раз редактировалось Stilet; 12.04.2013 в 19:16.
Alexey_68 вне форума Ответить с цитированием
Старый 12.04.2013, 17:27   #2
Ezhik Kihze
Форумчанин
 
Регистрация: 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
Ezhik Kihze вне форума Ответить с цитированием
Старый 12.04.2013, 23:15   #3
Alexey_68
Пользователь
 
Регистрация: 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.
Alexey_68 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработка модуля импорта/экспорта файлов 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