Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Загрузка DLL

Загрузка DLL

IBetsПользовательwww16 апр. 20181:36#0
Как динамически загрузить функцию не использую статических библиотек. Допустим какой ассемблерный код надо написать чтобы из kernel32.dll  получить функции. LoadLibrary и GetProcAddress
FireFenixПостоялецwww16 апр. 20181:57#1
точно так же как и из библиотеки
  • загрузить в память процесса
  • вызвать функцию в соответствии с соглашением
  • DelfigamerПостоялецwww16 апр. 20182:29#2
    Есть два способа подключить динамическую библиотеку - список импорта и вызовы операционной системы.
    В первом способе, ты передаёшь линкеру список файлов библиотек, которые ты хочешь подключить. Когда линкер видит ссылку на символ, который экспортируется одной из динамических библиотек, он линкует эту ссылку на специально сгенерированную  в объектном коде заглушку. Помимо этого, линкер составляет специальную таблицу, в которой перечислены все взятые из внешних библиотек символы с адресами соответствующих заглушек.
    Когда ОС инициализирует бинарник в памяти, она просматривает эту таблицу, загружает и инициализирует библиотеки, которых в памяти ещё нет, и правит содержимое заглушек так, чтобы они ссылались на фактическое место символа в своей библиотеке. Если какая-то библиотека отсутствует или не экспортирует нужного символа - инициализация бинарника проваливается и, как правило, ОС сообщает пользователь о том, чего этой программе недостаёт.
    LoadLibrary и GetProcAddress можно получить только таким способом.
    Как правило, компиляторы по умолчанию подключают базовые системные библиотеки, на винде это - kernel32.dll и user32.dll, поэтому в общем случае их символы будут доступны в твоём коде без каких-либо телодвижений. Напротив, чтобы линкер эти библиотеки не подключал, требуется передать ему специальный флаг.
    Второй способ - вызвать специальные функции ОС. Ими ты производишь процесс загрузки и импорта вручную в рантайме, с возможностью что-то сделать в случае неудачи. Об этих функциях подробно расписано в документации, в случае виндовых функций - LoadLibrary, GetProcAddress и пример их использования в Using Run-Time Dynamic Linking.
    Стандартные хедеры корректно указывают компилятору на сигнатуру функции, так что с вызовом напрямую из си проблем возникнуть не должно.
    Если же стоит задача вызвать их именно из ассемблера - это делается только так же, как и для любой другой stdcall-функции, можно поискать гайды в интернете, а можно написать вызов на си и посмотреть на результат компиляции.
    Обрати внимание на различие между соглашениями в x86 и в x64.

    Правка: 16 апр. 2018 2:31

    МизраэльПостоялецwww17 апр. 20189:33#3
    IBets
    > Как динамически загрузить функцию не использую статических библиотек. Допустим
    > какой ассемблерный код надо написать чтобы из kernel32.dll  получить функции.
    > LoadLibrary и GetProcAddress
    kernel32.dll уже в памяти твоего процесса, тебе нужно найти адреса функций LoadLibraryW  и GetProcAddress и уже вызывая их можешь грузить библиотеки.
    endeavour_prПостоялецwww17 апр. 201810:12#4
    Если я правильно понял что хочет ТС. Инжектишь свою либу в память процесса и там вызываешь все что угодно и как угодно.
    Можно еще какой то финт сделать чтобы из ехешника чужие процессы мучать, но я не помню как он устроен

    / Форум / Программирование игр / Общее

    2001—2018 © GameDev.ru — Разработка игр