3агрузчик DLL

Тема в разделе "WASM.WIN32", создана пользователем sideX, 24 июн 2010.

  1. sideX

    sideX New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2009
    Сообщения:
    57
    Приветствую вас, уважаемые.
    Решил написать собственное подобие загрузчика DLL. Знаю что информации много, все разжовано милион раз, но все же.. В результате при загрузке вываливается с ошибкой. Всю ночь писал, уж не знаю что еще предпринять. В аттаче исходники и бинарники (лоадер + длл).
    Сделайте милость, кого не затруднит - помогите определить проблему.
    Благодарю за внимание.
     
  2. kweed

    kweed New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    81
    может стоит на си написать? ошибок поменьше (вообще я имею ввиду), да и читать легче...
     
  3. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Вот минимум действий, необходимых для загрузки DLL:

    1. Выделение памяти.
    2. копирование заголовков и секций.
    3. Настройка таблицы импорта.
    4. Настройка таблицы релоков.
    5. Определение точки входа и запуск DllMain.

    Проверяйте пошагово, чтобы каждый этап завершался успехом. Создайте простую тестовую DLL с MessageBox'ом, без релоков и гоняйте на ней тесты. Затем добавьте создание потока + глобальные переменные, это создаст необходимость настройки релоков. От простого к сложному, короче.

    Да, все рассчитываемые адреса рассчитываются относительно адреса загрузки DLL (RVA -> VA). Я использую такой макрос:

    Код (Text):
    1. #define VA(type, base, x) ((type)((ULONG)(base) + (ULONG)(x)))
    Например так:
    Код (Text):
    1.     pDllMain = VA(DLLMAIN, pImageBase, \
    2.         VA(PIMAGE_NT_HEADERS32, pImageBase, \
    3.             VA(PIMAGE_DOS_HEADER, pImageBase, 0)->e_lfanew)->OptionalHeader.AddressOfEntryPoint);
     
  4. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Вот Clerk как то выкладывал лоадер.
    Где он сам, кстати, давно что-то его не видно?
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    sideX
    Учитесь пользоваться отладчиком.
     
  6. Extranger

    Extranger New Member

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    34
    sideX
    Проблема в коде функции настройки релоков. Начиная вот с этого места
    Код (Text):
    1. xor ecx, ecx
    2.            
    3. .WHILE  (ecx < ebx)
    4.                
    5.     mov eax, edi
    6.     add eax, ecx
    она явно не то что-то делает.
     
  7. sideX

    sideX New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2009
    Сообщения:
    57
    Extranger
    ок. к примеру - скомпилим длл без релоков, в лоадере закоментируем настройку релоков - в результате та же проблема
     
  8. Phyber

    Phyber New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    96
    sideX
    Слушайте что говорит Great и не компостируете мозг людям, глупыми темами.
     
  9. sideX

    sideX New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2009
    Сообщения:
    57
    Все получилось. в итоге криво находил базовый адрес загрузки и весь импорт указывал "в космос". осталось разобраться с релоками и будет гут. если кому интересно - могу выложить код. не жалко.
    Всем откликнувшимся выражаю огромную благодарность
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
  11. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Clerk
    почему не жизнеспособны?
     
  12. Phyber

    Phyber New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    96
    K10
    потому что это Clerk
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Phyber
    Потомочто мильён проблем возникает, абсолютно никакой совместимости нет с системой. Да и способы кривые, зачем чтото мапить, если это делает системный загрузчик, достаточно направить ход исполнения в необходимое русло так скажем. Если я гружу модуль из памяти этим способом, то мне ничего знать про релоки не нужно и пр. Более того оптимизированный код может уложится в пару сотен байт. Этого вы никогда не достигните. Пусть даже внутриннее переменные править будите - дизасма длин столь малого размера не существует.