このレビューは、最も強力で信頼性の高いWin32アプリケーションプロテクターの1つである
Themida (以前のX-Protector)に関するものです。 最近、アプリケーションの1つにThemidaが必要になったので、短いレビューを書くことにしました。 同時に、彼は著者に私に興味のあるいくつかの質問に答えるように頼みました。 答えもあなたにとって興味深いものになると思います。 記事の最後で、この短いインタビューの結果を探してください。
この記事がこのレビューの日付時点で最新のThemidaバージョン2.1.3.30に基づいて書かれているという事実に注目したいと思います。 マクロに関するいくつかの新機能があります。 2年前の公式サイトからのデモでは、彼らは奪われています。

基本情報
実際、Themidaテクノロジーに基づいた4つの製品があります。
Professionalの基本バージョンの違いは、.NETアプリケーションを操作する能力がないことだけです。 これから説明するすべてのことは、ThemidaとWinLicenseの両方で機能します。
- Themidaはプロテクター自体であり、これがこの記事の主要な主題です。
- WinLicenseはThemidaであり、さまざまな種類のシリアル番号に基づいてアプリケーションを保護する機能が追加されています。 WinLicense SDK自体は、これらのシリアル番号を生成し、チェックし、安全に保存し、ハードウェアにバインドし、指定された日付の有効期限または指定された起動回数でトライアルシリアル番号を作成し、パスワードで保護されたアプリケーションを作成します。
- X-BundlerはThemidaおよびWinLicenseのプラグインであり、外部ファイルを安全なアプリケーションに埋め込むことができます。 たとえば、ヘルプファイルまたは* .mp3ファイルを埋め込むことができます。 さらに、ディスク上にある外部ファイルとしてアプリケーションからこのファイルにアクセスできます。 アプリケーションは、ファイルがThemidaによって保護されており、* .exe内にあることすら知りません。 .NETアプリケーションで使用されるアセンブリをメイン* .exeファイル内に埋め込むこともできます。
- WinLicense DLL ControlはWinLicenseのプラグインであり、シリアル番号に基づいて保護オプションを実装できます。
- CodeVirtualizerは小さな独立したThemidaであり、アプリケーション内の指定された関数をThemida仮想マシンのコードに排他的に変換できます。 その他の保護は提供しません(デバッグ、暗号化、整合性チェックなどからの保護は含まれていません)。 ドライバーを含むx32およびx64アプリケーションの両方を保護できます。
Themida Auto-Protect機能
まず、「退屈な態度」について。
- アンチデバッガー。 標準デバッガーとカーネルレベルデバッガーの両方の検出がサポートされています。 アグレッシブ検索モードもありますが、この場合、アプリケーションは、アクティブな反ロシア語、ルートキット、またはWineを搭載したコンピューターでの実行を拒否する場合があります。
- アンチダンパー。 Themidaはアプリケーションを常に保護します。 その後の起動でアプリケーションのメモリをディスクにダンプしても、保護は解除されません(誰が疑うでしょう...このような基本的な方法は長い間機能していませんでした)
- エントリポイントの難読化(OEP)。 Themidaは、ライブラリまたはアプリケーションへのエントリポイントを非表示にします。
- リソースの暗号化。 アプリケーションにリソース(アイコン、ファイルなど)が含まれている場合、それらはアクセス時にのみ暗号化および復号化されます。
- VMWare / VirtualPCの互換性。 保護されたアプリケーションがハイパーバイザーの下で実行できるように、このモードをアクティブ化できます。
- Windows APIへの呼び出しをラップします。 Themidaは、アプリケーションが呼び出すWindows API関数に関する情報を隠します。 クラッカーは、実行に必要なライブラリに関する情報も利用できません。
- 変更からのアプリケーションの保護。 Themidaは、起動時にアプリケーションの整合性をチェックし、アプリケーションの変更されたコピーが起動しないようにします。 保護後のアプリケーションに自由に署名できるモードをアクティブにすることができます。
- 実行中の変更からアプリケーションメモリを保護します (ゲームなどを開発している場合に便利です)。
- コード突然変異技術。 アプリケーションに関連付けられているすべてのThemidaカーネルコードが変更され、塗りつぶされます。 このコードが仮想化手法を使用して再生成されるたびに(以下を参照)。
- ファイルおよびレジストリの監視に対する保護。 Themidaは、外部プログラムが保護されたアプリケーションのファイルまたはレジストリへのアクセスを追跡することを許可しません。
- 圧縮 保護を適用すると、ディスク上の実行可能ファイルのサイズがかなり大きくなります。 このサイズを小さくするために、Themidaはアプリケーション自体(セキュリティコードが組み込まれている)とそのリソースの両方の圧縮をサポートしています。
- Themidaは、Delphi / C ++ Builderのフォームを特別な方法から保護できます。 フォームの内容(実際には、* .dfmファイル)は、* .exeからもアプリケーションの実行中にも抽出できません。
説明した機能のほとんどすべてを、必要に応じてオン/オフにできます。
CodeReplaceテクノロジー
CodeReplaceテクノロジーは、アプリケーションの一部を抽出し、その場所にジャンクコードを挿入し、元のコードとセキュリティコードを混合して、アプリケーションの別の場所に保存します。 CodeReplaceで保護されたコードを実行すると、何度もチェックした後、抽出されて復号化されます。 実行後、再びガベージに置き換えられます。 Themida自体がアプリケーションを分析し、そのような保護に適していると思われる機能を選択できます。 しかし、マクロの助けを借りて自分でやる方が良いでしょう(後で説明します)。

仮想マシン
Themida Virtual Machineは、アプリケーションを保護する最も強力な方法の1つです。 その本質は、コードの一部が生成されたアセンブラコードで置き換えられますが、Intelプロセッサにネイティブではなく、独自の命令システムと内部構造を持つ抽象仮想プロセッサのコードです。 Themidaは毎回、そのアーキテクチャの計画をランダムに生成します。 したがって、セキュリティコードを理解することが難しくなります。
Themidaは、いくつかのタイプの仮想プロセッサをサポートしています。
- CISC。 基本的な保護、保護されたコードは比較的高速です。
- CISC-2。 拡張保護。コードはCISCの場合よりも多くのスペースを占有します。 少し遅い。
- RISC-64。 各仮想命令は64ビットを必要とし、保護はCISCより強力ですが、保護されたコードの実行は遅くなります。
- RISC-128。 高度なスーパースローおよびスーパープロテクトRISC-64
CISCプロセッサは、同じ種類の複数の仮想プロセッサを安全なアプリケーションに同時に埋め込むことができますが、命令のシステムは異なります。 これによりセキュリティが向上しますが、アプリケーションの実行可能コードのサイズが増加します。
ノイズ生成により、有用な作業指示を意味のないものと混ぜて、ハッカーの作業をさらに難しくすることができます。
CodeReplaceと同様に、Themidaは、仮想マシンのコードに変換することにより、プログラム内のどの機能を保護するかを選択できます。 ただし、自分で行うことをお勧めします(以下を参照)。

その他
- Themidaを使用すると、PEスキャナーからアプリケーションを隠すことができます。PEスキャナーは、アプリケーションの保護対象を決定します。
- アプリケーションインターフェイス(エラーとシステムメッセージのあるウィンドウ)のローカライズとスクリーンセーバーの挿入のオプションがあります(それでも、保護されたアプリケーションの起動時間は、保護設定に応じて500〜5000ミリ秒増加します。この場合、ユーザーをビジー状態に保つ必要があります)。
- Themidaはコマンドライン管理をサポートしているため、ビルドシステムに統合できます。
さて、悲しいことについて少し。 上記のすべてを使用しても、アプリケーションが破損する可能性があります。 ハッカーをより困難にするには、Themidaマクロを使用します。 今からそれらについて話します。
Themidaマクロ。
Themidaマクロは、アプリケーションに埋め込まれたバイトシーケンスであり、Themidaアプリケーションを保護するまで動作に影響を与えません。 トレッドには特別な意味があります。 実際、彼らはあなたのコードの内部構造の複雑さについてThemidaに通知し、より効果的にそれを保護できるようにします。
マクロには、適用するソースコードの量を決定する開始マーカーと終了マーカーがあります。 SDKには、アセンブラ、C、D、Delphi、およびVisualBasic / Pure Basic用の既製のマクロがあります。 しかし、原則として、アセンブラーまたはコードへのバイト挿入をサポートする言語であれば、2分でやり直すことができます。 ここでは、私に最も近いDelphi構文を使用します。
注意! マクロは、.NETアプリケーションまたはPコードにコンパイルされたVisual Basicアプリケーションでは使用できません。
VM
VMマクロは、Themidaが仮想化するコードの領域を制限します(インターフェイスで設定を指定する仮想マシンの指示に変換します)。 次のように使用します。
{$I VM_Start.inc}
//
{$I VM_End.inc}
このマクロのコードセクションをラップすることをお勧めします。アルゴリズムの秘密は特に重要です。 たとえば、アクティベーションキーの確認、データファイルの復号化、セキュリティキーの確認など。
制限事項:- ブロック内に直接、例外(try、raise)を伴う作業はありません。
- 他のマクロはブロック内で使用できません。
VM_WithLevel
マクロはすべてVMマクロに似ていますが、指定した量だけ仮想化のレベルを上げることで追加の保護を提供します。 また使用されます。 必要な仮想化レベルを指定するには、Delphiで対応する* .incファイルを編集する必要があります(その中のコメントを参照)。 仮想化レベルの高い価値は、コードの強力な肥大化につながります。 レベル0では、マクロはVMマクロと同じように動作します。
制限はVMマクロの場合と同じです。
CodeReplace
このマクロは、上で説明したCodeReplaceテクノロジーによって処理するコードをマークします。 VMマクロと同じ方法で使用されます。
制限はVMマクロの場合と同じです。
エンコード
マクロは、実行前に排他的に暗号化および復号化する必要があるコードのブロックをマークし、ブロックを出るときに暗号化して戻します。 VMマクロと同じように使用されます。 このマクロはVMおよびCodeReplaceマクロよりも弱い保護を提供しますが、その下のコードははるかに高速に動作します。
制限事項:- DLLで使用できません
- ブロック内では、変数を宣言したり、プロシージャを終了したりすることはできません(return / exit)
クリア
このマクロは、最初の呼び出し後にプロセスから削除されるコードブロックをマークします。 このマクロは、プログラムが起動時に一度だけ実行する操作に推奨されます。 たとえば、データを交換するためのセッションキーを計算したり、ライセンスキーを確認したりします。 VMマクロと同じ方法で使用されます。
制限事項:保護されていない
保護後にアプリケーションから削除されるブロックをマークします。 たとえば、保護されていない場合、アプリケーションレポートを作成するために使用できます。 説明されているすべてのマクロと同様に使用されます。 制限はありません。
チェック保護
Themidaのデモ版では、このマクロは使用できません。 これは、アプリケーションセキュリティシステムの正当性を検証するために使用されます。 その使用法は、Themida SDKからの例によって最もよく示されています。
procedure TForm1.Button4Click(Sender:TObject);
var
StatusProtection:整数。
始める
{$ CheckProtection_Prolog.inc}
asm
プッシュ$ 33333333
ステータス保護をポップ
終わり;
{$ CheckProtection_Epilog.inc}
StatusProtection = 33333333ドルの場合
MessageBox(0、「保護OK」、「セキュリティ検証マクロ」、MB_OK + MB_ICONINFORMATION)
他に
MessageBox(0、「アプリケーション保護に違反しています!」、「注意!」、MB_OK + MB_ICONERROR);
終わり;
すべてが保護されている場合にマクロが返す必要のある(整数/カーディナルタイプの)数値を定義します。 この例では、0x33333333。 保護されている場合、アセンブラのプッシュおよびポップ命令はプログラムから削除されます。 代わりに、複雑な検証手順が挿入されます。これは、セキュリティ違反を検出しない場合にのみ、指定した変数(この例ではStatusProtection)で指定した番号を返します。 セキュリティ違反が検出された場合、番号はランダムになります。
もちろん、実際には、示されているように、このマクロは使用できません。 最も簡単なことは、プロジェクトで使用される重要な定数を使用することです。その定数の値はコンテキストであまり明確ではなく、変数で置き換えます。 次に、コード内のどこかでこの新しい変数でこのマクロを使用します。 保護が解除されると、この定数/変数の値が正しくなくなり、最も予期しない場所でアプリケーションがクラッシュする可能性が高くなります。
マクロブロック内には、指定されたアセンブラー命令以外は何もありません。
CheckCodeIntegrity
Themidaのデモ版では、このマクロは使用できません。 このマクロはCheckProtectionと非常によく似ており、セキュリティシステムの別の部分でのみ機能します。 その使用方法はまったく同じです。
CheckVirtualPC
Themidaのデモ版では、このマクロは使用できません。 マクロは前の2つと似ていますが、セキュリティシステムをチェックするのではなく、VirtualPCやVMWareなどのハイパーバイザーの下で保護されたアプリケーションを起動するためのものです。 その使用方法はまったく同じです。 プログラムインターフェイスの対応するチェックマークと組み合わせる必要がある場合を除きます。 次に、保護されたアプリケーションで、Themidaハイパーバイザーの下で起動が検出されると警告が表示され、VirtualPCの下でThemida保護部分が削除されたアプリケーションのバリアントを実行しようとすると、マクロによって支援されます。
.NETアプリケーションのセキュリティ機能。
Themidaは.NETアプリケーションを保護できるという事実にもかかわらず、次の点に留意する必要があります。
- .NET保護後、アプリケーション(* .exe)は.NETアセンブリではなくなり、通常のWin32アプリケーションになります(ただし、そのすべての機能は保持されているため、Paint.NETの* .exeファイルでテストされています)。 アプリケーションを.NETアセンブリとしてダウンロードすることはできなくなります。 もちろん、これによりILDASMなどのユーティリティが機能しなくなります。
- .NETアプリケーション内のマクロはサポートされていません。
- * .exeファイルのすべてのコンテンツと同様に、アプリケーション内のILコードは暗号化されていますが、変更されていません。 Themidaを保護する前に難読化ツールで処理できます。
- * .dllとしての個々のアセンブリの保護はまだサポートされていません。 ただし、X-Bundlerを使用すると、アセンブリをメイン* .exeファイルに簡単に統合できます。
ラファエルとの短いインタビュー
- X-Protectorの開発が中止され、Themidaがリリースされた理由は何ですか?
- いくつかの理由。 X-Protectorは互換性の問題で悪名が高かった。 これらの欠点のない新製品をリリースしたかったのです。 さらに、開発チームは多少変更されました。
- Themida64(64ビットアプリケーションの保護のサポート)の計画は何ですか?
- Themida for x64は今後数か月でリリースされ、近い将来、ベータテスターがそれを受け取ります。
- Themidaカスタムビルドの利点は何ですか?
- 残念ながら、現時点ではこのようなサービスは提供していませんが、特定の互換性要件を持つお客様向けのオプションがいくつかあります。
- ヘルプファイルに記載されているWineとReactOSを見てきました。 Themidaで保護されたアプリケーションはこれらの環境で動作しますか?
- はい、トレッドで保護されたアプリケーションは、これらの環境で正常に動作するはずです。 これらは、多くのお客様の要件です。
- Themidaはリング0ベースの保護を使用していますか?
- しばらく前に、Themidaの最初のバージョンはそのような保護を提供していました。 しかし、しばらくしてから、リング0の使用を削除して、新しいバージョンのWindowsとの互換性を高め、代わりにコード仮想化に基づいた保護を実装しました。
- Themidaは非常に強力なトレッドです。 しかし、ExeCryptorで実装されたアプローチについてはどう思いますか(そこにあるコードは仮想マシンのコードにはならず、単に変異して複雑になり、プロセッサにネイティブのままです)。
- ExeCryptorにはまだ独自の仮想マシンがあったと思います。 エミュレートできるオペコードはエミュレートされました。 できないもの-x86バージョンで変異。 いずれにせよ、これは私が聞いたことであり、確かに私は知らない。
- Themidaの将来の計画は何ですか?
- 一般に、保護をさらに強化するための深刻な再設計を考えています。 しかし、まず第一に、x64サポートがリリースされ、トレッドのすべての後続バージョンはx32およびx64アプリケーションの両方をサポートします。