来自看雪的手把手调试DebugPort清零
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                来自看雪的手把手调试DebugPort清零
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                
                            
                            
                            現在多數程序為了防止調試。基本上都用到了驅動HOOK?內核API。
至于繞過那些HOOK,基本上大家應該已經是沒有什么問題了。
 
估計像我這樣的菜鳥也不算多了。研究DebugPort?清0,倒是難倒了我。。。
 
所謂DebugPort?清0,就是向?EPROCESS->DebugPort??不停寫入?NULL(0)值。。讓調試器無法收到調試信息。。。
 
現在能找到的資料也不算多。。。也許是因為解決方法一旦公布出來,從而導致程序升級。
 
就現在能找到的資料來談談;
 
1:通過修改調試相關函數,修改DebugPort端口,指向EPROCESS結構中的其它成員,大多數驅動已經有監視了。
 
2:NOP掉程序驅動中清0函數和監視函數,需要分析程序驅動。
 
3:修改EThread->Process?指向自定義結構,程序驅動如果也是這樣訪問的DebugPort此方法都無效了。
 
4:HOOK?缺頁異常然后把eprocess弄成invalid然后自己處理,此方法本菜鳥沒試過,因為本菜鳥還不知如果HOOK?缺頁異常,能找到的資料甚少。也希望有大牛們能指點一二。
 
5:用WRK自己編譯內核ntoskrnl.exe,改造EPROCESS結構。。。此法只能用于?XP64和2003SP1.
 
暫時本菜只了解到這些方法,本菜才疏學淺,至今自己也沒想出別的解決思路。。。
 
下面說下本菜用第一種方法在?WIN7下的研究。。
 
因為網上資料大多數為XP系統的。所以自己分析了一下WIN7?調試相關函數。
 
本菜用的雙機調試,至于如何雙機調試網上資料很多。就不在贅訴。
 
打開虛擬機,打開一個程序。如?LoadSys.exe
 
之后本機打開Windbg通過串行端口連接虛擬機。
 
lkd->!process?0?0?LoadSys.exe
 
得到LoadSys.exe?的EPROCESS地址如。0x87654321
 
lkd->ba?r4?0x87654321+0xec?(WIN7上DebugPort?偏移為?0xec,可以通過lkd->dt?nt!_eprocess,查看。)
 
上一句下了訪問斷點。。之后進入虛擬機,打開一個OD。附加LoadSys.exe..這時虛擬機就會斷下來。我們來看看調用了哪些函數。。
 
代碼: 讀: nt!DbgkCreateThread+0x22a: 856ab86a?399eec000000????cmp?????dword?ptr?[esi+0ECh],ebx nt!PsGetProcessDebugPort+0x8: 85514130?8b80ec000000????mov?????eax,dword?ptr?[eax+0ECh] nt!DbgkpSetProcessDebugObject+0x8d: 856f7959?83beec00000000??cmp?????dword?ptr?[esi+0ECh],0 nt!DbgkpSetProcessDebugObject+0x9d: 856f7969?89beec000000????mov?????dword?ptr?[esi+0ECh],edi nt!DbgkpMarkProcessPeb+0x85: 856f6e90?3987ec000000????cmp?????dword?ptr?[edi+0ECh],eax nt!DbgkpQueueMessage+0xad: 856f74a7?8b80ec000000????mov?????eax,dword?ptr?[eax+0ECh] nt!KiDispatchException+0x1d8: 8550539f?39b0ec000000????cmp?????dword?ptr?[eax+0ECh],esi nt!DbgkForwardException+0x49: 8565deac?8b98ec000000????mov?????ebx,dword?ptr?[eax+0ECh] nt!PspExitThread+0x2ad: 8569094c?83bfec00000000??cmp?????dword?ptr?[edi+0ECh],0 nt!DbgkExitThread+0x28: 856f8cf1?83b9ec00000000??cmp?????dword?ptr?[ecx+0ECh],0 nt!PspTerminateAllThreads+0x1dd: 856a7ff4?83bfec00000000??cmp?????dword?ptr?[edi+0ECh],0 nt!DbgkExitProcess+0x28: 856f8d63?83b9ec00000000??cmp?????dword?ptr?[ecx+0ECh],0 nt!DbgkpCloseObject+0xd6: 856f707f?3998ec000000????cmp?????dword?ptr?[eax+0ECh],ebx nt!DbgkpCloseObject+0x119: 856f70c2?3998ec000000????cmp?????dword?ptr?[eax+0ECh],ebx nt!DbgkpCloseObject+0x121: 856f70ca?83a0ec00000000??and?????dword?ptr?[eax+0ECh],0 以上為讀斷點部分。。
 
記下函數+偏移,進入虛擬機,退出OD和LoadSys.exe...
 
重新打開LoadSys.exe
之后回到Windbg
lkd->!process?0?0?LoadSys.exe
重新獲得?LoadSys.exe?的EPROCESS地址,如:0x88776655
 
lkd->ba?w4?0x88776655+0xec
給LoadSys.exe的DebugPort下寫入斷點
 
再進入虛擬機,開OD,附加LoadSys.exe..之后就會斷下。。。
 
代碼: 寫: nt!DbgkpSetProcessDebugObject+0xa3???//和讀其中一個重復 nt!DbgkClearProcessDebugObject+0x41: 856d3e84?05ec000000??????add?????eax,0ECh nt!DbgkpCloseObject+0x128????????????和讀其中一個重復 至此我們就找到了WIN7下?調試寫入DebugPort的內核相關函數。
 
剩下的事情,我們只需要編寫驅動將每個函數偏移下的??ec??改寫成?其它EPROCESS中成員?偏移。。。如WIN7下的??CREATE_TIME成員?為?a0。。。EXIT_TIME成員為a8...
 
 
改寫完后。。。用OD隨便附加一個程序。查看其EPROCESS中?你改寫的那個偏移,如我改寫的是a0。。a0中就存有一個???對象句柄??。。就證明改寫成功。。。
 
然后打開有保護驅動的XX程序。。。用OD附加。OD創建線程完后。加載DLL的時候。。直接藍屏。。。
 
代碼: a5f3334e?894dfc??????????mov?????dword?ptr?[ebp-4],ecx a5f33351?eb27????????????jmp?????EagleNT+0xa37a?(a5f3337a) a5f33353?833d5833f4a506??cmp?????dword?ptr?[EagleNT+0x1a358?(a5f43358)],6 a5f3335a?7517????????????jne?????EagleNT+0xa373?(a5f33373) a5f3335c?833d5c33f4a501??cmp?????dword?ptr?[EagleNT+0x1a35c?(a5f4335c)],1 a5f33363?750e????????????jne?????EagleNT+0xa373?(a5f33373) a5f33365?8b5508??????????mov?????edx,dword?ptr?[ebp+8] a5f33368?81c22c020000????add?????edx,22Ch a5f3336e?8955fc??????????mov?????dword?ptr?[ebp-4],edx a5f33371?eb07????????????jmp?????EagleNT+0xa37a?(a5f3337a) a5f33373?c745fc00000000??mov?????dword?ptr?[ebp-4],0 a5f3337a?837dfc00????????cmp?????dword?ptr?[ebp-4],0 a5f3337e?7415????????????je??????EagleNT+0xa395?(a5f33395) a5f33380?6a10????????????push????10h a5f33382?8b45fc??????????mov?????eax,dword?ptr?[ebp-4]?a5f33385?8b08????????????mov?????ecx,dword?ptr?[eax]??ds:0023:0000022a=????????????a5f33387?51??????????????push????ecx a5f33388?6820bdf4a5??????push????offset?EagleNT+0x22d20?(a5f4bd20) a5f3338d?e89ea1ffff??????call????EagleNT+0x4530?(a5f2d530) a5f33392?8845fb??????????mov?????byte?ptr?[ebp-5],al a5f33395?8a45fb??????????mov?????al,byte?ptr?[ebp-5] a5f33398?8be5????????????mov?????esp,ebp a5f3339a?5d??????????????pop?????ebp a5f3339b?c20400??????????ret?????4 分析DUMP文件藍在這句。。。應該是游戲有檢測。。。
a5f33385?8b08????????????mov?????ecx,dword?ptr?[eax]??ds:0023:0000022a=????????
 
于是HOOK?程序驅動跳過這里。。。
仍然藍屏,分析DUMP文件藍在
?ntkrnlpa.exe?(?nt+2af571?)
代碼: 856c054a?33ff????????????xor?????edi,edi 856c054c?894b1c??????????mov?????dword?ptr?[ebx+1Ch],ecx 856c054f?3bc7????????????cmp?????eax,edi 856c0551?750d????????????jne?????nt+0x2af560?(856c0560) 856c0553?c7442414530300c0?mov?????dword?ptr?[esp+14h],0C0000353h 856c055b?e9ad000000??????jmp?????nt+0x2af60d?(856c060d) 856c0560?b101????????????mov?????cl,1 856c0562?8d7010??????????lea?????esi,[eax+10h] 856c0565?ff155c214185????call????dword?ptr?[nt+0x115c?(8541215c)] 856c056b?88442413????????mov?????byte?ptr?[esp+13h],al 856c056f?8bc6????????????mov?????eax,esi?856c0571?f00fba3000??????lock?btr?dword?ptr?[eax],0???ds:0023:4d5d748c=?????????856c0576?7205????????????jb??????nt+0x2af57d?(856c057d) 856c0578?e886c7d7ff??????call????nt+0x2bd03?(8543cd03) 856c057d?64a124010000????mov?????eax,dword?ptr?fs:[00000124h] 856c0583?8b542414????????mov?????edx,dword?ptr?[esp+14h] 856c0587?894604??????????mov?????dword?ptr?[esi+4],eax 856c058a?0fb6442413??????movzx???eax,byte?ptr?[esp+13h] 856c058f?89461c??????????mov?????dword?ptr?[esi+1Ch],eax 856c0592?f6423801????????test????byte?ptr?[edx+38h],1 藍在這里
856c0571?f00fba3000??????lock?btr?dword?ptr?[eax],0???ds:0023:4d5d748c=????????
 
 
由于本菜才疏學淺,于是本菜到此不知道如何再分析下去。。。
希望有大牛們,指點一二。。除上述5種方法以外,還有哪些方法能夠繞過DebugPort?清0.
再就是?本菜的分析如何才能繼續。。。。
 
只要思路,方法。。。不要代碼結果。。。本菜雖菜,但會以學習為目的提升自身能力,不愿直接拿到那代碼而不明其中原理。。。
 
轉自看雪的一位牛人。在這里對那位牛人表示敬佩
                        
                        
                        至于繞過那些HOOK,基本上大家應該已經是沒有什么問題了。
估計像我這樣的菜鳥也不算多了。研究DebugPort?清0,倒是難倒了我。。。
所謂DebugPort?清0,就是向?EPROCESS->DebugPort??不停寫入?NULL(0)值。。讓調試器無法收到調試信息。。。
現在能找到的資料也不算多。。。也許是因為解決方法一旦公布出來,從而導致程序升級。
就現在能找到的資料來談談;
1:通過修改調試相關函數,修改DebugPort端口,指向EPROCESS結構中的其它成員,大多數驅動已經有監視了。
2:NOP掉程序驅動中清0函數和監視函數,需要分析程序驅動。
3:修改EThread->Process?指向自定義結構,程序驅動如果也是這樣訪問的DebugPort此方法都無效了。
4:HOOK?缺頁異常然后把eprocess弄成invalid然后自己處理,此方法本菜鳥沒試過,因為本菜鳥還不知如果HOOK?缺頁異常,能找到的資料甚少。也希望有大牛們能指點一二。
5:用WRK自己編譯內核ntoskrnl.exe,改造EPROCESS結構。。。此法只能用于?XP64和2003SP1.
暫時本菜只了解到這些方法,本菜才疏學淺,至今自己也沒想出別的解決思路。。。
下面說下本菜用第一種方法在?WIN7下的研究。。
因為網上資料大多數為XP系統的。所以自己分析了一下WIN7?調試相關函數。
本菜用的雙機調試,至于如何雙機調試網上資料很多。就不在贅訴。
打開虛擬機,打開一個程序。如?LoadSys.exe
之后本機打開Windbg通過串行端口連接虛擬機。
lkd->!process?0?0?LoadSys.exe
得到LoadSys.exe?的EPROCESS地址如。0x87654321
lkd->ba?r4?0x87654321+0xec?(WIN7上DebugPort?偏移為?0xec,可以通過lkd->dt?nt!_eprocess,查看。)
上一句下了訪問斷點。。之后進入虛擬機,打開一個OD。附加LoadSys.exe..這時虛擬機就會斷下來。我們來看看調用了哪些函數。。
代碼: 讀: nt!DbgkCreateThread+0x22a: 856ab86a?399eec000000????cmp?????dword?ptr?[esi+0ECh],ebx nt!PsGetProcessDebugPort+0x8: 85514130?8b80ec000000????mov?????eax,dword?ptr?[eax+0ECh] nt!DbgkpSetProcessDebugObject+0x8d: 856f7959?83beec00000000??cmp?????dword?ptr?[esi+0ECh],0 nt!DbgkpSetProcessDebugObject+0x9d: 856f7969?89beec000000????mov?????dword?ptr?[esi+0ECh],edi nt!DbgkpMarkProcessPeb+0x85: 856f6e90?3987ec000000????cmp?????dword?ptr?[edi+0ECh],eax nt!DbgkpQueueMessage+0xad: 856f74a7?8b80ec000000????mov?????eax,dword?ptr?[eax+0ECh] nt!KiDispatchException+0x1d8: 8550539f?39b0ec000000????cmp?????dword?ptr?[eax+0ECh],esi nt!DbgkForwardException+0x49: 8565deac?8b98ec000000????mov?????ebx,dword?ptr?[eax+0ECh] nt!PspExitThread+0x2ad: 8569094c?83bfec00000000??cmp?????dword?ptr?[edi+0ECh],0 nt!DbgkExitThread+0x28: 856f8cf1?83b9ec00000000??cmp?????dword?ptr?[ecx+0ECh],0 nt!PspTerminateAllThreads+0x1dd: 856a7ff4?83bfec00000000??cmp?????dword?ptr?[edi+0ECh],0 nt!DbgkExitProcess+0x28: 856f8d63?83b9ec00000000??cmp?????dword?ptr?[ecx+0ECh],0 nt!DbgkpCloseObject+0xd6: 856f707f?3998ec000000????cmp?????dword?ptr?[eax+0ECh],ebx nt!DbgkpCloseObject+0x119: 856f70c2?3998ec000000????cmp?????dword?ptr?[eax+0ECh],ebx nt!DbgkpCloseObject+0x121: 856f70ca?83a0ec00000000??and?????dword?ptr?[eax+0ECh],0 以上為讀斷點部分。。
記下函數+偏移,進入虛擬機,退出OD和LoadSys.exe...
重新打開LoadSys.exe
之后回到Windbg
lkd->!process?0?0?LoadSys.exe
重新獲得?LoadSys.exe?的EPROCESS地址,如:0x88776655
lkd->ba?w4?0x88776655+0xec
給LoadSys.exe的DebugPort下寫入斷點
再進入虛擬機,開OD,附加LoadSys.exe..之后就會斷下。。。
代碼: 寫: nt!DbgkpSetProcessDebugObject+0xa3???//和讀其中一個重復 nt!DbgkClearProcessDebugObject+0x41: 856d3e84?05ec000000??????add?????eax,0ECh nt!DbgkpCloseObject+0x128????????????和讀其中一個重復 至此我們就找到了WIN7下?調試寫入DebugPort的內核相關函數。
剩下的事情,我們只需要編寫驅動將每個函數偏移下的??ec??改寫成?其它EPROCESS中成員?偏移。。。如WIN7下的??CREATE_TIME成員?為?a0。。。EXIT_TIME成員為a8...
改寫完后。。。用OD隨便附加一個程序。查看其EPROCESS中?你改寫的那個偏移,如我改寫的是a0。。a0中就存有一個???對象句柄??。。就證明改寫成功。。。
然后打開有保護驅動的XX程序。。。用OD附加。OD創建線程完后。加載DLL的時候。。直接藍屏。。。
代碼: a5f3334e?894dfc??????????mov?????dword?ptr?[ebp-4],ecx a5f33351?eb27????????????jmp?????EagleNT+0xa37a?(a5f3337a) a5f33353?833d5833f4a506??cmp?????dword?ptr?[EagleNT+0x1a358?(a5f43358)],6 a5f3335a?7517????????????jne?????EagleNT+0xa373?(a5f33373) a5f3335c?833d5c33f4a501??cmp?????dword?ptr?[EagleNT+0x1a35c?(a5f4335c)],1 a5f33363?750e????????????jne?????EagleNT+0xa373?(a5f33373) a5f33365?8b5508??????????mov?????edx,dword?ptr?[ebp+8] a5f33368?81c22c020000????add?????edx,22Ch a5f3336e?8955fc??????????mov?????dword?ptr?[ebp-4],edx a5f33371?eb07????????????jmp?????EagleNT+0xa37a?(a5f3337a) a5f33373?c745fc00000000??mov?????dword?ptr?[ebp-4],0 a5f3337a?837dfc00????????cmp?????dword?ptr?[ebp-4],0 a5f3337e?7415????????????je??????EagleNT+0xa395?(a5f33395) a5f33380?6a10????????????push????10h a5f33382?8b45fc??????????mov?????eax,dword?ptr?[ebp-4]?a5f33385?8b08????????????mov?????ecx,dword?ptr?[eax]??ds:0023:0000022a=????????????a5f33387?51??????????????push????ecx a5f33388?6820bdf4a5??????push????offset?EagleNT+0x22d20?(a5f4bd20) a5f3338d?e89ea1ffff??????call????EagleNT+0x4530?(a5f2d530) a5f33392?8845fb??????????mov?????byte?ptr?[ebp-5],al a5f33395?8a45fb??????????mov?????al,byte?ptr?[ebp-5] a5f33398?8be5????????????mov?????esp,ebp a5f3339a?5d??????????????pop?????ebp a5f3339b?c20400??????????ret?????4 分析DUMP文件藍在這句。。。應該是游戲有檢測。。。
a5f33385?8b08????????????mov?????ecx,dword?ptr?[eax]??ds:0023:0000022a=????????
于是HOOK?程序驅動跳過這里。。。
仍然藍屏,分析DUMP文件藍在
?ntkrnlpa.exe?(?nt+2af571?)
代碼: 856c054a?33ff????????????xor?????edi,edi 856c054c?894b1c??????????mov?????dword?ptr?[ebx+1Ch],ecx 856c054f?3bc7????????????cmp?????eax,edi 856c0551?750d????????????jne?????nt+0x2af560?(856c0560) 856c0553?c7442414530300c0?mov?????dword?ptr?[esp+14h],0C0000353h 856c055b?e9ad000000??????jmp?????nt+0x2af60d?(856c060d) 856c0560?b101????????????mov?????cl,1 856c0562?8d7010??????????lea?????esi,[eax+10h] 856c0565?ff155c214185????call????dword?ptr?[nt+0x115c?(8541215c)] 856c056b?88442413????????mov?????byte?ptr?[esp+13h],al 856c056f?8bc6????????????mov?????eax,esi?856c0571?f00fba3000??????lock?btr?dword?ptr?[eax],0???ds:0023:4d5d748c=?????????856c0576?7205????????????jb??????nt+0x2af57d?(856c057d) 856c0578?e886c7d7ff??????call????nt+0x2bd03?(8543cd03) 856c057d?64a124010000????mov?????eax,dword?ptr?fs:[00000124h] 856c0583?8b542414????????mov?????edx,dword?ptr?[esp+14h] 856c0587?894604??????????mov?????dword?ptr?[esi+4],eax 856c058a?0fb6442413??????movzx???eax,byte?ptr?[esp+13h] 856c058f?89461c??????????mov?????dword?ptr?[esi+1Ch],eax 856c0592?f6423801????????test????byte?ptr?[edx+38h],1 藍在這里
856c0571?f00fba3000??????lock?btr?dword?ptr?[eax],0???ds:0023:4d5d748c=????????
由于本菜才疏學淺,于是本菜到此不知道如何再分析下去。。。
希望有大牛們,指點一二。。除上述5種方法以外,還有哪些方法能夠繞過DebugPort?清0.
再就是?本菜的分析如何才能繼續。。。。
只要思路,方法。。。不要代碼結果。。。本菜雖菜,但會以學習為目的提升自身能力,不愿直接拿到那代碼而不明其中原理。。。
轉自看雪的一位牛人。在這里對那位牛人表示敬佩
總結
以上是生活随笔為你收集整理的来自看雪的手把手调试DebugPort清零的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 网上一个仿TP挂钩内核的源码
- 下一篇: 用SSDT方法恢复冒险岛的部分函数
