вызов функции kernel32.dll без включения windows.h - PullRequest
1 голос
/ 04 июня 2011

если kernel32.dll гарантированно загружена в виртуальную память процесса, почему я не могу вызвать такую ​​функцию, как Sleep, без включения windows.h? ниже приводится цитата из vividmachine.com

5. Итак, что насчет окон? Как мне найти адреса моих необходимых функций DLL? Разве эти адреса не меняются при каждом обновлении пакета обновления?

Существует множество способов найти адреса функций, которые вы должны использовать в своем шелл-коде. Есть два метода для адресации функций; Вы можете найти нужную функцию во время выполнения или использовать жестко закодированные адреса. Этот урок будет в основном обсуждать жестко закодированный метод. Единственная DLL, которая гарантированно будет отображена в адресном пространстве шелл-кода, - это kernel32.dll. Эта DLL будет содержать LoadLibrary и GetProcAddress, две функции, необходимые для получения любого адреса функции, который можно отобразить в пространство процесса эксплойтов. Однако в этом методе есть проблема, смещение адресов будет меняться с каждым новым выпуском Windows (пакеты обновлений, исправления и т. Д.). Таким образом, если вы используете этот метод, ваш шеллкод будет работать ТОЛЬКО для конкретной версии Windows. Дальнейшая динамическая адресация будет указана в конце статьи в разделе «Дальнейшее чтение».

Ответы [ 3 ]

5 голосов
/ 04 июня 2011

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

Заголовок windows.h предоставляет прототип функции , который вы хотите вызвать для компилятора C / C ++, чтобы код для вызова функции (передача аргументов через регистр или стек и получение может быть сгенерировано возвращаемое значение функции).

Зная прототип функции, прочитав windows.h, опытный программист на ассемблере также сможет написать код на ассемблере для вызова функции Sleep. Вместе с адресом функции это все, что вам нужно для вызова функции.

2 голосов
/ 04 июня 2011

Вам все равно нужно объявить функцию для ее вызова, и вам нужно будет связать ее с kernel32.lib.Заголовочный файл не является чем-то волшебным, это просто много объявлений функций.

1 голос
/ 04 июня 2011

С какой-то черной магией вы можете;).было много пользовательских реализаций GetProcAddress, которые позволили бы вам обойтись без необходимости windows.h, но это еще не все и конец всему и, возможно, может привести к проблемам из-за внутренних изменений окон.Другой метод - использовать toolhlp для перечисления модулей в процессе, чтобы получить базу kernel.dll, затем записать его PE для EAT и получить адрес GetProcAddress.оттуда вам просто нужны прототипы указателей на функции для правильного вызова адресов (и любых структурных определений, которые необходимы), что не слишком сложно, трудоемко (если у вас много функций), поэтому в Windows XP необходимо отключить DEP из-заразличие между пакетами обновления, ofc вам нужно windows.h в качестве справки, чтобы получить это, вам просто не нужно включать его.

...