2016-04-12 2 views
5
私はint型3ブレークポイントのための簡単なチェックを実装しました http://www.codeproject.com/Articles/30815/An-Anti-Reverse-Engineering-Guide#BpMem

アンチデバッグ - のためのCALC機能のメモリフットプリントINT 3ブレークポイントの検出

この資料に記載されているように私はいくつかの簡単なアンチデバッグ対策で探しています

関数testForInt3Breakpointsは、ブレークポイントがのthisIsADummyFunctionに設定されている場合はtrueを返します。上記

int thisIsADummyFunction() 
{ 
    int i = rand(); 
    ++i; 
    return i; 
} 

bool testForInt3Breakpoints() 
{ 
    bool breakPointPresent = false; 
    unsigned char* memPtr = reinterpret_cast<unsigned char*>(thisIsADummyFunction); 

    auto size = 0x16; //this value determined by manual inspection of compiled code 

    for (size_t i = 0; i < size; i++) { 
     if (memPtr[ i ] == 0xCC) {   //see if byte equals int 3 instruction 
      breakPointPresent = true; 
      break;    
     } 
    } 
    return breakPointPresent; 
} 

機能は、その1つの特定の機能のために私のために正常に動作しますが、私は、コンパイルされたコードを毎回チェックしなくても、複数の機能を監視できるようにしたいと思います。

私の質問は、どのメモリを監視するかを知るために関数のメモリフットプリントを取得する方法はありますか?

私は、実行時にそれを行うには、一般的なクロスプラットフォームの方法はありません理解: How to get the length of a function in bytes?

が、私は、Windowsのx64およびVisual Studio 2015およびプラットフォーム固有の回答やプロセスを自動化する可能性が何のために非常に満足して上で実行しています何らかの方法で。

+0

あなたのコードは偽陽性を生成します。本当に 'int 3'オペコードをチェックしたいのであれば、命令を解析する必要があります。 0xCCは、「int 3」以外のオペコード(例えば、即値)の一部であってもよい。また、デバッガはあなたの世界を変える力を持っています。スレッドを一時停止したり、コードをスキップしたり、0xCCシーケンスを注入してブレークポイントを設定したりすることができます。これは本当に攻撃を阻止するための非常に素朴な試みです。 – IInspectable

+0

0xCCをスキャンする代わりに、コードのハッシュを生成して差分を比較する方が良いです。これには、他のコード変更攻撃も検出できるという利点があります。 –

+0

要するにこれを行う良い方法はありません。参照:http://stackoverflow.com/questions/4156585/how-to-get-the-length-of-a-function-in-bytes –

答えて

0

上記のコメントに記載されているように、この特定の問題の説明には、特に0xCCのスキャンとの組み合わせでは適切な解決策がありません。ブレークポイントがなくてもコードですぐに発生する有効なバイトですセット。

さらに言えば、コードセクション全体をハッシングする方がよいでしょう。しかし、これは次のような欠点があります

  • 編と卵の問題:あなたは、コンパイル後のハッシュ値を取得する必要がありますが、実際には予想1と実際のハッシュを比較するために、あなたのコードの中にそれを使用します。
  • チェックの頻度とコードセクションの大きさ(ライブラリコードを含む)に応じて、これはパフォーマンスに大きな影響を与える可能性があります。さらに、アプリケーションがアイドル状態である間にチェックを行うと、現時点では実行されていなくても、Windowsはコードのすべての部分をページする必要があります。
  • セキュリティソフトウェアや他のプロセスの低レベルの変更を行うツールで問題が発生することがあります。このようなツールの中には、コードの一部をメモリに直接上書きして追加のセキュリティ機能を実行するものがあります。

それでもこのルートを移動したい場合は、どこにでもコード(のような&main)、そしてそれをすべて読み、などのハッシュアルゴリズムを使用してポインタでVirtualQueryを使用してコードのセクションの境界を得ることができますMurmurhash(これはかなり高速です)でハッシュを作成し、それを保存された値と比較します。

そこでの鶏卵の問題を解決するには、プログラムの実行中のコピーから何らかの種類の "秘密"コマンドラインスイッチを使用するか、 OpenProcessVirtualQueryExおよびReadProcessMemoryを使用して別のプログラムを使用して)、データセクションやリソースなどのハッシュの一部ではない場所に格納します。後者を使用する場合は、ファイルを再コンパイルせずに正しいハッシュをファイルに設定することもできます。

関連する問題