反調試——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單步調試的結果:



