WL 2009 professional【已解决】谢谢nooby跟海风
生活随笔
收集整理的這篇文章主要介紹了
WL 2009 professional【已解决】谢谢nooby跟海风
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
WL 2009 professional【已解決】謝謝nooby跟海風(fēng)
研究這個(gè)好久了,從中也學(xué)習(xí)到了不少東西幫朋友研究XX的反調(diào)試,一個(gè)沒(méi)見(jiàn)過(guò)的反調(diào)試,不能斷點(diǎn),輸出是WL 2009
首先當(dāng)然是用強(qiáng)壯的SOD以及hideod來(lái)實(shí)驗(yàn)了下了,沒(méi)通過(guò)
然后想到了setinformationthread??簡(jiǎn)單HOOK了看調(diào)用,然后直接給他返回status_successful,測(cè)試,不行
翻了翻windows異常處理,
若KiDebugRoutine不為空,則不為空就將Context、陷阱幀、異常記錄、異常幀、發(fā)生異常的模式等壓入棧并將控制交給KiDebugRoutine。當(dāng)處理完畢用Context設(shè)置陷阱幀并返回到上一級(jí)例程。(第一次機(jī)會(huì))否則把異常記錄壓棧并調(diào)用DbgkForwardException,在DbgkForwardException里判斷當(dāng)前線(xiàn)程ETHREAD結(jié)構(gòu)的HideFromDebugger成員如果為FALSE(為T(mén)RUE表示該異常對(duì)用戶(hù)調(diào)試器不可見(jiàn))則向當(dāng)前進(jìn)程的調(diào)試端口(DebugPort)發(fā)送LPC消息。
? ?? ?? ?|
? ?? ?? ?|
? ?? ?? ?|
? ???當(dāng)上一步無(wú)法處理異常時(shí)將Context結(jié)構(gòu)拷貝到用戶(hù)堆棧,在堆棧中設(shè)置一個(gè)陷阱幀,陷阱幀的Eip為Ke(i)UserExceptionDisptcher((i)表示這個(gè)函數(shù)的Ke和Ki打頭的符號(hào)其實(shí)是一回事),接著返回陷阱處理程序,由陷阱處理程序iret返回用戶(hù)態(tài)執(zhí)行Ke(i)UserExceptionDispatcher(這個(gè)函數(shù)雖然是Ke(Ki)打頭,卻不是內(nèi)核里的函數(shù)。同樣性質(zhì)特殊的還有Ke(i)RaiseUserExceptionDispatcher、Ke(i)UserCallbackDispatcher、Ke(i)UserApcDispatcher。它們的共同特點(diǎn)就是不是被調(diào)用的,而是由內(nèi)核例程設(shè)置了陷阱幀TrapFrame.Eip為該函數(shù)后iret執(zhí)行到這里的)。Ke(i)UserExceptionDisptcher調(diào)用RtlDispatchException(用戶(hù)態(tài)下的)尋找堆棧中基于幀的異常處理例程(若在XP和2003下先處理VEH再處理SEH),這個(gè)流程大家應(yīng)該很熟了,就是搜索SEH鏈表,若都不處理就調(diào)用頂層異常處理(TOP LEVEL SEH)例程。當(dāng)再無(wú)法處理時(shí)就調(diào)用默認(rèn)異常處理例程終止進(jìn)程(有VC時(shí)這里就換成了VC)。有點(diǎn)不同的是用戶(hù)態(tài)下的RtlDispatchException只判斷返回值是ExceptionContinueExecution還是ExceptionContinueSearch。若RtlDispatchException找到異常處理例程能夠處理異常,則調(diào)用ZwContinue按照設(shè)置好的Context結(jié)構(gòu)繼續(xù)執(zhí)行,否則調(diào)用ZwRaiseException,并且把第三個(gè)布爾參數(shù)設(shè)為FALSE,表示進(jìn)入第二次機(jī)會(huì)處理。
? ?? ?? ?|
? ?? ?? ?|
? ?? ?? ?|
? ???ZwRaiseException經(jīng)過(guò)一系列調(diào)用最后直接調(diào)用KiDispatchException,由于把布爾值FirstChance設(shè)置為FALSE,在KiDispatchException里直接進(jìn)入第二次機(jī)會(huì)處理。
? ?? ?? ?|
? ?? ?? ?|
? ?? ?? ?|
? ???(第二次機(jī)會(huì))向進(jìn)程的DebugPort發(fā)消息,若無(wú)法處理,則改向進(jìn)程的ExceptionPort發(fā)消息(這里同樣如果該異常對(duì)用戶(hù)調(diào)試器不可見(jiàn),則只會(huì)發(fā)送到ExceptionPort)。DebugPort和ExceptionPort的區(qū)別在于,若向ExceptionPort發(fā)消息,先停止目標(biāo)進(jìn)程所有線(xiàn)程的執(zhí)行,直到收到回應(yīng)消息后線(xiàn)程才恢復(fù)執(zhí)行,而向DebugPort發(fā)消息則不需要停止線(xiàn)程運(yùn)行。還有DebugPort是向會(huì)話(huà)管理器發(fā)消息,而ExceptionPort是向Win32子系統(tǒng)發(fā)消息,當(dāng)向ExceptionPort發(fā)消息時(shí),已經(jīng)不給用戶(hù)態(tài)調(diào)試器任何機(jī)會(huì)了:)。
? ?? ?? ?|
對(duì)這種斷點(diǎn)后進(jìn)程退出的現(xiàn)象,確實(shí)跟hidefromdebugger吻合,于是又做了個(gè)實(shí)驗(yàn),遍歷線(xiàn)程然后將+0x248??hidefromdebugger輸出一看,這個(gè)都是0,疑惑ing
再將這個(gè)偏移都寫(xiě)0,還是沒(méi)效果
跟了下eprocess+debuport沒(méi)有發(fā)現(xiàn)清0代碼,從現(xiàn)象上看,debugport清0的現(xiàn)象也不適用
期間還嘗試過(guò)hook??DbgkForwardException,結(jié)果寫(xiě)一半發(fā)現(xiàn)這函數(shù)有個(gè)屬性(noninline)T-T,
疑惑ing,沒(méi)思路已經(jīng)好幾天,盼各位大牛們指點(diǎn)下方向啊,
轉(zhuǎn)載于:https://blog.51cto.com/laokaddk/203575
總結(jié)
以上是生活随笔為你收集整理的WL 2009 professional【已解决】谢谢nooby跟海风的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 美酒节成就及任务攻略指引
- 下一篇: 11g内存管理新特性的internal表