一些反調(diào)試代碼

#define _WIN32_WINNT 0x0601

#include

#include

typedef BOOL(WINAPI * LPAPI_IDP)(VOID);

LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *pei);

BOOL DeleteFiberApproach();

int main(int argc, PCHAR argv[]){

//getchar();

HMODULE hModule = LoadLibrary("Kernel32");// 加載模塊Kernel32

if (hModule == NULL){

printf("1.被調(diào)試,無法獲取 kernel32.dll模塊\n");//ExitProcess(0); // 如果發(fā)現(xiàn)程序被調(diào)試 直接退出進(jìn)程

}

//FARPROC

LPAPI_IDP IsDebuggerPresent = GetProcAddress(hModule, "IsDebuggerPresent");// 獲取下地址

if (IsDebuggerPresent == NULL){

printf("2.被調(diào)試,無法獲取 IsDebuggerPresent 地址\n");//ExitProcess(0); // 如果發(fā)現(xiàn)程序被調(diào)試 直接退出進(jìn)程

}

if (*(BYTE *)IsDebuggerPresent == 0xcc){

printf("3.被下 0xcc 斷點(diǎn)\n");

}

if (*(BYTE *)IsDebuggerPresent != 0x64){

//printf("4.IsDebuggerPresent 函數(shù)地址被修改 這個(gè)可能不準(zhǔn)\n");

}

if (IsDebuggerPresent()){

printf("5.IsDebuggerPresent 返回被調(diào)試狀態(tài)\n");

}

BOOL isdebug;

CheckRemoteDebuggerPresent(GetCurrentProcess(), &isdebug);

if (isdebug){

printf("6.CheckRemoteDebuggerPresent 返回被調(diào)試狀態(tài)\n");

}

int result = 0;

__asm{

mov eax, fs:[30h]

mov eax, [eax + 68h]

and eax, 0x70

mov result, eax

}

if (result){

printf("7.NtGlobalFlags 標(biāo)志返回被調(diào)試狀態(tài)\n");

}

result = 0;

int result1 = 0;

__asm{

// 進(jìn)程的PEB

mov eax, fs : [30h]

// 進(jìn)程的堆,我們隨便訪問了一個(gè)堆萧锉,下面是默認(rèn)的堆

mov eax, [eax + 18h]

// 檢查ForceFlag標(biāo)志位珊随,在沒有被調(diào)試的情況下應(yīng)該是4 z1 D s$ I: ^% q P5 _

mov eax, [eax + 10h]

mov result, eax

mov eax, fs :[30h]

// 進(jìn)程的堆,我們隨便訪問了一個(gè)堆柿隙,下面是默認(rèn)的堆

mov eax, [eax + 18h]

// 檢查ForceFlag標(biāo)志位叶洞,在沒有被調(diào)試的情況下應(yīng)該是4 z1 D s$ I: ^% q P5 _

mov eax, [eax + 0ch]

mov result1, eax

}

if (result){

//printf("8.ForceFlags 標(biāo)志返回被調(diào)試狀態(tài) %x\n", result);

}

if (result1 != 2){

//printf("8.Heapflags 標(biāo)志返回被調(diào)試狀態(tài) %x\n", result1);

}

typedef enum _PROCESSINFOCLASS {

ProcessBasicInformation = 0,

ProcessWow64Information = 26

} PROCESSINFOCLASS;

typedef NTSTATUS(WINAPI *NtQueryInformationProcessPtr)(

HANDLE processHandle,

PROCESSINFOCLASS processInformationClass,

PVOID processInformation,

ULONG processInformationLength,

PULONG returnLength);

int debugPort = 0;

hModule = LoadLibrary(TEXT("Ntdll.dll "));

NtQueryInformationProcessPtr NtQueryInformationProcess = (NtQueryInformationProcessPtr)GetProcAddress(hModule, "NtQueryInformationProcess");

NtQueryInformationProcess(GetCurrentProcess(), (PROCESSINFOCLASS)7, &debugPort, sizeof(debugPort), NULL);

if (debugPort == -1){

printf("9.NtQueryInformationProcess 調(diào)試端口 返回 %d 如果是 -1 表示被調(diào)試\n", debugPort);

}

//6.

//7.觸發(fā)異常

//UnhandledExceptionFilterApproach();

if (UnhandledExceptionFilterApproach() == FALSE){

printf("10.正常");

} else{

printf("觸發(fā)的異常被調(diào)試器捕獲");

//ExitProcess(0);

}

//8

if (DeleteFiberApproach()){

//printf("11.lasterror錯(cuò)誤號(hào)被修改 %p", GetLastError());

}

getchar();

return 0;

}

// 進(jìn)程要注冊(cè)的未處理異常處理程序A

LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *excp){

printf("-----------------------------------------------------\n");

printf("觸發(fā)異常處理函數(shù),說明沒有被調(diào)試器截獲\n");

printf("異常處理地址 %x\n", excp->ExceptionRecord->ExceptionAddress);

printf("CPU 寄存器:\n");

printf("eax %p ebx %p ecx %p edx %p eip %p\n", excp->ContextRecord->Eax,

excp->ContextRecord->Ebx, excp->ContextRecord->Ecx,

excp->ContextRecord->Edx, excp->ContextRecord->Eip);

printf("-----------------------------------------------------\n");

SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)excp->ContextRecord->Eax);

// 修改寄存器eip的值

excp->ContextRecord->Eip += 2;

// 告訴操作系統(tǒng),繼續(xù)執(zhí)行進(jìn)程剩余的指令(指令保存在eip里)禀崖,而不是關(guān)閉進(jìn)程

return EXCEPTION_CONTINUE_EXECUTION;

}

//

BOOL UnhandledExceptionFilterApproach(){

SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);

__asm{

// 將eax清零

xor eax, eax

// 觸發(fā)一個(gè)除零異常

div eax

}

return FALSE;

}

//

BOOL DeleteFiberApproach(){

char fib[1024] = { 0 };

// 會(huì)拋出一個(gè)異常并被調(diào)試器捕獲

DeleteFiber(fib);

// 0x57的意思是ERROR_INVALID_PARAMETER

//printf("error = %x", GetLastError());

return (GetLastError() != 0x57);

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末衩辟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子波附,更是在濱河造成了極大的恐慌艺晴,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叶雹,死亡現(xiàn)場(chǎng)離奇詭異财饥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)折晦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門钥星,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人满着,你說我怎么就攤上這事谦炒。” “怎么了风喇?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵宁改,是天一觀的道長(zhǎng)母廷。 經(jīng)常有香客問我屹徘,道長(zhǎng),這世上最難降的妖魔是什么奔滑? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮谜喊,結(jié)果婚禮上潭兽,老公的妹妹穿的比我還像新娘。我一直安慰自己斗遏,他們只是感情好山卦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著诵次,像睡著了一般账蓉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逾一,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天铸本,我揣著相機(jī)與錄音,去河邊找鬼嬉荆。 笑死归敬,一個(gè)胖子當(dāng)著我的面吹牛酷含,可吹牛的內(nèi)容都是我干的鄙早。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼椅亚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼限番!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起呀舔,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤弥虐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后媚赖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體霜瘪,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年惧磺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颖对。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡磨隘,死狀恐怖缤底,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情番捂,我是刑警寧澤个唧,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站设预,受9級(jí)特大地震影響徙歼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一魄梯、第九天 我趴在偏房一處隱蔽的房頂上張望呼股。 院中可真熱鬧,春花似錦画恰、人聲如沸彭谁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缠局。三九已至,卻和暖如春考润,著一層夾襖步出監(jiān)牢的瞬間狭园,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國打工糊治, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唱矛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓井辜,卻偏偏與公主長(zhǎng)得像绎谦,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子粥脚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容