Смекни!
smekni.com

Жесткое внедрение DLL в Windows-программы (стр. 3 из 3)

(DWORD)FreePtr +=sizeof(IMAGE_IMPORT_DESCRIPTOR)*DLLCounter;

memcpy(FreePtr, &myDLL, sizeof(IMAGE_IMPORT_DESCRIPTOR));

//3. Устанавливаем указатель на нашу таблицу импорта.

// Вычисляем RVA нашей таблицы

DWORD NewImportTableRVA = (DWORD)OldFreePtr - (DWORD)ImportSecBeg +

sect->VirtualAddress;

// Заносимегов DataDirectory

pe_opt_head->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress =

NewImportTableRVA;

pe_opt_head->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size =

(DLLCounter + 1) * sizeof(IMAGE_IMPORT_DESCRIPTOR);

UnmapViewOfFile(fBeg);

CloseHandle(fMap);

Вывод

Данная методика позволяет внедрять свою DLL библиотеку в программы, имеющие достаточно свободного места в секции с таблицей импорта. Приведенная программа может быть доработана в следующих направлениях:

Создание таблицы импорта в другой секции (если в секции с оригинальной таблицей не хватает места)

Создание новой секции и хранение новой таблицы импорта в ней.

Отдельное слово стоит сказать об .exe файлах, входящих в стандартную поставку Windows(таких как calc.exe, paint.exe, wordpad.exe, etc.). У них таблица импорта продублирована в начале файла, между MZ- и PE- заголовками, поэтому при модификации таких файлов необходимо в соответсвующих записях в DataDirectory обнулить адреса на эти таблицы (подробнее см. файл winnt.h, раздел Directory Entries).