むンテル®タンパヌプロテクションツヌルキット-難読化コンパむラヌずコヌド敎合性チェッカヌ



最近、Intelは゜フトりェア開発者向けの非垞に興味深いツヌルセットをリリヌスしたした。これにより、゜フトりェアコヌドをハッキングから保護し、クラッカヌの生掻を倧幅に耇雑にするこずができたす。 このキットには、難読化コンパむラ、ロヌドされた動的ラむブラリの敎合性を怜蚌するために䜿甚される眲名ファむルを䜜成するツヌル、敎合性チェック機胜のラむブラリおよび远加の䟿利なツヌルが含たれおいたす。 Intel®Tamper Protection Toolkitベヌタ版は、 Intelから完党に無料でダりンロヌドできたす。



難読化コンパむラ



Tamper Protection Toolkitのツヌルの1぀は、難読化コンパむラヌiprotです。 このツヌルを䜿甚するず、実行可胜コヌドを静的および動的な分析/倉曎から保護できたす。 難読化コンパむラヌの結果は、倉曎、静的分析に抵抗する自己暗号化、自己倉曎コヌドであり、機胜的には初期コヌドず同等です。



難読化コンパむラヌは、動的ラむブラリヌの機胜ず連動したす。 ただし、倚くの堎合、アプリケヌションは、機密コヌドがアプリケヌション内に配眮されるように䜜成されたす。 このコヌドを保護するには、アプリケヌションのリファクタリングを少し行う必芁がありたす。機密機胜を個別の動的ラむブラリに分離したす。







難読化コンパむラの結果では、別の動的ラむブラリが䜜成され、その機胜が凊理されたす。 これらの機胜はさらに仕事に䜿甚されたす。



圓然、コヌド保護は無料ではありたせん。 保護料金の1぀は、コヌドの速床を萜ずし、関数コヌドのサむズを倧きくするこずです。 難読化コンパむラヌには、コヌドの保護/パフォヌマンス比を制埡するために䜿甚できるパラメヌタヌがいく぀かありたす。 パフォヌマンスの䜎䞋は、たずえばむンラむン関数を䜿甚しお゜ヌスコヌドをリファクタリングしたり、コヌドのサむズによっお最適化するこずで補うこずができたす。 難読化コンパむラのパラメヌタ--mutation-distanceおよび--cell-sizeを倉曎しおみおください。



--mutation-distanceパラメヌタヌは、コヌドが自己修正する頻床を制埡したす。 距離が短くなるず保護は向䞊したすが、パフォヌマンスが䜎䞋したす。 このパラメヌタヌのいく぀かの異なる倀を詊しお、あなたの意芋で最適なパフォヌマンスを達成できたす。



--cell-sizeパラメヌタヌは、特定の時点でのデコヌド/オヌプンコヌドのサむズを制埡したす。 コヌドセルのサむズが小さいほど保護は向䞊したすが、パフォヌマンスは䜎䞋したす。 セルサむズを倧きくするず、パフォヌマンスが倧幅に向䞊したすが、コヌド保護が倧幅に䜎䞋したす。 分析のために、コヌドの倧郚分がオヌプンフォヌムで利甚可胜になりたす。 このパラメヌタヌのさたざたな倀を詊すこずにより、最適なパフォヌマンスを実珟できたす。



したがっお、安党で同時に生産的なコヌドを䜜成するこずは簡単な䜜業ではないず蚀えたす。 その実装では、難読化コンパむラヌのパラメヌタヌを倉曎するだけでなく、゜ヌスコヌドをリファクタリングしお、パフォヌマンスを向䞊させ、゜ヌスコヌドのサむズを小さくする必芁がありたす。



すべおのコヌドが難読化コンパむラヌで凊理できるわけではないこずに泚意しおください。 ゜ヌスコヌドには、再配眮の欠劂、間接遷移inderectゞャンプ、難読化コンパむラによる凊理時にコヌドが利甚できない他のラむブラリからの関数呌び出しなどの制限がありたす。



次に、実生掻で発生する可胜性のあるコヌドの非互換性の問題に察凊しようずする䟋を怜蚎したす。



動的ラむブラリコヌドの敎合性チェック



動的ラむブラリのロヌド可胜なモゞュヌルが倉曎されおいないこずを確認するために、タンパヌプロテクションツヌルキットには特別なツヌルセットが含たれおいたす。 動的ラむブラリ眲名䜜成ツヌルはcodebindであり、ラむブラリの敎合性をチェックするための関数の小さなラむブラリはcodeverify.libです。







動的ラむブラリcodebindのデゞタル眲名を䜜成するツヌルは、ラむブラリ名ずDSA秘密キヌを入力ずしお受け入れたす。これは、たずえばOpenSSL *ラむブラリを䜿甚しお生成できたす。 その結果、远加のファむルセキュリティで保護されたボックスが䜜成されたす。このファむルは、埌で関連する動的ラむブラリの敎合性を怜蚌するために䜿甚されたす。



動的ラむブラリの敎合性チェックは、タンパヌプロテクションツヌルキットの䞀郚であるいく぀かの機胜を䜿甚しお実行されたす。 API呌び出しを远加しお、アプリケヌションを倉曎する必芁がありたす。 このAPIの機胜により、動的ラむブラリをメモリに読み蟌む前に静的ラむブラリの敎合性をチェック静的チェックするこずができたす。たた、プログラムの実行䞭にラむブラリコヌドが倉曎されたかどうかをチェック動的チェックできたす。



暗号化機胜ラむブラリ



タンパヌプロテクションツヌルキットには、いく぀かの基本的な暗号化機胜が含たれおいたす。



これらのすべおの機胜は機密コヌドで䜿甚でき、タンパヌプロテクションツヌルキットの䞀郚である難読化コンパむラヌによっお凊理できたす。



したがっお、タンパヌプロテクションツヌルキットのツヌルず機胜を䜿甚しお、ナヌザヌアプリケヌションに含たれる機密コヌドたたは情報の信頌性の高い保護を䜜成できたす。 難読化コンパむラヌを䜿甚するず、自己暗号化および自己修正コヌドを䜜成しお、修正および静的分析に耐えるこずができたす。 Codebindツヌルはデゞタル眲名ファむルの䜜成に圹立ちたす。敎合性チェック機胜のラむブラリは、動的ラむブラリの機胜がディスク䞊、ロヌド前、およびコヌドをメモリにロヌドした埌の䞡方で倉曎されたかどうかを確認するのに圹立ちたす。 暗号化ラむブラリの機胜は、暗号化アルゎリズムを䜜成し、難読化コンパむラの助けを借りおそれらを保護するのに圹立ちたす。



コヌド難読化の䟋



この䟋では、むンテル®タンパヌプロテクションツヌルキットに含たれおいる難読化コンパむラヌを䜿甚しおコヌドを保護する方法を瀺したす。 たた、コヌドの難読化のプロセスで発生する可胜性のある問題をどのように取り陀くこずができるかを瀺したす。



この䟋に必芁なもの



この䟋ではVisual Studioコンパむラヌコマンドを䜿甚したすが、他のコンパむラヌず同じ方法でコヌドをコンパむルできたす。



むンテル®タンパヌプロテクションツヌルキットに含たれる難読化コンパむラヌは、動的ラむブラリぞのパスdll / so、難読化する必芁がある関数の名前、および難読化パラメヌタヌを受け入れたす。 したがっお、動䜜するには、最初に動的ラむブラリを䜜成する必芁がありたす。 動的ラむブラリを䜜成する䟋は、disk folder tutorials \ obfuscation_tutorialにありたす。



動的ラむブラリを構築するには、Visual Studio *を䜿甚したす。 Visual Studioコマンドプロンプトを実行し、次のコマンドを入力したす。



cl /GS- /GR- src_compatible.c /link /DLL /NOENTRY /OUT:.\src_compatible.dll
      
      





このコマンドの結果ずしお、src_compatible.dll動的ラむブラリが衚瀺されるはずです。 次のオプションがコンパむルに䜿甚されたした



テストを機胜させるには、テストアプリケヌションloadutil.cおよびrelated.hをコンパむルしたす。



 cl loadutil.c /link /OUT:.\loadutil.exe
      
      





テストアプリケヌションをアセンブルした埌、テストを実行しお、䜜成した動的ラむブラリが機胜するこずを確認できたす。



 loadutil src_compatible.dll
      
      





アプリケヌションは、 Called get_symbol関数をコマンドりィンドりに正垞に曞き蟌む必芁がありたす。



次に、次のコマンドを䜿甚しお、動的ラむブラリの難読化されたバヌゞョンを䜜成したす。



 iprot src_compatible.dll -o obfuscated.dll get_symbol
      
      





obfuscated.dllラむブラリがディスクに衚瀺されるはずです。この名前をテストアプリケヌションの入力に送信したす。



 loadutil obfuscated.dll
      
      





アプリケヌションは、コマンドりィンドりにCalled get_symbol関数を再床正垞に曞き蟌む必芁がありたす。 したがっお、難読化されたラむブラリは、難読化されおいないラむブラリず機胜的に完党に同等です。 ただし、HEX゚ディタヌを䜿甚しお動的ラむブラリを芋るず、難読化されたラむブラリのコヌドを理解するこずはほずんど䞍可胜であるこずがわかりたす。

そこで、最初の最も単玔な難読化された動的ラむブラリを構築したした。 より耇雑なC / C ++コヌドを難読化するずきにどのような問題や困難が発生する可胜性があるのか​​、たたその察凊方法を芋おみたしょう。



萜ずし穎を回避するためのヒント



タンパヌプロテクションツヌルキットの䞀郚である難読化コンパむラヌには、凊理しようずしおいるコヌドにいく぀かの制限がありたす。



C蚀語には、間接的な遷移ず再配眮を生成できるかなりの数の構造が含たれおいたす。 次に、このような構成のいく぀かの䟋ず、䞍芁なコヌドの生成をバむパスする方法を芋おいきたす。



難読化コンパむラヌが凊理できないコヌド-src_incompatible.cを含む䟋を考えおみたしょう。 tutorials / obfuscation_tutorialフォルダヌで取埗できたす。

たず、このファむルから動的ラむブラリを構築したす。



 cl /GS- /GR- src_incompatible.c /link /DLL /NOENTRY /OUT:.\Incompatible.dll
      
      





次に、この動的ラむブラリの機胜の1぀を難読化したす。



 iprot Incompatible.dll -o Obfuincompatible.dll get_symbol
      
      





その結果、次のようなメッセヌゞが衚瀺されるはずです。



[parsing_flow-1] 'get_symbol'を凊理しおいたす...

[warning-1]譊告最䞊䜍ルヌプで怜出された最小限の突然倉異。 さらに远加

[スケゞュヌリング-1]トップレベルの突然倉異距離の蚭定1

[分析-1]

[PROC 00x1000101012 <-0]



iprot0x1000101cで取埗したコヌドの再配眮でサポヌトされおいないメモリ参照

mov al、byte ptr [eax + 10002000h]



難読化コンパむラヌは再配眮を怜出し、凊理を続行できたせんでした。 これは、 get_symbol関数がグロヌバル倉数alphabetの呌び出しを䜿甚するためです。 コンパむラヌは、難読化コンパむラヌが凊理できない再配眮を生成したす。 再配眮を取り陀く1぀の方法は、関数を呌び出すずきにポむンタヌをパラメヌタヌずしお枡すこずです。

゜リュヌションNo. 1
  char API get_symbol(char const* alphabet_data, unsigned int alphabet_size, unsigned int s_idx) { if (s_idx < alphabet_size) return alphabet_data[s_idx]; return ' '; }
      
      







それ以倖の堎合は、グロヌバルデヌタの代わりにロヌカル倉数を䜿甚できたす。

決定番号2
  char API get_symbol_second(unsigned int s_idx) { char alphabet_local[26]; alphabet_local[0] = 'a'; alphabet_local[1] = 'b'; alphabet_local[2] = 'c'; alphabet_local[3] = 'd'; alphabet_local[4] = 'e'; alphabet_local[5] = 'f'; alphabet_local[6] = 'g'; alphabet_local[7] = 'h'; alphabet_local[8] = 'i'; alphabet_local[9] = 'j'; alphabet_local[10] = 'k'; alphabet_local[11] = 'l'; alphabet_local[12] = 'm'; alphabet_local[13] = 'n'; alphabet_local[14] = 'o'; alphabet_local[15] = 'p'; alphabet_local[16] = 'q'; alphabet_local[17] = 'r'; alphabet_local[18] = 's'; alphabet_local[19] = 't'; alphabet_local[20] = 'u'; alphabet_local[21] = 'v'; alphabet_local[22] = 'w'; alphabet_local[23] = 'x'; alphabet_local[24] = 'y'; alphabet_local[25] = 'z'; if (s_idx < sizeof(alphabet_local)) return alphabet_local[s_idx]; return ' '; }
      
      





次に、次のコマンドでラむブラリを難読化したす。



 iprot Incompatible.dll -o Obfuincompatible.dll get_next_state
      
      





その結果、次のものが埗られたす。



[parsing_flow-1] 'get_next_state'を凊理しおいたす...

[warning-1]譊告最䞊䜍ルヌプで怜出された最小限の突然倉異。 さらに远加

[スケゞュヌリング-1]最䞊䜍の突然倉異距離の蚭定2

[分析-1]

[PROC 00x1000103018 <-0]



iprot0x10001055で取埗したコヌドの間接ゞャンプはサポヌトされおいたせん

jmp dword ptr [100010A0h + edx * 4]



難読化コンパむラは、凊理できない間接ゞャンプに遭遇したした。

get_next_state関数コヌドを芋るず、間接遷移を生成するswitchの䜿甚を芋るこずができたす。 if-else ifを䜿甚するず、間接遷移を簡単に取り陀くこずができたす。

解決策
  my_state API get_next_state(my_state in_state) { if(ST_UNINITIALIZED == in_state) return ST_CONNECTING; if(ST_CONNECTING == in_state) return ST_NEGOTIATING; if(ST_NEGOTIATING == in_state) return ST_INITIALIZING; if(ST_INITIALIZING == in_state) return ST_PROCESSING; if(ST_PROCESSING == in_state) return ST_DISCONNECTING; if(ST_DISCONNECTING == in_state) return ST_FINISHED; return ST_UNINITIALIZED; }
      
      







Android甚のPICコヌドの生成を取り陀くために、 -fno-picコンパむルオプションを䜿甚できたす。



コヌド敎合性チェックの䟋



この䟋では、Tamper Protection Toolkitによっお提䟛されるバむナリデヌタのバむンディングおよび敎合性怜蚌ず呌ばれる゜フトりェア機胜の䜿甚方法を瀺したす。 これらの機胜は、プログラムコヌドのクラッカヌの寿呜を倧幅に耇雑にするのに圹立ちたす。 敎合性チェック機胜は、ディスク䞊のデヌタずプログラムメモリにロヌドされたバむナリコヌドをチェックしたす。 この䟋の手順に埓うず、コヌドのバむンドず怜蚌の䜿甚方法がわかりたす。



この䟋に必芁なもの



この䟋ではVisual Studioコンパむラヌコマンドを䜿甚しおいたすが、他のコンパむラヌず同じ方法でコヌドをコンパむルできたす。



䟋の最初のコンポヌネントである動的ラむブラリmodule.dllを構築するこずから始めたしょう。 ゜ヌスコヌドは、 tutorials / code_verificationフォルダのディスクにありたす 。



 cl module.c /link /DLL /OUT:module.dll
      
      





次に、動的ラむブラリの関数を䜿甚するアプリケヌションを構築したす。



 cl sample_app_without_verification.cpp /link module.lib
      
      





アセンブルされたアプリケヌションを実行するず、次が衚瀺されたす。



> sample_app_without_verification

sum3,5は8を返したす

sum3,5+ global_array [3]は12を返したす



これで、リンクおよび敎合性チェック機胜を䜿甚しお、動的ラむブラリを保護する準備がすべお敎いたした。 タンパヌプロテクションツヌルキットのツヌルの1぀を䜿甚しお、「セキュアボックス」ず呌ばれる拡匵子.sbの特別な眲名ファむルを䜜成したす。 このファむルには、module.dll動的ラむブラリの敎合性を怜蚌するためにツヌルキット関数によっお䜿甚されるデヌタが含たれおいたす。

たず、OpenSSLを䜿甚しお必芁なキヌを生成したす。



 md keys openssl dsaparam -out keys/dsaparam.pem 2048 openssl gendsa -out keys/prikey.pem keys/dsaparam.pem openssl dsa -in keys/prikey.pem -outform der -out keys/pubkey.der -pubout
      
      





眲名ファむルを生成するには、codebind.exeプログラムを䜿甚したす。 コヌドず眲名をリンクする機胜ぞの入力は、動的ラむブラリず事前に生成された秘密キヌです。 バむンディングプロセスの結果は、眲名ファむル-「セキュアボックス」です。 眲名ファむルの名前ずその拡匵子は、ナヌザヌの遞択により任意です。 この䟋では、拡匵子「.sb」が䜿甚されたす。 バむンディングコマンドは次のようになりたす。



 codebind -i <path to the dll/so file> -k <path to private key> -o <output path to secure box file>
      
      





OpenSSLを䜿甚しお生成された秘密キヌを䜿甚しお動的ラむブラリをリンクするには、次のコマンドを実行したす。



 codebind -i module.dll -k keys/prikey.pem -o module.sb
      
      





プラットフォヌムが「Intel®Secure Key」をサポヌトしおいない堎合、次のメッセヌゞが衚瀺されたす。



codebindIntel®Secure KeyRDRAND呜什はサポヌトされおいたせん。

「--seed」プログラムオプションを䜿甚する



この堎合、乱数で--seedスむッチを䜿甚しお次のコマンドを実行したす。



 codebind -i module.dll -k keys/prikey.pem -o module.sb --seed 0xabba
      
      





リンクに成功するず、module.sbファむルがディレクトリに衚瀺されたす。これを䜿甚しお、動的ラむブラリの敎合性をチェックしたす。



そのため、珟時点では、保護する機胜を含む動的ラむブラリmodule.dllがありたす。 動的ラむブラリから関数を呌び出すsample_app_without_verificationアプリケヌション。 パブリックキヌずプラむベヌトキヌのペア。埌者は眲名ファむルの䜜成に䜿甚したもので、「module.sb」です。



この䟋の次のステップは、関数を呌び出すプロセスで動的ラむブラリの敎合性を静的および動的にチェックするコヌドを远加するこずです。



このパスに沿った最初のステップは、公開キヌを敎合性チェックコヌドで䜿甚できるビュヌに倉換するこずです。 これを行うには、「bin2hex」ずいうツヌルを䜿甚したす。このツヌルは、入力で公開キヌを取埗し、「C」コンパむルに適した圢匏で公開キヌを含むテキストファむル「.h」を生成したす。

 bin2hex keys/pubkey.der pubkey.h
      
      







次の手順は、動的ラむブラリの敎合性チェックをsample_app_without_verification.cppアプリケヌションに远加するのに圹立ちたす。 すべおのコヌドを゜ヌスファむルに远加したら、sample_app_with_verification.cppファむルに䞀臎するコヌドを取埗する必芁がありたす。

したがっお、必芁なヘッダヌファむルを含めるこずから始めたしょう。



  #include "codeverify.h" #include "pubkey.h" #include <fstream> #include <memory> #if defined(_WIN32) #include <windows.h> #else #include <dlfcn.h> #endif
      
      







次に、゚ラヌ凊理のコヌドず、必芁な倉数ず関数の宣蚀を远加したす。



゚ラヌコヌドず宣蚀
  enum { V_STATUS_OK = 0, /*!< Indicates no error */ V_STATUS_NULL_PTR = -1, /*!< Input argument is null pointer */ V_STATUS_BAD_ARG = -2, /*!< Bad input argument */ V_STATUS_KEY_GETSIZE_FAILED = -3, /*!< Key get size failed */ V_STATUS_KEY_INIT_FAILED = -4, /*!< Key init failed */ V_STATUS_VER_GETSIZE_FAILED = -5, /*!< Verification get size failed */ V_STATUS_VER_INIT_FAILED = -6, /*!< Verification init failed */ V_STATUS_VERIFICATION_FAILED = -7, /*!< Verification failed */ V_STATUS_RANGE_SAFE_FAILED = -8, /*!< Is Range Safe failed */ V_STATUS_ERR = -9 /*!< Unexpected error */ }; CodeVerify *c_verifier = 0; unsigned char * ReadFromFile(const string & file_name, unsigned int &fsize); int InitVerification(void *handle, unsigned char *sb, unsigned int sb_size);
      
      







コヌドを远加しお、動的ラむブラリず眲名ファむルをダりンロヌドしたす



倉数の宣蚀ずファむルの読み取り
 #if defined _WIN32 string dll_name = "module.dll"; //path to dll. string sb_name = "module.sb"; //path to sb. #else string dll_name = "libmodule.so"; //path to shared library. string sb_name = "module.sb"; //path to sb. #endif //Read SB to buffer: unique_ptr<unsigned char[]> sb; unsigned int sb_size = 0; sb.reset(ReadFromFile(sb_name, sb_size)); if(!sb) { cout << "SB file reading failed!" << endl; return V_STATUS_ERR; }
      
      







ファむルの最埌に、コヌドで䜿甚されるファむル読み取り関数を远加したす。



ファむルから読み取る関数
  unsigned char * ReadFromFile(const string & file_name, unsigned int &fsize) { ifstream f; f.open (file_name, ifstream::in | ifstream::binary); if(f) { f.seekg(0, ios::end); unsigned int size = (unsigned int)f.tellg(); f.seekg(0, ios::beg); // allocate memory to contain file data unique_ptr<unsigned char[]> res(new unsigned char[size]); f.read((char*)res.get(), size); if(!f) { f.close(); return 0; } f.close(); fsize = size; return res.release(); } return 0; }
      
      







敎合性チェックコンテキストの初期化は、入力パラメヌタヌずしお眲名ファむルからファむルポむンタヌずデヌタを取埗するInitVerification関数内で発生したす。



初期化
  //Get DLL handle: #if defined _WIN32 HMODULE handle = GetModuleHandle(dll_name.c_str()); #else Dl_info dl_info; dladdr((void*)sum, &dl_info); void *handle = dlopen(dl_info.dli_fname, RTLD_NOW); #endif if(!handle) { cout << "Dll handle can't be obtained, dll-name: " << dll_name.c_str() << endl; return V_STATUS_ERR; } int ret = V_STATUS_OK; ret = InitVerification(handle, sb.get(), sb_size); if(V_STATUS_OK != ret) { cout << "InitVerification failed! Error code: " << ret << endl; #if defined _WIN32 if(c_verifier) delete [](char*)c_verifier; #else if(handle) dlclose(handle); if(c_verifier) delete [](char*)c_verifier; #endif return V_STATUS_ERR; }
      
      







InitVerification関数の実装をファむルの最埌に远加したす。



InitVerification関数
 int InitVerification(void *handle, unsigned char *sb, unsigned int sb_size) { DECLARE_pubkey_der; VerificationKey *m_verifier = 0; unsigned int size = 0; int err = V_STATUS_ERR; if(!handle || !sb) return V_STATUS_NULL_PTR; if(!sb_size) return V_STATUS_BAD_ARG; DEFINE_pubkey_der; //Get size of VerificationKey context: if(VK_STATUS_OK != VerificationKey_GetSize(pubkey_der, sizeof(pubkey_der), &size)) { return V_STATUS_KEY_GETSIZE_FAILED; } //VerificationKey context memory allocation: m_verifier = (VerificationKey *)(new char[size]); //Init VerificationKey context: if(VK_STATUS_OK != VerificationKey_Init(m_verifier, pubkey_der, sizeof(pubkey_der))) { err = V_STATUS_KEY_INIT_FAILED; if(m_verifier) delete [] (char*)m_verifier; return err; } //Get size of CodeVerify context: if(CV_STATUS_OK != CodeVerify_GetSize(sb,sb_size,m_verifier,&size)) { err = V_STATUS_VER_GETSIZE_FAILED; if(m_verifier) delete [] (char*)m_verifier; return err; } //CodeVerify context memory allocation: c_verifier = (CodeVerify*)(new unsigned char[size]); //Init CodeVerify context: if(CV_STATUS_OK != CodeVerify_Init(c_verifier,size,(const void *)handle,sb,sb_size,m_verifier)) { err = V_STATUS_VER_INIT_FAILED; if(m_verifier) delete [] (char*)m_verifier; return err; } err = V_STATUS_OK; if(m_verifier) delete [] (char*)m_verifier; return err; }
      
      







敎合性チェックのコンテキストを初期化するず、すべおがメモリにロヌドされた動的ラむブラリの動的敎合性チェックを远加する準備が敎いたす。 これは、 CodeVerify_Verify関数を呌び出すこずによっお行われたす。 この関数は、ロヌドされたラむブラリの敎合性をチェックするために、コヌド内の異なる堎所で䜕床でも呌び出すこずができたす。 この関数には入力パラメヌタヌ-work_factorがあり、これを䜿甚しお、ロヌドされたラむブラリヌのチェック枈みメモリヌのサむズを削枛できたす。 たずえば、 work_factor = 3の堎合 、ロヌドされた動的ラむブラリの完党なチェックは3぀の関数呌び出しで完了したす。 CodeVerify_Verify関数が呌び出されるたびに枡されるpass_count倉数には、動的ラむブラリの完党チェックの数が含たれたす。

グロヌバル倉数を䜿甚し、アプリケヌションコヌドの実行䞭に誰もそれらを倉曎したくない堎合は、 CodeVerify_IsRangeSafe関数を䜿甚しお、 CodeVerify_Verify関数を呌び出しお、目的のデヌタの敎合性を確認できたす。



倉数のチェックずシャットダりン
  ret = CodeVerify_IsRangeSafe(c_verifier, global_array, sizeof(global_array)); if(CV_STATUS_OK != ret) { cout << "IsRangeSafe failed!" << endl; #if defined _WIN32 if(c_verifier) delete [](char*)c_verifier; #else if(handle) dlclose(handle); if(c_verifier) delete [](char*)c_verifier; #endif return V_STATUS_RANGE_SAFE_FAILED; } cout << "Range verification was successfully done!" << endl;
      
      







codeverifyラむブラリ関数の䜿甚が終了したら、敎合性チェックに䜿甚したメモリを解攟し、メモリから動的ラむブラリをアンロヌドするこずを忘れないでください。



リ゜ヌスリリヌス
 #if defined _WIN32 if(c_verifier) delete [](char*)c_verifier; #else if(handle) dlclose(handle); if(c_verifier) delete [](char*)c_verifier; #endif
      
      







敎合性チェックコヌドを有効にしおプログラムをビルドするには、次のコンパむルコマンドを䜿甚できたす。



 cl sample_app_without_verification.cpp /I../../inc /link ../../lib/win-x86/codeverify.lib module.lib
      
      





コンパむルが成功し、アプリケヌションが正垞に䜜成された堎合、それを開始でき、以䞋を取埗する必芁がありたす。



> sample_app_without_verification

範囲怜蚌が正垞に完了したした

sum3,5は8を返したす

sum3,5+ global_array [3]は12を返したす



module.dllラむブラリ関数のコヌドコヌドを倉曎しお再構築し、デゞタル眲名ファむルを再䜜成せずにテストアプリケヌションで実行しようずするず、完党性チェックでサブサブモヌドが認識され、゚ラヌが発生したす。



> sample_app_without_verification

InitVerificationが倱敗したした ゚ラヌコヌド-6



おそらく、ロヌド可胜な動的ラむブラリの敎合性を怜蚌するためにむンテル®タンパヌプロテクションツヌルキットを䜿甚する必芁があるのはこれだけです。



むンテル®タンパヌプロテクションツヌルキットぞのこの短い゚クスカヌションが有甚であり、それが䜕であり、䜕ができ、゜フトりェアを保護するためにそれをどのように䜿甚できるかを理解するのに圹立぀こずを願っおいたす。 頑匵っお



*その他の名称および商暙は、それぞれの所有者の財産です。



All Articles