Приветствую вас, уважаемые. Решил написать собственное подобие загрузчика DLL. Знаю что информации много, все разжовано милион раз, но все же.. В результате при загрузке вываливается с ошибкой. Всю ночь писал, уж не знаю что еще предпринять. В аттаче исходники и бинарники (лоадер + длл). Сделайте милость, кого не затруднит - помогите определить проблему. Благодарю за внимание.
Вот минимум действий, необходимых для загрузки DLL: 1. Выделение памяти. 2. копирование заголовков и секций. 3. Настройка таблицы импорта. 4. Настройка таблицы релоков. 5. Определение точки входа и запуск DllMain. Проверяйте пошагово, чтобы каждый этап завершался успехом. Создайте простую тестовую DLL с MessageBox'ом, без релоков и гоняйте на ней тесты. Затем добавьте создание потока + глобальные переменные, это создаст необходимость настройки релоков. От простого к сложному, короче. Да, все рассчитываемые адреса рассчитываются относительно адреса загрузки DLL (RVA -> VA). Я использую такой макрос: Код (Text): #define VA(type, base, x) ((type)((ULONG)(base) + (ULONG)(x))) Например так: Код (Text): pDllMain = VA(DLLMAIN, pImageBase, \ VA(PIMAGE_NT_HEADERS32, pImageBase, \ VA(PIMAGE_DOS_HEADER, pImageBase, 0)->e_lfanew)->OptionalHeader.AddressOfEntryPoint);
sideX Проблема в коде функции настройки релоков. Начиная вот с этого места Код (Text): xor ecx, ecx .WHILE (ecx < ebx) mov eax, edi add eax, ecx она явно не то что-то делает.
Extranger ок. к примеру - скомпилим длл без релоков, в лоадере закоментируем настройку релоков - в результате та же проблема
Все получилось. в итоге криво находил базовый адрес загрузки и весь импорт указывал "в космос". осталось разобраться с релоками и будет гут. если кому интересно - могу выложить код. не жалко. Всем откликнувшимся выражаю огромную благодарность
Только трейс системного лодера актуален, остальный способы не жизнеспособны http://files.virustech.org/indy/Code/LDR/
Phyber Потомочто мильён проблем возникает, абсолютно никакой совместимости нет с системой. Да и способы кривые, зачем чтото мапить, если это делает системный загрузчик, достаточно направить ход исполнения в необходимое русло так скажем. Если я гружу модуль из памяти этим способом, то мне ничего знать про релоки не нужно и пр. Более того оптимизированный код может уложится в пару сотен байт. Этого вы никогда не достигните. Пусть даже внутриннее переменные править будите - дизасма длин столь малого размера не существует.