0

アプリケーションで次の 2 つのことを実行したい (Windows のみ):

  1. アプリケーションを開始する前に、ユーザーが (ツールを使用して) ネイティブ コードをアプリケーションに挿入できるようにします。
  2. ユーザーが挿入したこのコードを実行時にメモリから直接実行します。

理想的には、ユーザーがこのコードを簡単に指定できる必要があります。

これを行う方法として、現在検討している 2 つのアイデアがあります。

  1. ユーザーはネイティブ dll をアプリケーションのリソースに埋め込みます。アプリケーションは、この記事の手法を使用して、この dll をメモリから直接ロードします。

  2. ユーザーが指定した .dll メソッドのアセンブリ コードを何らかの方法でアプリケーション リソースにコピーし、この記事で説明されているように、このコードをヒープから実行します。

これを行うためのより良いオプションはありますか? そうでない場合、それらのソリューションで何が問題を引き起こす可能性があるかについて何か考えはありますか?

編集

LoadLibrary*私が回避しようとしているハードドライブにdllファイルが既に存在する必要があるため、特に呼び出しを使用したくありません。また、分解を難しくしようとしています。

編集

詳細: アプリケーション コードは私の管理下にあり、ネイティブです。アプリケーションがコンパイルされて展開された後に、独自のカスタマイズされた関数を埋め込む方法をユーザーに提供したいだけです。

ユーザーコードには、私が任意の制限を加えることができますが、それは問題ではありません。

4

3 に答える 3

1

あなたのオプション2は、私の見解ではかなり扱いにくいです。少量の自己完結型コードの場合、実行可能です。コードの量が非常に多い場合、オプション 1 である車輪を再発明することなしに、現実的に成功を期待することはできません。たとえば、実際のコードは Win32 関数にリンクし、それらをどのように解決しますか? PE インポート テーブルのようなものを発明する必要があります。では、DLL が既に存在するのに、なぜそうする必要があるのでしょうか。このコード用に独自の PE に似たファイル形式を発明した場合、どのようにしてそれを生成しますか? すべての標準ツールは、PE 形式の DLL を作成するために使用されます。

オプション 1 に関しては、メモリからの DLL のロードはサポートされていません。そのため、ファイルからロードする場合にローダーが行うすべての作業を行う必要があります。そのため、ディスクに存在しない DLL をロードする場合は、オプション 1 しか選択肢がありません。

ただし、能力の低いハッカーであれば、実行中のプロセスから DLL を簡単に取得できます。そのため、メモリから DLL を実行することで、何らかの方法でコードが検査から保護されるとは思わないでください。

于 2013-08-16T19:45:30.777 に答える
1

その目的は、サード パーティがコードをネイティブ アプリケーションに静的にリンクできるようにすることです。

これを行う明白な方法は、アプリケーションのオブジェクト ファイルとリンカーをサード パーティに提供することです。これをツールにまとめて、使いやすくすることができます。

相変わらず、悪魔は細部に宿る。オブジェクト ファイルに加えて、アプリケーションにはマニフェスト、リソースなどが含まれます。配布する資格のあるリンカーを見つける必要があります。上記のリンカーと互換性のあるコンパイラを使用する必要があります。等々。しかし、これは確かに実行可能であり、独自のソリューションを展開しようとするよりも信頼性が高い可能性があります.

于 2013-08-16T21:19:04.860 に答える
0

これは「アプリケーション仮想化」と呼ばれるものです。そのためのサードパーティ ツールがあります。Google で確認してください

単純なケースでは、「DLL」をメモリにロードし、再配置を適用し、インポートをセットアップし、エントリ ポイントを呼び出すだけです。

于 2013-08-17T18:38:22.843 に答える