プログラムをデバッグからどのようにして回避するか。

ふと思いで、新しい壁紙を探してみる。普段は黒系のシリーズを使っているが、一部にカラフルな要素を取り入れて、デスクトップにアイコンを配置したい。他の色合いの壁紙だとアイコンが見えづらい。

アセンブリコードをしばらく見つめて考えてみたが、理解できなかった。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;
    }
}

説明

斜体_3強調_2__斜体_4__、コードをトレースするとこのフラグがデバッガによってクリアされるため、この例外が見えなくなります。

実際のテストでは、検出デバッグの関数をステップオーバーするとデバッグが検知されないことがわかった。デバッグ関数実行時にステップインした場合のみ検知される。(資料調査、未検証)

参照資料

関連資料は、ウェブサイトの英語版を翻訳したもので、様々なデバッグ対策技術について解説しています。

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