exe & dll одновременно

Тема в разделе "WASM.ASSEMBLER", создана пользователем Android, 10 фев 2006.

  1. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Может ли PE одновременно экспортировать функции как dll и запускаться на выполнение как ехе?
     
  2. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    может.
     
  3. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    это можно сделать с помощью директив компиляции?

    если да, то приведите пример plz
     
  4. Guest

    Guest Guest

    Публикаций:
    0
    Android

    ntoskrnl.exe ?
     
  5. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    не может. Если в EXE стоит флаг DLL, то ОС не грузит файл! (точно версию не скажу но XP - SP2 точно) Иначе если флага не стоит, то EXE не может быть DLL как можно убидиться на простом примере:



    HMODULE x = LoadLibrary("c:\\comcat.dll");

    GetProcAddress(x,"DllGetClassObject");



    HMODULE x1 = LoadLibrary("c:\\comcat1.dll");

    GetProcAddress(x1,"DllGetClassObject");

    return 0;



    Один файл имеет флаг DLL, другой нет. Если флаг не имеет флаг DLL то GetProcAddress возвращает NULL.

    Не может в классическом смысле.
     
  6. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Bill_Prisoner

    Зачем вообще флаг DLL?

    В аттаче простой пример на Delphi (6).





    [​IMG] 1736200574__exedll.ZIP



    вот как вариант test.dpr с LoadLibrary:
    Код (Text):
    1.  
    2. program test;
    3. {$APPTYPE CONSOLE}
    4. uses Windows;
    5. type TExproc = function: string; stdcall;
    6. var exproc: TExproc;
    7.     hLib: THandle;
    8. begin
    9.  hLib := LoadLibrary ('exedll.exe');
    10.  if hLib = 0 then exit;
    11.  @exproc := GetProcAddress (hLib, 'Exproc');
    12.  if Assigned (@exproc) then
    13.     Writeln (Exproc);
    14.  readln;
    15. end.
    16.  
     
  7. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    2k екзешник с флагом dll не запускает по CreateProcess, но по LoadLibrary грузит любой exe (если база занята, то только с релоками) и GetProcAddress возвращает адреса экспортируемых ним ф-ций, т.е. можно их спокойно вызывать, НО почему-то для загруженых экзешников не настраивается импорт (т.е. если экспорт. ф-ция содержит вызов например user32.MessageBox, то прога на нем вылетит)
     
  8. psw1

    psw1 New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2006
    Сообщения:
    8
    Bill_Prisoner

    Как это не может? Из прикладных программ, например, Автодесковский acad.exe экспортирует функцию respSdj...



    Там все просто. Добавь что-то вроде

    extern "C" BOOL __cdecl acdbMatMult(void)

    { return TRUE; }

    #pragma comment(linker, "/EXPORT:acdbMatMult=_acdbMatMult")



    и будет счастье.
     
  9. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    alpet сам компиль свою дельфи! Ж) протестируй мой аттач, может это только у меня глюки

    [​IMG] _1826136329__exedll.zip
     
  10. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    Гм. Что-то я намудрил со своим примером. Ламер я :dntknw:

    bogrus

    У тебя же "dll" эмпортирует messageBox. Значит импорт настраивается?
     
  11. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    bogrus

    Ок. Да импортные функции (such as GetProcessId), из экспортируемой лажу возвращают, и в моем примере тоже. Под олей смортю - например вызов MessageBoxA уходит в kernel32->LoadLibraryA. Ерунда в общем-то.
     
  12. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    Говорю же нельзя в классическом смысле. Вот тут то и флаг нужен!
     
  13. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Флаг нужен, что бы загрузчик релоки обработал. Если его нет, ничего не мешает сделать это самому.
     
  14. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    Гм. А как насчет функий DLL которых нет в импорте EXE, но в импорте "DLL" эти DLL есть? :dntknw:

    Мне кажеться что всётаки флаг отвечает за эту логику. Доказательств нет. Может вы приведете доказательство обратного?
     
  15. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
  16. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    В случае динамического импорта как раз проблемы есть. Доказано! Опишу ситацию побробно:

    1. Есть EXE файл exe.exe который вызывает функцию message из dll.exe. Сам exe.exe импортирует только LoadLibrary и GetProcAddress. Т.е. функции которые присутствуют в kernel32.dll. Т.о. в АПП процесса присутствуют ntdll.dll,kernel32.dll и сам модуль exe.exe.

    2. Есть DLL dll.exe, но без флага DLL в FileHeader PE заголовка. Т.о. её может загружать загрузик как EXE файл. И выполняться будет функция DllMain но без параметров, какие обычно передаються DllMain. Так вот эта DLL экспортирует функцию message. Функция message не принимает параметров. Она просто вызывает MessageBox так: MessageBox(0,0,0,0). Функция MessageBox экспортируется в свою очередь из user32.dll. Т.о. user32.dll нет изначально в exe.exe.



    Результат: Если мы вызываем функцию message dll.exe статически, то все нормально. Если мы вызываем функцию message dll.exe динамически через связку LoadLibrary/GetProcAddress, то таблица импорта для dll.exe не заполняется и при вызове message вылетает exception. Т.о. функция LoadLibrary проверяет флаг DLL, а загрузчик нет.
     
  17. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Для exe (без флага DLL) его entry point, т.е. DllMain вызыватся не будет, но вообще S_T_A_S_ тоже прав, без этого флага у меня не обрабатывает ни релоки, ни импорт, только экспорт! Короче использование возможно, но ограничено (c LoadLibrary)
     
  18. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    bogrus

    То что DllMain вызываться не будет это и понятно. Но точка входа EXE это и есть указатель на DllMain.
     
  19. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    Ошибка в том что он сказал что с такими функциями будет всё впорядке.
     
  20. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Недавно писал файл exe, который сам себя загружает как драйвер. Там была загвостка, что файл не должен был импортировать никаких фунций из библиотек, чтобы вышеизложенная фишка сработала (более того этот файл на грузится под 2000, только XP и выше). А что касается Dll и exe, ответ однозначен - невозможно, предусмотрено в PE спецификации, следовательно если это возможно, то это баг операционной системы.

    Только вот есть загвостка - драйвер порта дисплея (это необычная dll) :) :)