1

彼ら。私は自分が所属するオンラインコミュニティのクライアントソフトウェアを開発しています。クライアントを作成できるようにするために、所有者とWebマスターは、コードを暗号化することを要求します(難読化されているだけではありません)。私のプロジェクトのほとんどはVB.NET(F3.5)で書かれており、パフォーマンス上の理由からC ++ / CLI経由でSQLiteとlibcryptを使用しているものもあります(したがって、/ clr:safeは使用できません)。言い換えると、/ clr:safeを使用する場合、C ++ / CLIコードを作成するのは無意味です(すべてのコードをVBで作成する方がはるかに簡単です)。

これがVBプロジェクトのみの場合は、C ++ローダーを記述し、コードをストレージからメモリに復号化してから、Assembly.Load()を使用して、パブリックメソッド(メインフォームなど)を介して実行します。ただし、説明できないポリシーによっては、未確認のC ++/CLIコードでそれを実行できません。通常のDLLロードメカニズムを使用して制限なしで「安全でない」DLLを使用できるため、私は途方に暮れていますが、何らかの理由でAssembly.Load()を使用してそれを行うことはできません。それがより安全であると思われる理由がわかりません(他のオプションが利用可能である場合)。Caspol.exeは役に立ちません。たとえ役に立ったとしても、コミュニティのすべての人に、自分のマシンのアクセスセキュリティをオフにするように依頼することはできませんでした。EXEまたはDLLをメモリから直接ロードすることは現実的ではないようです(UPXは通常のDLLでそれを行いますが、では行いません。

だから私は次のように尋ねます:

  • C ++ / CLI DLLのMISL部分を暗号化するために使用できる方法を思いつくことができますか?(コードは通常のx86マシンコードと混ざっていると思います)。

  • Assembly.Loadで実行しようとしたように、未検証の.NET DLLをバイトからロードする方法はありますか?

または、CreateProcess()とLoadLibrary()はパスのみを使用するため、一時的なEXEイメージを作成して、ストレージから実行することもできます。ただし、ユーザーがイメージにアクセスできないようにする必要があるため、ディスクにイメージを書き込むのはばかげています。プライベートRAMディスクなどの揮発性のものである必要があります。何か頭に浮かぶ?(Windows 2000以降)。

どうもありがとう、

ギレ

4

2 に答える 2

1

AssemblyResolveメソッドを使用して、ストリームからアセンブリをロードできます。詳細については、この回答を参照してください。

于 2009-12-24T18:42:06.040 に答える
0

Assembly.Load(byte[] ...) は、検証不可能な (混合モード) アセンブリを明示的に禁止します。問題はMicrosoft Connectで確認できます。

于 2010-03-01T10:19:22.733 に答える