Существует ли стандартный протокол для изменения функциональности вызова DLL в AutoHotkey_L?

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

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

Если это поможет, вот краткий фрагмент того, как директива управляет вызовами DLL:

Вот определение препроцессора из файла заголовка конфигурации (строки config.h 9-14):

#ifdef _MSC_VER
#if defined(WIN32_PLATFORM) || defined(_WIN64)
#define ENABLE_DLLCALL
#define ENABLE_REGISTERCALLBACK
#endif
#endif

И вот пример точки входа, где директива ENABLE_DLLCALL контролирует, можно ли вообще получить доступ к функциональности DLL (строки script.cpp 7910-7916). Для справки, переменная bif здесь представляет собой BuiltInFunctionType, которому назначается вызываемая встроенная функция, а затем добавляется к объекту Func, который возвращается:

#ifdef ENABLE_DLLCALL
else if (!_tcsicmp(func_name, _T("DllCall")))
{
bif = BIF_DllCall;
max_params = 10000; // An arbitrarily high limit that will never realistically be reached.
}
#endif

2

Решение

Директивы препроцессора были добавлены, чтобы позволить AutoHotkey собираться для x64 до того, как был написан совместимый с x64 код DllCall. Это не будет полезно для ограничения того, какие внешние функции могут быть вызваны.

Чтобы ограничить, какие функции или библиотеки могут быть вызваны, вы можете изменить функцию GetDllProcAddress (), определенную в script2.cpp. Например, если все функции, которые вы хотите включить, находятся в dll, который вы создаете, вы можете предварительно загрузить его в sStdModule массив и отключить код для явного указания файла DLL. Вам также может понадобиться изменить оператор switch в верхней части BIF_DllCall запретить вызов функции по адресу.

Обратите внимание, что даже если вы ограничите, какие функции можно вызывать, пользователи могут использовать DllCall, указав неверные типы параметров. Более безопасный подход заключается в кодировании ваших собственных «встроенных» функций, даже если они представляют собой простые обертки вокруг определенных внешних функций.

1

Другие решения

Других решений пока нет …