データをコードとして実行しますか?

assembly c++ loader
データをコードとして実行しますか?

クライアントは、ライセンスシステムの簡単なクラッキングを防ぐために、カスタムの暗号化された実行可能ファイルを作成するように頼みました。 今、私はこれが誤った安心感であると理解していますが、それにもかかわらず彼はそれを主張しました。

そこで、ポータブル実行可能ファイルの知識を掘り下げて、このアイデアを思いつきました。

  • 実行可能ファイルを暗号化する

  • これをローダーの実行可能ファイルの最後にそのサイズとともに貼り付けます

  • ローダーはデータを解読します

  • VirtualAllocで割り当てられたページにコードをコピーします
    実行許可

  • アプリケーションのエントリポイントを見つけます

  • そこにジャンプし、私たちはすべて設定されています。

そこにジャンプする部分に問題があります。 どうやってやるの? 関数ポインターを設定すると、署名はどうなりますか? ロードされた実行可能ファイルのmain()関数の署名? または、アセンブリに頼る必要がありますか?

コードを読み込んだ後に絶対アドレスを修正する必要があるかもしれないことを理解しています。 必要があるかどうかを確認するにはどうすればよいですか、実際にこれを実行するにはどうすればよいですか?

編集:ウィンドウで作業し、GCCでコンパイルします。 必要に応じて、Microsoftコンパイラを切り替えることができます。

編集2:明確にするために:私はそれがほとんど無意味であることを知っています。 これは*あらゆる*種類のDRMの略です。 決定するのは私のクライアント次第であり、彼が私にこれについて警告しているにもかかわらず、彼はそれを望んでいます。

前もって感謝します。

  5  3


ベストアンサー

残念なことに、コードのエントリポイントにジャンプすることは、最も心配することではありません。 Portable Executable(PE)ファイル(WindowsでEXEおよびDLLファイルに使用されるファイル形式)は、単一のメモリブロックにロードできるものではなく、その後、実行します。 カスタムPEローダーは、次のジョブを処理する必要があります。

  • PEファイル内のさまざまなコードとデータセクションを別々にロードします
    メモリブロック。

  • インポートテーブルの依存関係を解決して、EXEのDLLをロードします
    に依存します。

  • 再配置を実行します。

すべての詳細を正しく取得することは、おそらくかなり複雑な仕事です。 この種のEXE暗号化を行う、購入できるツールを探すことをお勧めします。

編集:簡単なGoogleから、次の項目を確認することをお勧めします。

  • EXECryptor(独自仕様)

  • RLPack(独自仕様)

  • UPX(GPL)これは圧縮のみを行います
    私が理解している限りですが、ソースを使用して暗号化を追加できます(GPLがニーズと互換性がある場合)。

これらのようなツールがさらに増えることは間違いありません。これは単なるクイック検索の結果です。

もう一つの編集:

MSDNマガジンには、Matt Pietrekによる「Win32 Portable Executable File Formatの詳細」という記事が掲載されています(http://msdn.microsoft.com/en-us/magazine/bb985992.aspx[Part 1]、http: //msdn.microsoft.com/en-us/magazine/cc301808.aspx [パート2])。 PEファイル形式に関する多くの情報が含まれています。 興味深い情報が1つあります。Microsoftリンカーの最近のバージョンでは、デフォルトでEXEのベースの再配置が省略されているようです。 ラッパーEXEがペイロードEXEの優先ロードアドレスで既にロードされている可能性が高いため、これらを戻すようにリンカーに指示する必要があります。 または、ラッパーEXEにエキゾチックな優先ロードアドレスを指定して、ペイロードEXEに干渉しないようにすることもできます。

また、http://www.cultdeadcow.com/tools/pewrap.html [基本的なPEファイルコンプレッサーについて説明しているページ]も見つけました。 ただし、完全に一般的ではないようで、使用する前に追加の作業が必要になる可能性があります。

11


PEイメージを正しくロードする手間と煩わしさに加えて、http://support.microsoft.com/kb/875352 [データ実行保護]についても心配する必要があります。 。

これは、一部のアンチウイルスおよびマルウェア対策ツールにとってマルウェアの動作のように見えることも忘れないでください。

4


他の人が述べたように、EXE全体をデータセクションにロードし、実行時にリンクするだけでは難しいタスクです。ただし、別のオプションがあります。

入力EXEを取得します。コードと初期化されたデータ(定数を含む)セクションを見つけます。 これらのセクションの名前を変更し、それらをすべて読み書き可能な初期化データセクションに変換します。コンテンツを暗号化します。 次に、復号化スタブを含む新しいコードセグメントを追加し、そこでエントリポイントを変更します。 このスタブは、インプレースでセグメントを復号化し、タイプに適したものに保護を変更して、元のエントリポイントにジャンプする必要があります。

これにより、インポートテーブルが暗号化されないため、フルPEローダーのすべての機能を実装する必要がなくなり、通常のWindowsローダーがそれらを処理します。

もちろん、この種の素朴なアプローチは、協調攻撃にいつまでも耐えられないことに注意する必要があります。攻撃者は、単にプロセスのメモリをダンプして、元の復号化されたコードを取得できます。 これを回避するには、コードを継続的に暗号化および復号化する必要があります。この時点で、PEの処理は心配する必要がありません。

4


私の視点でのあなたの型付けされた解決策は少しバグがあります、あなたの機能はこれを他の機能にジャンプしますか? それらは他のアドレスに固定されており、暗号化されたコードの静的リンクライブラリがどこにあるかなど、このソリューションには多くの問題があります。

次のようなことができると思います:

  1. 暗号化されたdllファイルをシークレットアセンブリと共に転送する

  2. tmpディレクトリで彼女を暗号化します

  3. これでLoadLibraryを実行します

  4. DLLファイルのロックを解除し、システムから削除しますか?

1


_
ローダーはデータを解読します
_

これは本当にすべてを言っています。

ローダーがデータを復号化できるようにするには、復号化キーも含まれている(または少なくとも知っている)必要があります。

したがって、このローダーを物理的にユーザーに配布すると、ローダーコードと使用されたキーの両方に完全にアクセスできます。

たぶん、これは「誤った安心感」という意味ですか?

あなたのクライアントは頑固であるか無知であるように見えるので、彼らの思考の欠陥を明確に示す簡単な小さな復号化デモを構築してみませんか?

1


また、実行可能ハード。

1


Cスタイルでアドレスを関数ポインターにキャストし、呼び出すことができるはずです。

typedef void (*MyPtr)();

MyPtr p = (MyPtr)1234;
p();

0


データをコードから分割するグローバル記述子テーブルgetのおかげで、ほとんどのオペレーティングシステムでコードのようなデータを実行することはできません。 データを実行しようとすると、プロセッサによって例外が発生します。

-3


タイトルとURLをコピーしました