心血を注ぎ、新しい壁紙を探し求めた。習慣は黒系の壁紙だが、一部の領域には色を加えても良いだろう。デスクトップにはアイコンを配置する必要があるため、他の色系が壁紙だとアイコンが不明瞭になってしまう。
上記のコードを睨めつけ、理解できずにいた。AIに投げかけて説明したが、状況を説明していなかったのだ。それは特定の状況下で使われる指示であり、通常のコードではこのような形ではない。
AIは今や検索エンジンには及ばない。アセンブリの知識が不足している。
壁紙
彙集コード
PUSHFD
MOV DWORD PTR [ESP],0X100
POPFD
実用例
bool IsDebugged()
{
__try
{
__asm
{
pushfd
mov dword ptr [esp], 0x100
popfd
nop
}
return true;
}
__except(GetExceptionCode() == EXCEPTION_SINGLE_STEP
? EXCEPTION_EXECUTE_HANDLER
: EXCEPTION_CONTINUE_EXECUTION)
{
return false;
}
}
彙編コード
PUSHFD
および POPFD
は、フラグレジスタの値をスタックにプッシュおよびポップする命令です。
MOV DWORD PTR [ESP], 0X100
は、スタックポインタ (ESP
) のアドレスにある4バイト(DWORD)領域に 0x100
の値を移動する命令です。
nop
は、何もしない命令です。デバッグやテストのために使用されることがあります。
実用例
このコードは、デバッグモードでプログラムが実行されているかどうかを判断します。
__try
ブロック内でアセンブリコードを実行し、例外が発生した場合に __except
ブロックが実行されます。
GetExceptionCode() == EXCEPTION_SINGLE_STEP
は、プログラムがシングルステップモードで実行されているかどうかを確認します。
EXCEPTION_EXECUTE_HANDLER
および EXCEPTION_CONTINUE_EXECUTION
は、それぞれハンドラを実行するか、実行の継続を許可する例外コードです。
この例では、プログラムがシングルステップモードで実行されている場合、true
が返されます。それ以外の場合は、false
が返されます。
説明
TrapFlag
はレジスタフラグ領域内のフラグであり、このフラグが設定されると、SINGLE_STEP
例外が発生します。なぜなら、デバッガーでコードをトレースしている場合、このフラグはデバッガーによってリセットされ、その例外を捕捉できないからです。
実際のテストでは、直接ステップオーバーしてデバッグ対象の関数を実行すると、デバッグが検出されないことがわかります。例外は、その関数にエントリする実行時のみ検出されます(資料参照、未検証)。
参考文献
中国語の関連資料は、すべてウェブサイトの英文稿を翻訳したものです。このサイトでは、さまざまな反调试技術について解説しています。