Заголовочный файл Windows API, определяющий функции для динамических вызовов.

Доступен ли заголовочный файл C, определяющий вызовы функций, которые можно использовать вместо ручного написания typedef для каждого вызова, который я хочу сделать?

typedef int (WINAPI *pMessageBoxW)(HWND, LPCWSTR, LPCWSTR, UINT)

Вышеизложенное — это то, что я постоянно пишу.

Я смутно припоминаю, что в исходный код трояна Zeus было включено что-то, определяющее чрезвычайно большое количество функций Windows, однако я пытаюсь создать законную программу для Windows. Кое-что о включении троянского кода, пусть даже безвредного, кажется немного неприятным, даже если мы отложим в сторону вопросы лицензии (хотя маловероятно, что кто-то собирается подать на меня в суд).

Я просматривал код carberp и zeus на github и наткнулся

#define pSetFilePointer             pushargEx< DLL_KERNEL32, 0xEF48E03A, 27 >

В файле с именем GetApi.h в carberp это довольно хитро и не то, что меня интересует. Это вызывается в другом месте кода, но аргументы никогда строго не определяются. Я предполагаю, что авторы написали директиву компилятора, чтобы сказать что-то вроде «просто доверьтесь нам», поскольку pushargEx, как следует из его названия, использует перегрузку, чтобы взять любое количество указанных аргументов и отправить их в дескриптор DLL с определенным смещением.

Если это то, что мне нужно сделать, чтобы упростить мой код, то это не самое худшее, что может быть, но, конечно же, я не первый, кто ищет заголовочный файл, определяющий

typedef int (WINAPI *pMessageBoxW)(HWND, LPCWSTR, LPCWSTR, UINT)
typedef int (WINAPI *pMessageBoxA)(HWND, LPCSTR, LPCSTR, UINT)
typedef int (WINAPI *pSetFilePointer)(HANDLE, LONG, PLONG, DWORD)
...
...

Есть ли компилятор «просто доверься мне» или директива макроса, которую я могу/должен использовать для этого? Все, что я действительно хочу сделать, это динамически включать многочисленные вызовы функций WINAPI, изучая что-то новое и одновременно поддерживая достаточно чистый код.

Есть ли конкретная формулировка, которую я должен использовать, говоря об этом? Мне кажется, что именно слова, которые я использую, а не то, чего я пытаюсь достичь, ограничивают мою способность найти больше информации по этой теме.


person Nahum G    schedule 23.04.2015    source источник


Ответы (1)


Доступен ли заголовочный файл C, определяющий вызовы функций, которые можно использовать вместо ручного написания typedef для каждого вызова, который я хочу сделать?

No.

Мне немного любопытно, почему вы считаете необходимым использовать связывание во время выполнения для таких функций, как MessageBox и SetFilePointer. Интересно, возможно, вы ошибочно решили, что это хорошая политика - ссылаться на них во время выполнения, а не во время загрузки.

person David Heffernan    schedule 23.04.2015
comment
MessageBox был просто примером, но разрешение во время выполнения позволяет уменьшить размер файла. Я пытаюсь погрузиться в перехват функций (что не обязательно требует такой вещи), шеллкод, но сейчас я имею дело с позиционно-независимым кодом и исполняемыми файлами, которые, как я понимаю, не поддерживают связывание в этом поместье. Я знаю, что это также средство для выполнения некоторой анти-отладки/анализа, но приведенный выше код carberp был бы более практичным для такой вещи. - person Nahum G; 23.04.2015
comment
Я сомневаюсь, что связывание во время выполнения приводит к меньшему размеру файла. Я ожидал обратного. В любом случае, ничто из этого не меняет ответа на заданный вами вопрос. - person David Heffernan; 23.04.2015
comment
Связывание во время выполнения может уменьшить размер файла, если импорт разрешается по порядковому номеру, а не по имени. Обычно это не применимо, но есть возможность сжимать исполняемые файлы в определенных сценариях. @Nahum: исполняемые файлы уже не зависят от позиции. В противном случае ASLR не будет работать. Модули хранят точки входа в функцию как относительные виртуальные адреса, которые просто добавляются загрузчиком в качестве смещения к дескриптору модуля при разрешении импорта. - person IInspectable; 23.04.2015