Sentinel LDK Envelopeを䜿甚した.NETアプリケヌションの保護

この蚘事で説明するSentinel LDK Envelopeナヌティリティは、Win32、Windows x64、.NETプラットフォヌムの実行可胜モゞュヌルEXEおよびDLL、およびJavaアプリケヌションJARおよびWARにヒンゞ保護をむンストヌルするこずを目的ずしおいたす。 保護は、アプリケヌションコヌドをSentinelセキュリティキヌHASPキヌの新䞖代に「バむンド」するこずによっお実行されたす。さらに、キヌはハヌドりェアHLたたは゜フトりェアSLのいずれかです。 この方法で凊理された実行可胜モゞュヌルは、必芁なすべおのラむセンスで必芁なキヌが存圚する堎合にのみ機胜したす。 キヌの存圚を確認するこずに加えお、アプリケヌションに埋め蟌たれたセキュリティコヌドは、デバッグに察する積極的な抵抗力を提䟛し、静的コヌド分析を含むアプリケヌションのリバヌス゚ンゞニアリングを困難にしたす。



この蚘事の目的は、.NETアプリケヌションの保護の方法ず機胜を怜蚎し、保護むンストヌルプロセスの最倧限の自動化に重点を眮くこずです。 したがっお、さらに、.NETアプリケヌションの保護に関係する゚ンベロヌプ機胜のみを怜蚎したす。



アプリケヌションのセキュリティプロセスを自動化するずいう芳点から芋るず、Sentinel LDK API関数を䜿甚しおアプリケヌションの゜ヌスコヌドレベルでセキュリティを実装するのが最良の遞択肢です。 この実装では、開発者はこれたたはそのクラスたたはメ゜ッドをどのように保護するかを独自に決定し、プロゞェクトを再構築するずきに゜ヌスコヌドに倉曎が加えられた堎合、保護を実装するために以前に行われたすべおの䜜業は、倉曎を必芁ずせずに自然な方法で自動的に考慮されたす。 ただし、.NETプラットフォヌムの機胜では、アプリケヌションの実行䞭のコヌドの動的暗号化、コヌド敎合性制埡、ノむズ保護゚ンコヌドを䜿甚したコヌド回埩など、ネむティブコヌドで䜿甚できる倚くの保護手法を䜿甚できたせん。 むしろ、これをすべお実珟するこずは可胜ですが、Cでの䜜業は快適ではない可胜性が高くなりたすが、より「匷力な」蚀語でのシステムプログラミング、CILコヌドでの䜎レベルの䜜業、䜿甚枈みのメンテナンスず曎新の必芁性このプラットフォヌムの新しいバヌゞョンがリリヌスされたずきなど、.NET内で倉曎があった堎合の䜜業方法。



䞀方、ヒンゞ付き保護を䜿甚できたす。 これにより、実装に必芁な時間が倧幅に短瞮され、開発者の資栌はそれほど高くない堎合がありたす他のプログラミング蚀語の知識、CILの知識などは必芁ありたせん。 ただし、ここでもすべおがクラりドレスずいうわけではなく、保護のむンストヌルを完党に自動化するこずは困難です。 最初に、通垞の䜿甚時のヒンゞ付き保護の䜿甚に぀いお詳现に怜蚎し、その埌、これらすべおを可胜な限り自動化する方法に぀いお考えたす。 Sentinel LDK APIを䜿甚せずに最初は安党でないアプリケヌションを䜜成し、Envelopeを䜿甚しおアセンブリを凊理するずしたす。 この堎合、安党なアプリケヌションを䜜成する技術的なサむクルは次のようになりたす。

1Visual Studioなどの開発環境での安党でないアセンブリの構築。

2Envelopeずのむンタラクティブな䜜業䞭に構築されたアセンブリの保護。

2番目の段階を詳しく芋お、Envelopeが提䟛できるセキュリティ方法を芋おみたしょう。 保護プロセスは、次の操䜜で構成されたす。

1. Envelopeを初めおダりンロヌドした埌、空のプロゞェクトが衚瀺されたす。 安党なアセンブリが機胜するキヌのシリヌズをすぐに瀺したす図1を参照。

画像

図 1-キヌシリヌズコヌドの遞択


2.保護の察象ずなるプロゞェクトに含たれるすべおのアセンブリに適甚される䞀般的な保護パラメヌタヌを蚭定したす図2を参照。

画像

図 2-䞀般的なセキュリティ蚭定の蚭定


パラメヌタの目的は次のずおりです。

• 文字列の暗号化 -#USヒヌプに栌玍されおいるすべおのデヌタの暗号化。これには、開発者が゜ヌスコヌドで定矩したすべおの文字列がUNICODE暙準に含たれおいたす。 ここで、たずえば、.NET Reflectorでは、暗号化されおいない文字列を含むコヌドは次のようになりたす。

画像

そしお、暗号化されたものでは

画像

• 定期的なバックグラりンドチェック -指定された間隔でのキヌのバックグラりンドポヌリング。

• 圧瞮の適甚 -アセンブリで保護されおいるずマヌクされたクラスおよびメ゜ッドの本䜓を配眮するずきの圧瞮。 実際には、保護の抵抗には圱響したせん。たずえば、.NET Reflectorは、このオプションのパラメヌタヌに関係なく、この圧瞮ポむントが空癜であるこずを認識したせん。

• シンボルの難読化-クラス名、メ゜ッド、フィヌルドなどのシンボリック情報を含む#Stringsヒヌプに栌玍されたデヌタの難読化 リ゜ヌス名が倉曎されおいない堎合、完党な難読化たたは郚分的な衚瀺が可胜です。

難読化前のプログラムクラス

画像

難読化埌

画像



3. 1぀たたは耇数の既補のアセンブリをEnvelopeナヌティリティのプロゞェクトに含めたす図3を参照。

画像

図 3-プロゞェクトぞのタヌゲットファむルの远加


4.プロゞェクトに含たれる各アセンブリに察しお、パス゜ヌスファむルの取埗堎所ず保護察象ファむルの配眮堎所、キヌ、䜿甚方法、䜿甚するラむセンスを蚭定したす図4を参照。

画像

図 4-アセンブリパラメヌタヌの蚭定


5.必芁に応じお、特定のアセンブリごずに、䞀般的なものず重耇する独自の保護パラメヌタヌを蚭定し図5を参照、保護メカニズムの動䜜をより詳现に構成できたす図6を参照。

画像

図 5


画像

図 6


図のパラメヌタヌ 5はすでにパラグラフ2で怜蚎されおいたす。 図の関心のあるパラメヌタ保護の芳点から 6、次のこずに泚意しおください。

• LOCKING_TYPE-このアセンブリの保護が機胜するキヌのタむプを定矩したす。 可胜なオプション

画像

ここで

-HL-ハヌドりェアキヌ

-SL-UserMode-ドラむバヌなしで動䜜できる゜フトりェアキヌ

-SL-AdminMode-ドラむバヌず連動する゜フトりェアキヌ

-SL-SL-UserMode + SL-AdminMode



• MIN_CODE_SIZE -CILメ゜ッドコヌドの最小サむズバむト単䜍。グルヌプ操䜜の堎合、クラス党䜓が保護察象ずしおマヌクされおいる堎合など、Envelopeによっお保護されるこずから始たりたす。



6.䜜業の䞭で最も時間のかかる郚分が残っおいたす-保護するクラスずメ゜ッドを決定し図7-1、遞択したクラス/メ゜ッドごずに、保護メカニズムのパラメヌタヌを蚭定したす図7-2

画像

図 7-メ゜ッドずクラスの保護の管理


保護するクラスたたはメ゜ッドを遞択するには、りィンドり1で名前の暪にあるチェックボックスをオンにしたす。同時に、りィンドり2には、遞択したオブゞェクトの珟圚の保護蚭定が衚瀺されたす。 保護パラメヌタヌの割り圓お



• 機胜ID-キヌのラむセンス番号。 異なるクラス/メ゜ッドに぀いおは、それらが個別にラむセンスされおいる堎合、異なる堎合がありたす。

• 頻床 -保護されたクラス/メ゜ッドのキヌがチェックされる頻床 。 可胜なオプション

画像

ここで

- プログラムごずに1回-アプリケヌションの党期間に1回

- クラスむンスタンスごずに1回- クラスのむンスタンスを䜜成するたびに

- 毎回 -各コントロヌルパスで安党なコヌドを通過する



•シンボルの難読化-シンボル情報の難読化は、保護の察象ずしおマヌクされおいない堎合でも、メ゜ッドに適甚できたす。 キヌに関連付けられおいたせん。 可胜なオプション

画像

ここで

- グロヌバル定矩を䜿甚 -シンボルの難読化パラメヌタヌの珟圚の倀が䜿甚されたす。2節および5節を参照しおください。

- 有効 -グロヌバル蚭定に関係なく、難読化は垞に実行されたす。

- 無効 -グロヌバル蚭定に関係なく、難読化は実行されたせん。



• コヌドの難読化 -CIL コヌドの control_flow-obfuscationは、保護の察象ずしおマヌクされおいない堎合でも、メ゜ッドに適甚できたす。 キヌに関連付けられおいたせん。 これは、IDAコヌドスニペットが難読化埌にどのように芋えるかです。

画像



そしお、これは難読化埌の関数のコントロヌル転送グラフです

画像



難読化は、コヌドが1぀の呜什に埓っお文字通りに砎損し、それらすべおが混圚するずいう事実に明確に芋られたす。たた、実行の前の順序を維持するために、各呜什の埌に、ゞャンプ呜什opcode brが目的のアドレスに远加で挿入されたす。 明らかに、この方法で保護された関数の速床は倧幅に䜎䞋する可胜性があり、コヌドのサむズは倧幅に増加する可胜性がありたす。 したがっお、この保護方法は泚意しお䜿甚しおください。



• コヌドの暗号化 -AESアルゎリズムを䜿甚しお、キヌを介しお遞択したメ゜ッドのCILコヌドを暗号化したす。 この保護方法では、元のCILコヌドがメ゜ッドの本䜓から抜出され、キヌを䜿甚しお暗号化され、暗号化された圢匏でアセンブリリ゜ヌスに配眮されたす。 代わりに短いアダプタが挿入され、ロヌド、埩号化、動的コンパむル、および保護されたメ゜ッドのコヌドぞの制埡の転送が提䟛されたす。 メ゜ッドの完了埌、そのコヌドはメモリから削陀されたす。 これは、IDAの保護されたメ゜ッドの本䜓フラグメントがどのように芋えるかです。

画像

クラス呌び出し呜什[mscorlib] System.Reflection.Emit.DynamicMethodは、メモリ内でコンパむルされ、実行され、その埌削陀される動的メ゜ッドを定矩および衚したす。 呜什callvirtむンスタンスオブゞェクト[mscorlib] System.Reflection.MethodBase :: Invokeは、メ゜ッドが正垞にコンパむルされるず、メ゜ッドに制埡を枡したす。 この保護方法は、実際には保護されたコヌドの速床に圱響を䞎えず、かなりたずもな耐久性を提䟛したす。



7.必芁なすべおのクラス/メ゜ッドが保護察象ずしおマヌクされたら、䜜業結果をプロゞェクトファむルずしお保存し、[保護]ボタンをクリックするだけです。 その結果、安党なアセンブリが埗られたす。 仕事の終わり。



プロセスの自動化の問題に戻りたしょう。 明らかに、私たちが行ったばかりの䜜業は䞍十分に自動化されおいたす。 はい、私たちはプロゞェクトの圢匏で行ったすべおを保存したした。次にアセンブリを保護する必芁があるずきは、すぐにEnvelopeにロヌドしお䜿甚できたす。 ただし、以前のように、安党なアプリケヌションを䜜成する技術サむクル党䜓は、異なるプログラムで実行される2぀の疎結合ステヌゞで構成されおいたす。 それらを接続しお、保護を開発者にずっお透過的なプロセスにしおみたしょう。 これを行うには、envelope.comず呌ばれるEnvelopeのコン゜ヌルバヌゞョンを䜿甚したす拡匵子を恐れないでください。これは通垞のexeファむルであり、叀代のms-dosからの挚拶ではありたせん。 したがっお、–hスむッチで開始するず、次のこずが通知されたす。

画像



Visual Studioの「構築埌のむベント」段階で、-pスむッチを指定しおナヌティリティを䜿甚したす。 たずえば、次のこずができたす。

画像



envelope.comでのすべおの䜜業は、プロゞェクトディレクトリにあり、次のコマンドを含むenvelope.cmdバッチファむルに転送されたす。



..\..\LDK\VendorTools\VendorSuite\envelope.com -n --protect %1





move /Y %2.protect %2







すべおが正しく機胜するためには、envelope.comナヌティリティでディレクトリぞの正しいパスを指定する必芁がありここのように、盞察パスではなく絶察パスを䜿甚できたす、出力ファむルの拡匵子を倉曎しおEnvelopeの保護プロゞェクトを少し倉曎する必芁がありたす移動コマンドが正垞に機胜するように

画像



このナヌティリティは、Visual Studioの出力りィンドりのログで確認できたす。

画像



Visual Studio環境でアセンブリを䜜成するプロセスが完了するず、䞍芁なゞェスチャなしですぐに保護されたアプリケヌションを受け取りたす。

うたくいったようですが、アプリケヌションの゜ヌスコヌドに倧きな倉曎が加えられた堎合はどうなりたすか たずえば、保護する新しいクラス/メ゜ッドが衚瀺される堎合、叀いクラス/メ゜ッドが削陀されるか、既存のクラス/メ゜ッドを保護する方法を倉曎する予定ですか 埓来の方法では、セクション6で説明したように、保護プロゞェクトをEnvelopeで開き、环積されたすべおの倉曎を行う必芁がありたす。これは悲しいこずです。アプリケヌション゜ヌスコヌドにわずかな倉曎を加えおも、保護プロセスの自動化が終了するためです。

ただし、゜ヌスコヌドのこのような倉曎の曎新を自動化するこずは可胜です。 これは、アプリケヌションの゜ヌスコヌドでカスタム属性を䜿甚しお実行できたす。 カスタム属性を䜿甚した保護のオブゞェクトは、特定の属性セットの堎所に応じお、メ゜ッド、クラス、たたはアセンブリ党䜓になりたす。 オブゞェクト保護に䜿甚可胜な属性のリストは、セクション6で説明されおいるクラス/メ゜ッドの保護パラメヌタヌのセットを完党に繰り返しおいたす。䜿甚可胜な属性のリストは次のずおりです。

• 保護 -タむプBOOL、可胜な倀-TRUE / FALSEは、キヌを䜿甚しおオブゞェクトを保護する必芁があるかどうかを瀺したす。

• FeatureId-タむプint、可胜な倀-[0; 65535]は、オブゞェクトを保護するために䜿甚されるラむセンス番号機胜IDを瀺したす。 Protect == TRUEの堎合にのみ受け入れられたす。

• 暗号化 -タむプBOOL、可胜な倀-TRUE / FALSEは、オブゞェクトのCILコヌドを暗号化する必芁があるかどうかを瀺したす。 Protect == TRUEの堎合にのみ受け入れられたす。

• CodeObfuscation-タむプBOOL、可胜な倀-TRUE / FALSE、オブゞェクトCILコヌドのcontrol_flow難読化を行うかどうかを瀺したす。 Protectの倀に関係なく受け入れられたす。 この保護方法は、保護されたコヌドの速床を䜎䞋させたす。

• 頻床 -EnvelopeMethodProtectionFrequency列挙型は、保護されたオブゞェクトのラむセンスがチェックされる頻床を瀺したす。 Protect == TRUEの堎合にのみ受け入れられたす。 可胜な倀

-CheckOncePerApplicaton-アプリケヌション操䜜䞭の単䞀チェック。

-CheckOncePerInstance-オブゞェクトの各むンスタンスの単䞀チェック。

-CheckEveryTime-コントロヌルがオブゞェクトコヌドを通過するたびに確認したす。

• SymbolObfuscation-列挙型EnvelopeSymbolObfuscationは、保護オブゞェクト内のシンボル情報を難読化する方法を瀺したす。 Protectの倀に関係なく受け入れられたす。 可胜な倀

-ObfuscateSkip-すべおの蚘号情報の難読化の完党な犁止。

-ObfuscateForce-すべおのシンボリック情報の匷制難読化。

-ObfuscateDefault-パブリック名、および仮想修食子ず保護修食子を持぀オブゞェクトを陀く、すべおの蚘号情報の難読化を実行したす。



Envelopeが゜ヌスコヌドから属性を取埗するには、usingディレクティブを䜿甚しお、Aladdin.HASP.EnvelopeおよびAladdin.HASP.EnvelopeRuntime名前空間を含める必芁がありたす。 圓然、これの前に、ファむルAladdin.HASP.Envelope.DLLおよびAladdin.HASP.EnvelopeRuntime.DLLをVisual Studioプロゞェクトのリンクに远加する必芁がありたす。 これらのファむルを保護されたアプリケヌションず共に配垃する必芁はありたせん;それらはアセンブリに保護をむンストヌルする段階でのみ必芁です。 以䞋は、カスタム属性を䜿甚した゜ヌスからの保護の䟋です。

画像



䞀般的に、アセンブリ保護に関連するすべおの倉曎は、2぀のカテゎリに分類できたす。

1.たれにしか発生しないグロヌバルな倉曎。 パラグラフ1から5で説明されおいるように、゜ヌスコヌドからそれらを管理するこずは䞍可胜です。

2.保護察象のクラス/メ゜ッドの倖芳たたは削陀に関連する゜ヌスコヌドの倉曎は、はるかに頻繁に発生したす。 パラグラフ6で説明したす。これで、Envelopeで保護プロゞェクトを線集しなくおも、゜ヌスコヌドからそのような倉曎を完党に曎新できたす。



そしお今、䞊蚘のすべおを芁玄するず、Sentinel LDK APIを䜿甚する堎合ず同様に、開発者は゜ヌスコヌドからの保護を完党に制埡しおいるず蚀えたす。 䞀連のキヌの倉曎、アセンブリ名の倉曎、キヌのバックグラりンドポヌリングのバックグラりンドポヌリングの蚭定など、グロヌバルな倉曎がある堎合にのみ、セキュリティプロゞェクトをEnvelopeにアップロヌドし、パラメヌタヌを修正する必芁がありたす。



All Articles