反調試——11——檢測TF標志寄存器


反調試——11——檢測TF標志寄存器

在intel的x86寄存器中有一種叫標志寄存器:

 

 

標志寄存器中的TF(Trap Flag)位,CPU在執行完一條指令后,如果檢測到標志寄存器的TF位為1,則會產生一個int 1中斷,然后再將TF置為0,后進行int 1中斷后繼續執行。操作系統上可以視為異常。

再加上出現了異常如果有調試器就會返回給調試器,如果調試器繼續往下走也沒啥問題,因為我們這里的異常代碼是一個nop,而一個普通運行的進程因為沒調試器,所以就會走異常處理程序,所以就是走異常處理程序的就是正常進程,沒走的就是異常。

代碼實踐:

#include<Windows.h>
#include<iostream>
#include<tlhelp32.h>
using namespace std;
​
void HaveStep()
{
    cout << "檢測到了單步調試" << endl;
    ExitProcess(0);
}
void NoStep()
{
    cout << "沒有檢測到單步調試" << endl;
}
void CheckTFflag()
{
    cout << "test" << endl;
    DWORD HaveStepAddr = (DWORD)HaveStep;
    __try
    {
        __asm
        {
            pushfd
            or dword ptr ss : [esp] , 0x100
            popfd
            nop
            jmp HaveStepAddr
        }
    }
    __except (1)
    {
        NoStep();
    }
}
int main()
{
    CheckTFflag();
    system("pause");
    return 0;
}

  

正常運行的結果和采用vs單步調試的結果:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM