999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于SEH的反調(diào)試技術(shù)及其應(yīng)用研究

2025-08-26 00:00:00蔣子恒邵金俠
電腦知識與技術(shù) 2025年20期

摘要:軟件安全日益重要,反調(diào)試技術(shù)是保護(hù)軟件知識產(chǎn)權(quán)的關(guān)鍵手段。該文研究了基于結(jié)構(gòu)化異常處理(SEH)的反調(diào)試技術(shù),闡述了其原理、實現(xiàn)方法,并結(jié)合Windows操作系統(tǒng),分析了具體的應(yīng)用案例。研究結(jié)果表明,SEH反調(diào)試技術(shù)可以有效阻止動態(tài)調(diào)試分析,但仍存在一定的局限性。該文旨在為軟件開發(fā)者提供SEH反調(diào)試技術(shù)的實踐參考。

關(guān)鍵詞:SEH;反調(diào)試;異常處理;Windows;逆向工程

中圖分類號:TP309文獻(xiàn)標(biāo)識碼:A

文章編號:1009-3044(2025)20-0041-04

0引言

隨著軟件逆向工程技術(shù)的進(jìn)步,軟件安全面臨嚴(yán)峻挑戰(zhàn)。惡意攻擊者可以利用調(diào)試工具分析程序,竊取敏感信息或繞過安全機(jī)制。因此,反調(diào)試技術(shù)作為保護(hù)軟件知識產(chǎn)權(quán)的重要手段,得到了廣泛關(guān)注。結(jié)構(gòu)化異常處理(StructuredExceptionHandling,SEH)是Windows操作系統(tǒng)提供的異常處理機(jī)制,可用于檢測和阻止調(diào)試器的存在。本文將深入探討基于SEH的反調(diào)試技術(shù)原理、實現(xiàn)方法及其在Windows環(huán)境下的應(yīng)用,為軟件開發(fā)者提供技術(shù)參考。

1SEH基本概念

1.1SEH簡介

結(jié)構(gòu)化異常處理(SEH)是Windows操作系統(tǒng)提供的異常處理機(jī)制[1],允許程序在發(fā)生異常時執(zhí)行特定的處理代碼,避免程序崩潰。它類似于C++中的try-catch塊,當(dāng)線程發(fā)生錯誤時,操作系統(tǒng)會調(diào)用用戶定義的回調(diào)函數(shù)[2]進(jìn)行處理。該回調(diào)函數(shù)可以執(zhí)行各種操作,例如修正錯誤,并返回一個值告知系統(tǒng)后續(xù)操作。

1.2SEH鏈

SEH鏈由_EXCEPTION_REGISTRATION_RECORD結(jié)構(gòu)體組成的鏈表表示,每個結(jié)構(gòu)體包含指向下一個結(jié)構(gòu)體的指針和異常處理函數(shù)的地址[3]。當(dāng)程序遇到異常時,會依次調(diào)用鏈上的異常處理器,直到異常得到處理或到達(dá)鏈表尾部,即next值為0xFFFFFFFF。

1.3異常處理函數(shù)

異常處理函數(shù)是SEH鏈中每個節(jié)點的核心,負(fù)責(zé)處理異常[4]。其函數(shù)原型為返回值枚舉型函數(shù)名(PEXCEPTION_RECORDExceptionRecord,PEXCEPTION_REGISTRATION_RECORDEstablisherFrame,PCONTEXTpcontext,PVOIDDispatcherContext)。返回值枚舉型包含ExceptionContinueExecution、ExceptionContinue?Search、ExceptionNestedException和ExceptionCollid?edUnwind4個可選值,分別表示異常已被處理、異常未被當(dāng)前程序處理、發(fā)生了嵌套異常和異常處理過程中出現(xiàn)沖突;EXCEPTION_RECORD結(jié)構(gòu)體包含異常信息;EXCEPTION_REGISTRATION_RECORD結(jié)構(gòu)體是SEH鏈中的節(jié)點;CONTEXT結(jié)構(gòu)體包含異常發(fā)生時的CPU上下文;DispatcherContext是自定義參數(shù)。

2SEH反調(diào)試原理

2.1SEH反調(diào)試技術(shù)概述

反調(diào)試技術(shù)可以隱藏和保護(hù)程序代碼與數(shù)據(jù),使其無法被逆向分析。常見的反調(diào)試方法包括檢查調(diào)試標(biāo)志、檢測調(diào)試窗口名稱、檢測調(diào)試窗口的進(jìn)程名和分析調(diào)試行為等。微軟創(chuàng)建了SEH機(jī)制,并將其搭載到VC++中,其實是一種從屬于VC++開發(fā)工具和Windows操作系統(tǒng)的異常處理機(jī)制。通過SEH反調(diào)試技術(shù),在程序的異常處理部分嵌入一些反調(diào)試的邏輯,可以檢測調(diào)試器的存在,并采取一些措施阻止進(jìn)一步的分析。

2.2SEH反調(diào)試的基本原理

異常(Exception)常常用于反調(diào)試技術(shù)。正常運行的進(jìn)程發(fā)生異常時,在SEH機(jī)制的作用下,操作系統(tǒng)會接收到該異常,然后調(diào)用進(jìn)程中注冊的SEH處理。

但如果進(jìn)程在調(diào)試運行中發(fā)生異常,調(diào)試器就會接收處理。所以利用該特征可以判斷進(jìn)程是正常運行還是處于被調(diào)試的狀態(tài),然后根據(jù)結(jié)果執(zhí)行對應(yīng)操作,這就是SEH反調(diào)試的原理。

SEH反調(diào)試的實現(xiàn)包括如下步驟。

1)設(shè)置異常處理鏈:為了在發(fā)生異常時能夠捕獲并處理,在程序的入口或關(guān)鍵位置,設(shè)置好SEH異常處理鏈。

2)嵌入反調(diào)試邏輯:在異常處理函數(shù)中嵌入編寫的反調(diào)試邏輯,通過檢查調(diào)試標(biāo)志、調(diào)用特定API等方法來檢測調(diào)試器的存在。

3)觸發(fā)異常:故意觸發(fā)異常的位置并不固定,通常取決于程序編寫者的需求,可通過故意觸發(fā)的異常,進(jìn)入異常函數(shù)處理。

4)采取措施:當(dāng)反調(diào)試邏輯檢測到調(diào)試器存在時,采取終止運行、改變執(zhí)行流程等措施,阻止調(diào)試器進(jìn)一步分析。

3異常處理函數(shù)內(nèi)反調(diào)試方法

3.1檢查調(diào)試標(biāo)志

檢查調(diào)試標(biāo)志:NtGlobalFlag是Windows內(nèi)核的全局標(biāo)記,它定義了系統(tǒng)調(diào)試參數(shù),通過檢查NtGlo?balFlag的值,調(diào)試狀態(tài)下通常為0x70,可以判斷程序是否被調(diào)試。獲取NtGlobalFlag的方法:首先通過TEB定位PEB,然后通過PEB+0x68找到NtGlobal?Flag。需要注意的是,修改NtGlobalFlag會影響整個系統(tǒng),應(yīng)謹(jǐn)慎使用。

3.2檢測調(diào)試器窗口

Windows操作系統(tǒng)提供了IsDebuggerPresentAPI函數(shù),用來檢測調(diào)試器窗口。可以通過IsDebugger?PresentAPI的返回值,判斷當(dāng)前進(jìn)程是否被調(diào)試。這種方法雖然方便,但容易被調(diào)試器繞過,所以通常需要結(jié)合其他方法使用。

3.3線程檢查

調(diào)試器會創(chuàng)建或修改線程上下文,因此可以通過檢查線程的掛起狀態(tài)、優(yōu)先級、監(jiān)測線程的創(chuàng)建和銷毀事件等方法來檢測調(diào)試器的存在。

3.4硬件斷點

使用調(diào)試器調(diào)試游戲并修改游戲的內(nèi)存數(shù)據(jù)時,硬件斷點反調(diào)試可以檢測并阻止這種調(diào)試行為,以防止調(diào)試器分析關(guān)鍵數(shù)據(jù)。硬件斷點利用調(diào)試寄存器(DR0~DR7)設(shè)置斷點,反調(diào)試程序可以通過檢查這些寄存器的值來檢測硬件斷點的存在。然而,硬件斷點數(shù)量有限,且可能被高級調(diào)試器繞過,同時也會影響游戲性能。硬件斷點原理圖如圖1所示。

具體說明如下:

DR6:用于在調(diào)試異常產(chǎn)生后顯示一些信息。

DR7:L0/G0-L3/G3:控制DR0—DR3是否有效,以及是局部還是全局的。每次異常后,Lx都被清零,Gx不清零。LENx(斷點長度):00(1字節(jié)),01(2字節(jié)),11(4字節(jié))。R/Wx(斷點類型):00(執(zhí)行斷點),01(寫入斷點),11(訪問斷點)。LEN0—LEN3對應(yīng)DR0—DR3斷點長度。00表示1個字節(jié),01表示2個字節(jié),11表示4個字節(jié)。RW0—RW3對應(yīng)DR0—DR3斷點的類型,00表示執(zhí)行斷點,1表示寫入斷點,11表示讀寫斷點。

DR0—DR3:用于設(shè)置硬件斷點位置,存儲線性地址。

盡管硬件斷點反調(diào)試技術(shù)在游戲安全防護(hù)方面具有一定優(yōu)勢,但其實也存在一定的局限性:1)調(diào)試寄存器數(shù)量有限:從圖1可以發(fā)現(xiàn),調(diào)試寄存器(如DR0—DR3)的數(shù)量有限,因此游戲只能同時設(shè)置有限數(shù)量的硬件斷點。同時,在各類調(diào)試器當(dāng)中,也只能給程序設(shè)置4個硬件斷點,這可能會限制硬件斷點反調(diào)試技術(shù)的效果。2)可能被繞過:一些高級調(diào)試器可能會采用特定的技術(shù)手段來繞過硬件斷點反調(diào)試機(jī)制。3)影響游戲性能:硬件斷點反調(diào)試技術(shù)可能會增加游戲的運行負(fù)荷,從而影響游戲性能。

4SEH反調(diào)試案例分析

通過對SEH的介紹可知,各類觸發(fā)的異常,比如對0地址寫數(shù)據(jù)、除數(shù)為0等,都會導(dǎo)致編譯器報警。下面是案例測試效果。

4.1異常過濾器

在C++中實現(xiàn)一個異常處理的函數(shù),偽代碼描述如下:

1)MyExceptionFilter(ExceptionInfo),輸入Excep?tionInfo(指向異常信息的指針),輸出LONG,表示異常處理的結(jié)果。操作步驟:①調(diào)用MessageBox顯示一個消息框,參數(shù)均為0,表示默認(rèn)設(shè)置。②返回EXCEPTION_CONTINUE_EXECUTION(表示繼續(xù)執(zhí)行觸發(fā)異常的位置)。

2)主函數(shù)main()的操作步驟:

①設(shè)置未處理異常過濾器為MyExceptionFilter。②執(zhí)行內(nèi)聯(lián)匯編代碼。首先將0移動到EAX寄存器,然后嘗試將1存儲到EAX指向的內(nèi)存地址,這將導(dǎo)致訪問異常。接著調(diào)用system(\"pause\")暫停程序,等待用戶輸入,最后返回0,表示程序正常結(jié)束。函數(shù)My?ExceptionFilter(ExceptionInfo)主要步驟:①彈出對話框。②返回EXCEPTION_CONTINUE_EXECUTION值。此處需要先設(shè)置異常過濾器,然后將1存儲到地址0中。但實際上,地址0在大多數(shù)操作系統(tǒng)和硬件平臺上是不被允許訪問的,所以會觸發(fā)異常,即段錯誤。程序運行的效果如圖2所示。

通過給地址0賦值觸發(fā)異常的方法,程序可將異常交給設(shè)置好的異常過濾器去處理。在異常過濾器函數(shù)MyExceptionFilter中,返回值設(shè)置的是EXCEPTION_CONTINUE_EXECUTION,這個返回參數(shù)代表處理完異常后,返回到異常觸發(fā)的位置繼續(xù)執(zhí)行。此處無論點擊取消還是確定,都會反復(fù)彈出提示對話框。異常處理時可以進(jìn)行彈框操作,還能完成其他操作。

4.2自定義異常處理器并添加檢測

在C++中實現(xiàn)一個異常處理的方法如下(用偽代碼描述)。

1)函數(shù)MyExceptHandler(ExceptionRecord,Estab?lisherFrame,pcontext,DispatcherContext)操作步驟:①顯示消息框“(異常處理代碼執(zhí)行了“”提示”,MB_OK)。②定義局部變量isDebuger=0。③執(zhí)行匯編代碼。首先獲取TEB地址,通過該TEB+0x30獲取PEB地址,再通過PEB+2獲取一個字節(jié)移入寄存器eax,最后將eax內(nèi)的值存入預(yù)定義好的變量isDebugger中。④判斷isDebuger是否不等于0,如果等于0,退出程序;否則給EIP加4個字節(jié)實現(xiàn)跳過異常代碼。

2)主函數(shù)操作步驟:①獲取MyExceptHandler的地址賦值給局部變量exceptionFunAddr。②通過內(nèi)聯(lián)匯編代碼,將異常處理函數(shù)加入異常處理鏈。③將NULL賦值給字符指針。④通過給字符指針賦值觸發(fā)異常。

在這里通過內(nèi)聯(lián)匯編[5]的方法,實現(xiàn)了將自定義好的異常處理函數(shù)加入SEH的異常處理鏈中。程序在執(zhí)行到給空指針賦值時,會觸發(fā)異常,此時進(jìn)入異常處理鏈中。當(dāng)?shù)竭_(dá)所定義的異常處理函數(shù)時,在此函數(shù)中通過fs寄存器獲取到TEB,再通過TEB+0x30去獲取PEB的位置。PEB+0x2的位置是一個標(biāo)志位,當(dāng)調(diào)試器對程序進(jìn)行調(diào)試時,該標(biāo)志位不為0,會導(dǎo)致程序的退出。其函數(shù)參數(shù)pContext存放的是上下文,即寄存器的值,通過pContext去訪問eip。由于觸發(fā)異常的代碼占4字節(jié),則如果程序處于非調(diào)試器運行的情況下,通過對eip自加4,可以跳過異常代碼,從而使得程序正常運行。自加的字節(jié)數(shù)并非固定,需要看其觸發(fā)異常匯編代碼的字節(jié)數(shù)。圖3和圖4分別為正常運行和調(diào)試器執(zhí)行效果圖。

根據(jù)觀察不同環(huán)境下程序的執(zhí)行,發(fā)現(xiàn)正常執(zhí)行時會執(zhí)行到程序末尾;如果使用VistaDbg調(diào)試程序,會被檢測到調(diào)試器,同時強制結(jié)束程序。

4.3SEH和硬件斷點反調(diào)試

MyExceptHandler(ExceptionRecord,EstablisherFrame,pcontext,DispatcherContext)函數(shù)步驟:1)判斷pContext中的DR0不為0,或DR1不為0,或DR2不為0,或DR3不為0。如果條件成立,打印“檢測到硬件斷點”,并退出進(jìn)程;否則將跳過當(dāng)前指令,假設(shè)當(dāng)前指令長度為2字節(jié),并將pContext中的EIP+2,賦值給pContext中的EIP。2)最后返回ExceptionContinueExecution。

主程序main()操作步驟:1)獲取MyExceptHandler的地址,賦值給局部變量exceptionFunAddr。2)通過內(nèi)聯(lián)匯編代碼,將異常處理函數(shù)加入異常處理鏈。3)通過給除數(shù)為零觸發(fā)異常。4)打印程序正常結(jié)束。首先將異常處理函數(shù)的地址通過內(nèi)聯(lián)匯編加入SEH鏈中,同時采用除0異常的方式,進(jìn)入異常處理函數(shù)。異常處理函數(shù)發(fā)現(xiàn)使用了參數(shù)pContext時,由于pContext保存上下文,那么其中就包含著4個硬件斷點,即DR0~DR3。通過判斷這4個值,可以檢查調(diào)試器是否對程序下了硬件斷點。同時通過eip+異常代碼字節(jié)數(shù),跳過異常代碼。圖5和圖6分別是正常結(jié)束和對調(diào)試器下硬件斷點的實際執(zhí)行效果。

通過圖6,可以看到,在調(diào)試器下硬件斷點后,程序是能夠檢測到的,當(dāng)然這也不是絕對的。硬件斷點反調(diào)試會在游戲中應(yīng)用,在通過非正常手段修改游戲數(shù)據(jù)時,通常會通過硬件斷點對搜索到的數(shù)據(jù)下斷點,從而找到實現(xiàn)功能的函數(shù)和關(guān)鍵語句。聯(lián)網(wǎng)游戲一般通過send函數(shù)發(fā)包,在send函數(shù)發(fā)包前,通過自我觸發(fā)異常從而進(jìn)入異常處理函數(shù),在函數(shù)內(nèi)部添加檢測代碼。正常運行程序時不會有任何問題,一旦對程序下硬件斷點,程序本身就可能會結(jié)束運行此類操作。

5實驗結(jié)果與分析

5.1繞過檢查調(diào)試標(biāo)志

通過調(diào)試器修改NtGlobalFlag值是一個技術(shù)性的操作,通常用于反調(diào)試或調(diào)試特定的應(yīng)用程序。下面是通過調(diào)試器修改NtGlobalFlag值的步驟:

第一步:訪問NtGlobalFlag。使用調(diào)試器提供的內(nèi)存訪問功能,根據(jù)之前找到的PEB地址和NtGlobal?Flag的偏移量來訪問NtGlobalFlag的值。

第二步:修改值。將NtGlobalFlag的值修改為需要的值,通常將其設(shè)置為0可以繞過一些反調(diào)試技術(shù)。

第三步:驗證修改。修改后確保檢查NtGlobal?Flag的值是否已成功更改。

其在x32dbg調(diào)試器中的效果如圖7所示。

5.2繞過檢測調(diào)試器窗口

在使用調(diào)試器調(diào)試程序時,通過對IsDebugger?Present下API斷點定位到函數(shù)位置,此時通過修改返回值即可實現(xiàn)繞過。

5.3繞過SEH反調(diào)試

SEH反調(diào)試是通過故意觸發(fā)異常方式實現(xiàn)。當(dāng)觸發(fā)異常時,會在異常處理鏈中加入異常處理函數(shù)。其具體解決辦法如下:

第一步:先讓程序運行起來,觀察調(diào)試器觸發(fā)異常的提示。

第二步:根據(jù)SEH新添加的異常處理例程(如圖8所示,其中010FFBA4為新添加的異常處理例程),通過其所對應(yīng)的地址定位棧類數(shù)據(jù)。x32dbg棧內(nèi)數(shù)據(jù)如圖9所示,VistaDBG與x32dbg類似。

第三步:根據(jù)棧類地址,直接定位帶有反調(diào)試的異常處理函數(shù)內(nèi)部,或者在之前右鍵選擇轉(zhuǎn)到異常處理程序同樣也能實現(xiàn)。

第四步:對帶有反調(diào)試的異常處理函數(shù)進(jìn)行正確的分析與修改,即可繞過SEH反調(diào)試。

6結(jié)束語

本文研究了基于SEH的反調(diào)試技術(shù),通過案例分析探討了其在Windows環(huán)境下的應(yīng)用。結(jié)果表明,SEH反調(diào)試技術(shù)可以有效阻止一些簡單的動態(tài)調(diào)試分析,但其自身存在局限性,容易被高級調(diào)試器繞過。未來研究方向包括結(jié)合多種反調(diào)試技術(shù),提高程序的抗逆向分析能力以及研究更難以被繞過的反調(diào)試方法。在實際開發(fā)中,需要根據(jù)具體的應(yīng)用場景和安全需求來選擇合適的反調(diào)試技術(shù)和策略。此外,反調(diào)試技術(shù)并非萬能,應(yīng)與其他安全措施(如代碼混淆、加密等)結(jié)合使用,構(gòu)建更全面的軟件保護(hù)體系。反調(diào)試技術(shù)雖然可以提高程序的抗逆向工程能力,但并不能完全防止惡意用戶或攻擊者對程序進(jìn)行分析和攻擊。

參考文獻(xiàn):

[1]黃釗,黃曙光,鄧兆琨,等.基于SEH的漏洞自動檢測與測試用例生成[J].計算機(jī)科學(xué),2019,46(7):133-138.

[2]沙子涵,舒輝,武成崗,等.基于回調(diào)函數(shù)的控制流深度模糊模型[J].軟件學(xué)報,2022,33(5):1833-1848.

[3]葛麗麗,帥東昕,謝金言,等.面向軟件供應(yīng)鏈的異常分析方法綜述[J].軟件學(xué)報,2023,34(6):2606-2627.

[4]江建慧,吳捷程,孫亞.一種基于異常控制流的錯誤程序行為分析方法[J].同濟(jì)大學(xué)學(xué)報(自然科學(xué)版),2018,46(7):972-981.

[5]廖舟.區(qū)塊鏈性能測試及智能合約內(nèi)聯(lián)匯編研究[D].成都:電子科技大學(xué),2022.

【通聯(lián)編輯:代影】

主站蜘蛛池模板: 精品国产一区91在线| 91年精品国产福利线观看久久| 视频一本大道香蕉久在线播放 | 欧美三级不卡在线观看视频| 不卡无码网| 国内精品久久久久久久久久影视| 久久亚洲美女精品国产精品| 欧美另类第一页| 92精品国产自产在线观看| 老司国产精品视频| 亚洲成在线观看| 国产欧美日韩在线在线不卡视频| 国产又粗又猛又爽| 免费大黄网站在线观看| 国产成人精品亚洲日本对白优播| 欧美色伊人| 一级毛片在线直接观看| 狠狠色噜噜狠狠狠狠色综合久| 麻豆国产原创视频在线播放| 日韩精品无码不卡无码| 最新日韩AV网址在线观看| 精品久久人人爽人人玩人人妻| 亚洲国产精品日韩专区AV| 三上悠亚在线精品二区| 国产成人你懂的在线观看| 99在线小视频| 三级欧美在线| 免费可以看的无遮挡av无码| 天天干伊人| 亚洲国产综合自在线另类| 国产免费黄| 日韩在线欧美在线| 国产二级毛片| 在线观看免费国产| 一级毛片在线免费看| 欧美精品亚洲精品日韩专区| 久久免费精品琪琪| 亚洲欧洲日韩综合色天使| 无码电影在线观看| 欧美不卡视频在线观看| 91无码人妻精品一区二区蜜桃| 天天综合网色中文字幕| 日韩中文精品亚洲第三区| 国模视频一区二区| 久久亚洲日本不卡一区二区| 午夜一区二区三区| 噜噜噜久久| 一本综合久久| 一级高清毛片免费a级高清毛片| 亚洲性日韩精品一区二区| 麻豆精品久久久久久久99蜜桃| 欧美在线视频不卡第一页| 国产福利拍拍拍| av天堂最新版在线| 91免费国产高清观看| 欧美成人一级| 午夜a视频| 精品国产黑色丝袜高跟鞋| 不卡无码h在线观看| 亚洲男人的天堂视频| 久久香蕉国产线| 国产福利一区二区在线观看| av一区二区三区在线观看| 夜精品a一区二区三区| 午夜国产大片免费观看| 国产导航在线| 男人的天堂久久精品激情| 欧美日韩国产成人高清视频| 欧美人人干| 亚洲性视频网站| 污网站免费在线观看| 精品视频一区二区观看| 亚洲香蕉久久| 国国产a国产片免费麻豆| 亚洲男人在线天堂| 538精品在线观看| 秋霞午夜国产精品成人片| 91久久夜色精品国产网站| 国内精自视频品线一二区| 色亚洲激情综合精品无码视频| 亚洲电影天堂在线国语对白| 一级毛片免费的|