プログラムのデバッグを防止する方法

心血を注ぎ、新しい壁紙を探し求めた。習慣は黒系の壁紙だが、一部の領域には色を加えても良いだろう。デスクトップにはアイコンを配置する必要があるため、他の色系が壁紙だとアイコンが不明瞭になってしまう。

上記のコードを睨めつけ、理解できずにいた。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例外が発生します。なぜなら、デバッガーでコードをトレースしている場合、このフラグはデバッガーによってリセットされ、その例外を捕捉できないからです。

実際のテストでは、直接ステップオーバーしてデバッグ対象の関数を実行すると、デバッグが検出されないことがわかります。例外は、その関数にエントリする実行時のみ検出されます(資料参照、未検証)。

参考文献

中国語の関連資料は、すべてウェブサイトの英文稿を翻訳したものです。このサイトでは、さまざまな反调试技術について解説しています。

Licensed under CC BY-NC-SA 4.0
最終更新 2025年06月02日 20:54
金融ITプログラマーのいじくり回しと日常のつぶやき
Hugo で構築されています。
テーマ StackJimmy によって設計されています。