8.8 異常處理機制反調試

通常可以通過在程序中設置異常處理函數,並在其中發起一個異常,然後判斷程序是否已經被調試器附加來實現反調試。如果異常處理函數沒有被觸發,則說明程序已經被調試器附加;如果異常處理函數被觸發,則說明程序沒有被調試器附加。

安裝異常處理函數並手動觸發,此時如果被調試器附加,則會不走異常處理流程,此時IsDebug將會返回默認的False,並直接走_asm call pBuff;在調試器不忽略int3中斷的情況下,調試將會被終止。

#include <Windows.h>
#include <stdio.h>

BOOL Exceptioni = FALSE;

LONG WINAPI ExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo)
{
    Exceptioni = TRUE;
    return EXCEPTION_CONTINUE_EXECUTION;
}

BOOL IsDebug()
{
    ULONG OldProtect = 0;
    LPTOP_LEVEL_EXCEPTION_FILTER lpsetun;
    
    // 安裝自己實現的 ExceptionFilter 自定義異常處理函數
    lpsetun = SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ExceptionFilter);
    LPVOID pBuff = VirtualAlloc(NULL, 0x1000, MEM_COMMIT, PAGE_READWRITE);
    
    *((PWORD)pBuff) = 0xc3;
    
    VirtualProtect(pBuff, 0x1000, PAGE_EXECUTE_READ | PAGE_GUARD, &OldProtect);

    _asm call pBuff;                       // 如果被調試,則執行中斷,不會進行異常處理
    SetUnhandledExceptionFilter(lpsetun);  // 恢復異常處理
    return Exceptioni;
}

int main(int argc, char * argv[])
{
    if (!IsDebug())
    {
        printf("[-] 程序正在被調試 \n");
    }

    system("pause");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章