2

我一直在查看 AutoHotkey_L 源代码(它是 C++),目的是修改它以控制出于安全目的我们正在开发的应用程序可以进行哪些 DLL 调用。源代码中有一个预处理器指令,可以非常简单地消除 DLL 功能,但是我们仍然需要为应用程序进行一些 DLL 调用,我们只希望对这些进行严格控制,而不是允许 DLL 调用整个 WinAPI .

我假设存在用于消除 DLL 调用功能的预处理器指令,因为其他开发人员也有类似的愿望来限制从 AutoHotkey 进行 DLL 调用的能力。我的问题是是否有类似的方法来控制 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
4

1 回答 1

1

添加了预处理器指令以在编写与 x64 兼容的 DllCall 代码之前为 x64 构建 AutoHotkey。这对于限制可以调用哪些外部函数没有帮助。

要限制可以调用哪些函数或 dll,您可以修改在 script2.cpp 中定义的 GetDllProcAddress()。例如,如果您要启用的所有功能都在您构建的 dll 中,您可以将其预加载到sStdModule数组中并禁用用于显式指定 dll 文件的代码。您可能还需要修改顶部附近的 switch 语句BIF_DllCall以禁止按地址调用函数。

请注意,即使您限制了可以调用的函数,用户仍然可能通过指定不正确的参数类型来利用 DllCall。一种更安全的方法是编写自己的“内置”函数,即使它们只是特定外部函数的简单包装。

于 2013-03-02T06:48:32.750 回答