Как динамически загрузить каждую нужную функцию - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь найти способ динамически загружать все функции Windows API, которые мне нужны. Например, чтобы использовать функцию printf, я делаю что-то вроде:

#include <windows.h>

typedef int (*printfPtr)(const char *str, ...);
int main(){
    HMODULE handle = LoadLibraryA("crtdll.dll");
    if(handle == NULL) return;
    printfPtr printfAdr = (printfPtr)GetProcAddress(handle, "printf");
    (*printfAdr)("This is a test\n");
}

Это быстродействующий фрагмент кода. Сделать это было легко, потому что я следовал руководству, в котором говорилось, что я могу загрузить printf из crtdll.dll. Тем не менее, теперь я хотел бы загрузить функцию CreateFileA, но я не знаю, как найти правильную DLL для загрузки.

Я уже пытался что-то гуглить и искал в MSDN, но ничего не нашел. В общем случае, учитывая одну функцию (обычную, например, одну в windows.h, stdio.h или stdlib.h), как я могу найти, какую DLL загрузить?

N.B. Я знаю, что некоторые из вас могут подумать, что загрузка работает таким образом, что бесполезно. Однако это не настоящая программа. В реальном, адреса LoadLibraryA и GetProcAddress находятся вручную, и я могу написать код, а затем экспортировать сегмент из PE.

1 Ответ

0 голосов
/ 12 сентября 2018

Функция в вашем примере (printf) не является функцией Windows API, скорее это функция, определенная в стандарте C. Поэтому он должен быть более доступным. Тем не менее, это подтверждает тот факт, что если у вас нет ни стандартных функций, ни функций Windows API, это позволяет узнать о многих библиотеках. Я не знаю ни одного места, которое бы определяло их все в одном исходном файле, но вы можете загружать свои функции в каждом отдельном случае, используя ресурс типа www.pinvoke.net , который позволяет вам вводить имя функции и получить имя загружаемой библиотеки DLL (а также сигнатуру метода C #, но вам это не нужно, вы уже знаете сигнатуру C).

...