アンチデバッグ - のための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およびプラットフォーム固有の回答やプロセスを自動化する可能性が何のために非常に満足して上で実行しています何らかの方法で。
あなたのコードは偽陽性を生成します。本当に 'int 3'オペコードをチェックしたいのであれば、命令を解析する必要があります。 0xCCは、「int 3」以外のオペコード(例えば、即値)の一部であってもよい。また、デバッガはあなたの世界を変える力を持っています。スレッドを一時停止したり、コードをスキップしたり、0xCCシーケンスを注入してブレークポイントを設定したりすることができます。これは本当に攻撃を阻止するための非常に素朴な試みです。 – IInspectable
0xCCをスキャンする代わりに、コードのハッシュを生成して差分を比較する方が良いです。これには、他のコード変更攻撃も検出できるという利点があります。 –
要するにこれを行う良い方法はありません。参照:http://stackoverflow.com/questions/4156585/how-to-get-the-length-of-a-function-in-bytes –