5

私は、各プレイヤーが自分のボットをプログラムしなければならないゲームを構築しています。重要なアイデアは、プレーヤーがC(またはC ++、または互換性のある言語)でプログラムし、DLLを作成し、このDLLをサーバーに送信して、誰も自分のコードを取得できないようにすることです。問題は、彼が違法な関数を呼び出していないことを確認する方法です。ファイルを作成したり、ソケットを開いたりするようなものです。DLLがLoadLibraryとともにロードされ、関数が呼び出されます。すべての相互作用はコールバック関数で発生します。考えられる解決策は、空のkernel32.dll(およびその他)を配置して、すべてのwinapi呼び出しが失敗するようにすることです。これは安全で、すべてのケースで機能しますか?それを行うためのより良い方法はありますか?

プレーヤースレッド(dllと呼ばれるもの)は、おそらくオープンソケットを使用して、ゲームと通信できる必要があることに注意してください。Linuxでは、これはで簡単に実行できますseccomp

4

4 に答える 4

11

最善の策は、特権を減らしたユーザーを作成することです。これにより、ファイルアクセスを非常に簡単に制御し、そのユーザーとして実行されているサブプロセスでボットコードを実行できます。

ネットワーク接続も制限したい場合は、前述のプロセスが外部ホストに接続する権利を持たないようにファイアウォールを設定することも簡単です。

許可するAPI呼び出しをさらに制御する必要がある場合は、「DLLリダイレクトによるAPIインターセプト」と呼ばれる手法があります。これについては、たとえば次のように説明します。

http://109.163.225.194/download/files/other/DLL_Redirection_en.pdf

(グーグル経由で見つかりました)

于 2012-09-07T15:18:55.713 に答える
9

これは、すべてのDLLをロードする前に完全に分析するか(基本的に不可能です)、またはと同じレベルで何らかの魔法を作成しないと機能しませんseccomp。ダミーの作成など、アクセスを制限するための対策を講じるとkernel32.dll、ユーザーが送信したDLLは、考慮しなかったDLLの読み込み、ホストプロセスによって読み込まれたDLLの呼び出しなどの対策を講じることができます(おそらく、ホストアプリケーション!)、またはWindowsシステムコールを直接送信します。

1つのオプションは、GoogleChromeがWebレンダラープロセスを「サンドボックス化」するために使用するWindowsセキュリティトークン機能を利用することです。ただし、これは非常に難解なことであり、とにかく別のプロセスでDLLを実行する必要があります。それでも興味がある場合は、WindowsChromeサンドボックスの設計ドキュメントをお読みください。ただし、Googleはサンドボックスを「正しく」するために多くの開発時間を費やしてきましたが、それでもいくつかの注目すべき妥協点があります。独自のものはスリムであり、特にWindowsセキュリティに関する豊富な経験がありません。

于 2012-09-07T15:36:23.697 に答える
1

たぶん私の答えはあまり役に立たないでしょうが、DLLまたはマシンコードを含む他の実行可能ファイルを使用することは安全ではないと思います。たとえそれが制限付きユーザーとして実行されていても、仮想マシンでも攻撃ベクトルを開きます。最初に頭に浮かぶのは、既成のインタプリタを使用し、それを使用して独自のバイトコードをコンパイルすることです。ただし、DLLの使用を主張する場合は、DLLインポートアドレステーブルを編集して、不要な機能を捨てることができます。これは複雑に聞こえますが、このためのライブラリがあります

于 2017-07-26T16:17:35.917 に答える
0

ローカルファイアウォールはネットワークの側面を解決するかもしれませんが、あなたの質問の他の部分に対する簡単な防弾ソリューションは見当たりません。また、「空の」kernel32とntdllを配置すると、多くの正当なプロセスに深刻な問題が発生する可能性があると思います。

于 2015-11-01T18:04:07.710 に答える