2

AutoHotkey_L ソース コード (C++) を調べて、開発中のアプリケーションのセキュリティ目的でどの DLL 呼び出しを行うことができるかを制御するように変更するつもりです。ソース コードにはプリプロセッサ ディレクティブがあり、DLL 機能を非常に簡単に削除できますが、アプリケーションの目的でいくつかの DLL 呼び出しを行う必要があります。WinAPI 全体への DLL 呼び出しを許可するのではなく、それらを厳密に制御したいだけです。 .

他の開発者が AutoHotkey からの DLL 呼び出しを行う機能を制限したいという同様の欲求を持っていたため、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 コードが記述される前に、AutoHotkey を x64 用にビルドできるようにするために、プリプロセッサ ディレクティブが追加されました。どの外部関数を呼び出すことができるかを制限することは役に立ちません。

どの関数または dll を呼び出すことができるかを制限するには、script2.cpp で定義されている GetDllProcAddress() を変更します。たとえば、有効にするすべての関数がビルドする dll にある場合は、それをsStdModule配列にプリロードし、dll ファイルを明示的に指定するコードを無効にすることができます。BIF_DllCallアドレスによる関数の呼び出しを禁止するために、 の上部近くにある switch ステートメントを変更する必要がある場合もあります。

呼び出すことができる関数を制限したとしても、ユーザーが不適切なパラメーターの型を指定して DllCall を悪用する可能性があることに注意してください。より安全なアプローチは、特定の外部関数の単純なラッパーであっても、独自の「組み込み」関数をコーディングすることです。

于 2013-03-02T06:48:32.750 に答える