Как можно вызвать функцию из dll?

Тема в разделе "WASM.WIN32", создана пользователем 3DManiac, 31 май 2006.

  1. 3DManiac

    3DManiac New Member

    Публикаций:
    0
    Регистрация:
    31 май 2006
    Сообщения:
    43
    Увожаемые программисты! Подскажите как можно вызвать функцию из dll? только без использованием GetProcAddress!

    Есть какой нибудь альтернативный вариант?
     
  2. DelExe

    DelExe New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2005
    Сообщения:
    165
    1) Например по шаблону найти байты соответствующие коду функции (как это делают некоторые пакеры и защиты).

    2) Хардкодить, если это твоя DLL. Вычислив дельту и отталкиваясь от Modulebase

    3) Перебрать таблицу экспорта интересующей dll (создать свой аналог GetProcAddress)

    4) Воспользоваться "int 2e"

    Всё. Лично у меня фантазия кончилась.
     
  3. 3DManiac

    3DManiac New Member

    Публикаций:
    0
    Регистрация:
    31 май 2006
    Сообщения:
    43
    Ну вот на 3 варианте остановимся? Давай пофантазируем как это примерно можно воплотить в жизнь?
     
  4. DelExe

    DelExe New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2005
    Сообщения:
    165
    Структура PE-header исполняемого файла тебе знакома? В сети куча инфы по этому, разные вьюверы. Разница будет лишь в том, что работа происходит с памятью.

    Для начала получаешь таблицу экспорта нужного модуля, дальше ищешь функцию по имены и получаешь её адрес. Только с заманглеными имена может возникнуть трудность - но это поправимо в виде ординала (это смотря какая функция тебе нужна).
     
  5. 3DManiac

    3DManiac New Member

    Публикаций:
    0
    Регистрация:
    31 май 2006
    Сообщения:
    43
    Нужны API функции! я бы конечно мог заранее узнать адреса этих функций и юзать их, но тогда возникает проблема с разными виндами... короче говоря у каждой винды свои адреса функций
     
  6. DelExe

    DelExe New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2005
    Сообщения:
    165


    Недопонял. Ты вообще хочешь отказаться от таблицы импорта своего модуля? Речь о вирусе или пакере/протекторе?
     
  7. 3DManiac

    3DManiac New Member

    Публикаций:
    0
    Регистрация:
    31 май 2006
    Сообщения:
    43
    реч идет вообще о граф программе...



    вот к примеру в дельфи можно так



    1 hlib := loadlibrarya(lib);

    addr := getprocaddress(hlib, 'createfile');

    где addr адрес нашей функции



    2 а можно и так

    createfile(filename: pchar; ....): dword; external 'kernel32.dll';

    есть что нибудь подобное на асме?



    то есть я хочу вообще отказаться от либов
     
  8. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    3DManiac



    А это одно и тоже. Зачем тогда от GetProcAddress отказываться?
     
  9. 3DManiac

    3DManiac New Member

    Публикаций:
    0
    Регистрация:
    31 май 2006
    Сообщения:
    43
    Если я буду пользоваться гетпрок тогда нужно будет подключать кернел либ и т. д.



    мне надо найти адреса функций и не подключать либы
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Quantum

    Это не совсем одно и тоже ;)

    В первом случае имеем динамическую линковку, а во втором - статическую.



    3DManiac

    Ты всех запутал, 4 одинаковых темы зачем-то создал и вопрос толком не можешь сфомулировать :dntknw:(

    В чем разница твоих методов 1) и 2) ?

    В том, что в 1) функции CreateFile нет в таблице импорта твоей проги и ты определяешь ее адрес динамически во время выполнения, а в 2) ты даешь указание компилятору включить CreateFile в таблицу импорта, которая будет автоматически заполнена при загрузке программы

    Не знаю как в масме без либов обойтись, а в фасме твой вариант 2) эквивалентен строчкам

    library kernel32,'kernel32.dll'

    import kernel32, CreateFile,'CreateFileA'



    Не понятно, чего ты так либ боишься. Вручную тебе придется каждую функцию так объявлять, а в либах и инках они уже все собраны вместе и компилятор выберет из них, те которые ты использовал в проге
     
  11. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    leo



    Всё равно кто-то вызовет GetProcAddress (сам код, RTL или загрузчик).



    3DManiac



    Без kernel32 в импорте (или другой либы, использующей kernel32) твоя прога вообще не запустится.
     
  12. 3DManiac

    3DManiac New Member

    Публикаций:
    0
    Регистрация:
    31 май 2006
    Сообщения:
    43
    Quantum конечно не запустится если я заранее адреса не узнаю из другой проги
     
  13. 3DManiac

    3DManiac New Member

    Публикаций:
    0
    Регистрация:
    31 май 2006
    Сообщения:
    43
    leo а вот и я не могу допереть как в масме
     
  14. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Quantum

    > "Всё равно кто-то вызовет GetProcAddress"

    Ну батенька, это уже философия ;) Также можно утверждать что неинициализированные статические переменные (секции .data? или .bss) и динамические это одно и тоже - все равно "кто-то вызовет" VirtualAlloc :))
     
  15. 3DManiac

    3DManiac New Member

    Публикаций:
    0
    Регистрация:
    31 май 2006
    Сообщения:
    43
    так всё таки как в масме то сделать
     
  16. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    3DManiac

    Существует такая хрень, короче, как таблица импорта, она указывает, какие функции из какой библиотеки загрузить до выполнения любого кода программы. Это и есть статическая связь наподобие дельфовской с "external". Пользуйся include-файлами из готовой папки в фасме (ещё можешь свои include писать).

    Разница между динамическим и статическим методом заключается в том, что динамический используется программой во время выполнения работы, она указывает сама, что подгрузить, при статическом эти данные записаны в exe, анализируя PE-файл система загружает необходимые библиотеки и возвращает адреса функций. Макросы "library" и "import" упрощают процесс создания таблицы импорта, я ими, например, не пользуюсь, а прописываю вручную.

    Этот вопрос надо поместить в FAQ. Я уж и не знаю, как тут ответить.
     
  17. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    3DManiac

    Ты не ответил на главный вопрос - почему ты в своем масме не желаешь использовать либы ?

    Я тонкостей масма не знаю, но думается что объявить импорт кроме как через includelib нельзя, если только ручками - как советует NullSessiOn в соседней ветке, ну или переходи на фасм ;))
     
  18. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    leo

    В масме нет возможности строить импорт вручную как в фасме. Правда, несколько либ импорта можно обьединить в одну с помощью link.exe (kernel32.lib + user32.lib = myimport32.lib).





    Я тоже давно жду ответа на этот вопрос.
     
  19. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Quantum

    > "В масме нет возможности строить импорт вручную как в фасме"

    В принципе то наверное можно, если повторить структуру .idata и затем ручками забить адреса и размеры IT и IAT в PE-заголовок, вот только ради чего такая морока :)) Или в масме такое в принципе невозможо ?
     
  20. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    leo



    Так не считается :)



    3DManiac

    Камикадзе что ли? Тебя же забанить могут за нарушение правил форума.