3

私はメインプログラムをC#で作成しましたが、小さなツールプログラムもC#で作成しました。

ツールプログラムが特定の条件下で実行できるようにしたいと思います。

  • 私のメインプログラムから呼び出されたとき。
  • ファイルのサフィックス(「* .abc」など)を開いてから呼び出された場合

しかし、ユーザーが私のプログラムディレクトリを開くと、ツールプログラムを実行できます。私は、ユーザーにそれを実行させたくありません。上記の条件でプログラムを実行できるようにしてほしい。そして、彼がプログラムを手動で実行した場合、プログラムは自動的にシャットダウンします。

それを行う方法はありますか?

4

3 に答える 3

2

プロセス/実行環境に公開されて、それがどのように呼び出されたかを示すものは何もないため、これを行うための絶対確実な方法はありません。

メインプログラムにコマンドラインのフラグを渡すことができます。これとサフィックスは確認できるものであり、どちらかが存在しない場合はすぐに終了します。

ただし、ユーザーがフラグを推測した場合でも、アプリケーションを直接呼び出すことができます。

他のメカニズムでは、メッセージングメカニズムとして、2番目のプログラムを呼び出す直前にメインプログラムからファイルに値を書き込み、2番目のプログラムからそのファイルをチェック(および実行後に削除)することが含まれます。同様のことを行う他のメッセージングメカニズムがあります(たとえば、プライベートMSMQキュー)。

于 2012-10-26T10:42:07.653 に答える
2

メインプログラムがそれを呼び出したかどうかを確認するには、メインプログラムProcessIDをコマンドライン引数として渡し、小さなプログラムでそれがProcessID存在するかどうか、およびそのプロセス名がメインプログラムの名前であるかどうかを確認します。これはなりすまし防止ではありませんが、静的な数値/文字列を渡すよりも、偽造するのが少し難しいかもしれません。

さらに、番号を暗号化して渡し、復号化して上記を確認することもできます。決心したハッカーが自分でプログラムを実行するのを防ぐことはほとんど不可能ですが、それを実行するのがいかに難しいかという基準を引き上げることはできます。また、コードを難読化することもできます。そうしないと、Reflectorをすばやく呼び出すと、渡されている文字が正確に表示されます。

または、可能であれば、小さなプログラムをDLLにして、そのようにメインプログラムから呼び出すこともできます。これには少しリファクタリングが必要ですが、プログラムを強制的に開くことになります。ファイルを開く*.abc場合、プログラムはコマンドライン引数をチェックして、ファイル名が渡されたかどうかを確認できます。その後、これをアプリで自動的に処理し、DLL呼び出しを行うことができます。

于 2012-10-26T10:49:35.460 に答える
1

推測しにくい名前の名前付きミューテックスを使用して、「小さなツール」プログラムがメインプログラムによって呼び出されたことを確認できます。したがって、親プログラムでMutexを作成します。

bool requestInitialOwnership = true;
bool mutexWasCreated;
Mutex m = new Mutex(requestInitialOwnership, 
                        "MyMutex", 
                        out mutexWasCreated);

次に、子プログラムでまったく同じコードを記述して、親プログラムがそれを実行したかどうかを確認します。の場合mutexWasCreated==true、親プログラムによって呼び出されませんでした。そうでなければ、そうでした。プログラムに渡された引数を確認すると、ファイル名の拡張子がであるかどうかを判断するのに役立ちます.abs

于 2012-10-26T11:22:43.253 に答える