none
実行ファイルの暗号化について RRS feed

  • 質問


  •  現在、シェアウェアのリバースエンジニアリング対策として、実行ファイルの暗号化を考えています。市販のツールはとても高価なので、自分で組み込もうとしておりますが、単に実行ファイルをダブクリしての起動時に復号化して実行することに関してはおおむね推測できているのですが、(以前自己解凍EXEを作成するソフトを作っていたので、おおむね同様の感じですよね。PEフォーマットをいじって復号化の後にプログラム部分をコールするという感じですよね?)最近ではコード読み込み時ではなく、メモリ上にも実行直前まで暗号化して保持しておき実行時に復号するタイプの暗号化ソフトウェアも登場していますよね。フックなどの知識はあるつもりですが、方法が全くわかりません。 どんな方法で実現しているのでしょうか?自分としては、あまりメモリ上に復元した状態でコードをおいておくのはしたくないと思っていますので、ヒントでも結構ですので、ご存じの方がいらっしゃいましたらお教えください。以上よろしくお願いいたします。 C++でwin32ネィティブで作成したいと思っています。

    2009年6月5日 16:18

すべての返信

  • あんまり変なことをやるとウィルスと誤検出されますよ。
    コンパイラやリンカは自作されるのでしょうか? Visual C++の出力したEXE / DLLに対して後からパッチする形の場合、復号後にmain()などを呼び出したら制御は戻らないわけで、メモリ上に復号された状態でコードを置くことになると思います。

    まぁ、暗号化するだけの価値のあるシェウェアなのでしたら素直に市販のツールを使用されることをおすすめします。
    もっとも、市販のツールも解析され復号ツールも存在するものもあるようですが。
    2009年6月5日 22:41
  • DEP(データ実行防止)とか、デバッグ防止とか、考え始めるとかなり手間が大きいように感じます。
    また、独自の暗号化の仕組みを作れたとしても、その部分をリバースエンジニアリングするか、そのメモリイメージを吸い出せば、元のネイティブコードを手に入れることはできます。

    程度の問題だとは思いますが、どこまで対策して、どこまで容認しようとお考えなのでしょうか?


    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年6月5日 23:48
    モデレータ
  • 「自分としては、あまりメモリ上に復元した状態でコードをおいておくのはしたくないと思っています」と書かれていますので、これが実現できた場合はメモリイメージの吸い出しにも対処されています。
    復号しながら動く、一種のインタプリタですよね。
    2009年6月6日 0:20
  • 「自分としては、あまりメモリ上に復元した状態でコードをおいておくのはしたくないと思っています」と書かれていますので、これが実現できた場合はメモリイメージの吸い出しにも対処されています。
    復号しながら動く、一種のインタプリタですよね。
    なじみがあるところでいえば、JITコンパイルの仕組みかな?
    「必要になったら復号する」ということと、「必要になったらコンパイルする」ということはかなり近いと思います。


    難易度が高いのは相変わらずですので、手段が目的になる、あえて目的にしてしまうぐらいでないと、実現は難しいかと。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年6月6日 5:47
    モデレータ
  • 残念。 Win32 ネイディブじゃなくて .NET Framework 用なら MS からプロテクション用のソリューションがあります。
    http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=2c523699-0cad-4093-8c61-7ca49b1711ba

    フォーラムはこちら
    http://social.msdn.microsoft.com/Forums/ja-JP/slpscodeprotector/threads?page=1

    デモのリンクが切れてしまっているのが残念ですが・・・

    SLPS に関しては約1年前にセミナーに参加したことがありまして、参考までに概要を伝えますと
    機能の1つの Protection では、コードを変更する事無く出来上がった Exe に対して、暗号化を施したいメソッドや関数を選び、暗号化できるというもので、暗号化したものは Secure VM で動作する仕組みです。
    (設定画面が上記 Whitepaper - SLP Services - Protect Your Code.pd にも出てきます)
    これにより、http://www.red-gate.com/products/reflector/ などを使っても、見事に暗号化されていて見えなくなっていました。

    Forum operator in Microsoft KK
    2009年6月17日 4:50