针对某游戏保护DebugPort清零的一次逆向
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                针对某游戏保护DebugPort清零的一次逆向
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.                        
                                
                            
                            
                            作 者: 悲歌
首先還是先了解一下DebugPort吧,百度之后得到了如下結(jié)果
?-------------------------------此處轉(zhuǎn)貼------------------------------------
每個(gè)進(jìn)程都有一個(gè) 數(shù)據(jù)結(jié)構(gòu) ,EPROCESS,這個(gè)結(jié)構(gòu)是在內(nèi)核里面的,系統(tǒng)用來標(biāo)識(shí)和管理每一個(gè)win進(jìn)程的基本數(shù)據(jù)結(jié)構(gòu).
?
這個(gè)結(jié)構(gòu)中包含了一個(gè)重要的字段,DebugPort,如果一個(gè)進(jìn)程不在被調(diào)試的時(shí)候那么就是NULL,否則他是一個(gè)指針,win前,這個(gè)成員保存的是用于接收調(diào)試事件的LPC端口對(duì)象指針.發(fā)生調(diào)試時(shí),系統(tǒng)會(huì)向這個(gè)端口發(fā)送調(diào)試信息.
?
Winxp下因?yàn)槭褂昧藢iT用于調(diào)試的內(nèi)核對(duì)象DebugObject,所以debugport指向的是一個(gè)DebugObject對(duì)象,不管是指向LPC端口還是指向調(diào)試對(duì)象,雖然類似不同吧~~~
但是他們的作用都是用來傳遞調(diào)試事件的,所以debugport中指向的對(duì)象,我們就叫做調(diào)試端口
?
張奎銀大牛,告訴了我們,這個(gè)端口是鏈接調(diào)試器進(jìn)程和被調(diào)試進(jìn)程的紐帶~
被調(diào)試程序的事件由這個(gè)端口發(fā)送到調(diào)試器進(jìn)程的。??
(so,某些產(chǎn)品,為了不被調(diào)試就一直對(duì)這個(gè)字段寫入0,導(dǎo)致調(diào)試事件無法發(fā)送,造成了調(diào)試器像傻子一樣~~)
-----------------------------------------------------------
?
調(diào)試內(nèi)核,最先想到的肯定是windbg,于是LZ碰到了第一個(gè)問題,那個(gè)T什么的保護(hù)禁止了雙機(jī)調(diào)試。下面給出過掉防止雙機(jī)調(diào)試的方法。
?
KDCOM.dll:KdReceivePacket? //這兩個(gè)是COM串口的接受和發(fā)送數(shù)據(jù)
KDCOM.dll:KdSendPacket????? //主要用來方式別人雙機(jī)調(diào)試
上面兩個(gè)函數(shù)幾乎可以忽略掉,VirtualKD這個(gè)工具自己實(shí)現(xiàn)了COM通信替代了上面兩個(gè)函數(shù)。
?
然后是。。。是。。。
KdDisableDebugger,ok過掉對(duì)這個(gè)函數(shù)的調(diào)用應(yīng)該就可以進(jìn)行雙機(jī)調(diào)試了。
啟動(dòng) 虛擬機(jī) 調(diào)試模式,windbg對(duì)KdDisableDebugger下斷點(diǎn),然后運(yùn)行游戲。
發(fā)現(xiàn)游戲登陸之前windbg就已經(jīng)斷下來了,eb指令對(duì)KdDisableDebugger第一行代碼寫入C3(ret)
?
 
然后F8單步執(zhí)行找到調(diào)用KdDisableDebugger處
?
仔細(xì)看代碼不難發(fā)現(xiàn)這是一段循環(huán)調(diào)用KdDisableDebugger的代碼。eb對(duì)上圖中edcaa6d5出寫入74過掉此處
F5跑起來會(huì)再次斷下來,單步執(zhí)行返回到另一處調(diào)用
?
?
尾部mov???? dword ptr [ecx],eax這句很關(guān)鍵,不能讓他執(zhí)行,一旦執(zhí)行windbg就失去通信了
對(duì)上圖中edcaa803位置寫入75然后F5跑起來? 再次斷下來發(fā)現(xiàn)調(diào)用位置還是上面這里。
修改CALL EAX上面那行也就是edcaa7c4位置寫入75再次跑起來就不會(huì)再斷下來了 游戲正常運(yùn)行。
但是游戲登陸以后,保護(hù)會(huì)出現(xiàn)錯(cuò)誤重新加載一次保護(hù),然后按照上面的方法重新過一次就可以了。
?
接下來就等游戲跑起來以后windbg手動(dòng)斷下來,命令行鍵入!process 0 0回車
得到當(dāng)前所有進(jìn)程的EPROCESS對(duì)象地址
?
注意這里完成后要讓虛擬機(jī)盡快跑起來,中斷久了游戲會(huì)和服務(wù)器斷開連接。
好了會(huì)找到兩個(gè)游戲進(jìn)程,接下來虛擬機(jī)里面打開任務(wù)管理器,查看當(dāng)前游戲的進(jìn)程ID轉(zhuǎn)換16進(jìn)制
?
?
轉(zhuǎn)換后就是上面獲取到的CID:0370 www.2cto.com
然后對(duì)PROCESS 85f5d228 這個(gè)地址+BC處下數(shù)據(jù)寫入斷點(diǎn),+bc就是DebugPort地址了
指令ba w 4[85f5d228 +bc]?? //ba指令格式ba Access Size [地址] Access為訪問方式Size為監(jiān)控訪問位置大小
?
然后跑起來,立馬就會(huì)斷下來,這里注意多跑幾次,有兩個(gè)地方做了清零如下圖
第一處:
?
?
?
第二處:
?
?
?
xor???? ecx,ecx
xchg??? ecx,dword ptr [eax]
?
還有。。。
?
xor???? eax,eax
xchg??? eax,dword ptr [edi]
這兩個(gè)地方。
好了位置找到了,收工。
                        
                        
                        首先還是先了解一下DebugPort吧,百度之后得到了如下結(jié)果
?-------------------------------此處轉(zhuǎn)貼------------------------------------
每個(gè)進(jìn)程都有一個(gè) 數(shù)據(jù)結(jié)構(gòu) ,EPROCESS,這個(gè)結(jié)構(gòu)是在內(nèi)核里面的,系統(tǒng)用來標(biāo)識(shí)和管理每一個(gè)win進(jìn)程的基本數(shù)據(jù)結(jié)構(gòu).
?
這個(gè)結(jié)構(gòu)中包含了一個(gè)重要的字段,DebugPort,如果一個(gè)進(jìn)程不在被調(diào)試的時(shí)候那么就是NULL,否則他是一個(gè)指針,win前,這個(gè)成員保存的是用于接收調(diào)試事件的LPC端口對(duì)象指針.發(fā)生調(diào)試時(shí),系統(tǒng)會(huì)向這個(gè)端口發(fā)送調(diào)試信息.
?
Winxp下因?yàn)槭褂昧藢iT用于調(diào)試的內(nèi)核對(duì)象DebugObject,所以debugport指向的是一個(gè)DebugObject對(duì)象,不管是指向LPC端口還是指向調(diào)試對(duì)象,雖然類似不同吧~~~
但是他們的作用都是用來傳遞調(diào)試事件的,所以debugport中指向的對(duì)象,我們就叫做調(diào)試端口
?
張奎銀大牛,告訴了我們,這個(gè)端口是鏈接調(diào)試器進(jìn)程和被調(diào)試進(jìn)程的紐帶~
被調(diào)試程序的事件由這個(gè)端口發(fā)送到調(diào)試器進(jìn)程的。??
(so,某些產(chǎn)品,為了不被調(diào)試就一直對(duì)這個(gè)字段寫入0,導(dǎo)致調(diào)試事件無法發(fā)送,造成了調(diào)試器像傻子一樣~~)
-----------------------------------------------------------
?
調(diào)試內(nèi)核,最先想到的肯定是windbg,于是LZ碰到了第一個(gè)問題,那個(gè)T什么的保護(hù)禁止了雙機(jī)調(diào)試。下面給出過掉防止雙機(jī)調(diào)試的方法。
?
KDCOM.dll:KdReceivePacket? //這兩個(gè)是COM串口的接受和發(fā)送數(shù)據(jù)
KDCOM.dll:KdSendPacket????? //主要用來方式別人雙機(jī)調(diào)試
上面兩個(gè)函數(shù)幾乎可以忽略掉,VirtualKD這個(gè)工具自己實(shí)現(xiàn)了COM通信替代了上面兩個(gè)函數(shù)。
?
然后是。。。是。。。
KdDisableDebugger,ok過掉對(duì)這個(gè)函數(shù)的調(diào)用應(yīng)該就可以進(jìn)行雙機(jī)調(diào)試了。
啟動(dòng) 虛擬機(jī) 調(diào)試模式,windbg對(duì)KdDisableDebugger下斷點(diǎn),然后運(yùn)行游戲。
發(fā)現(xiàn)游戲登陸之前windbg就已經(jīng)斷下來了,eb指令對(duì)KdDisableDebugger第一行代碼寫入C3(ret)
?
然后F8單步執(zhí)行找到調(diào)用KdDisableDebugger處
?
仔細(xì)看代碼不難發(fā)現(xiàn)這是一段循環(huán)調(diào)用KdDisableDebugger的代碼。eb對(duì)上圖中edcaa6d5出寫入74過掉此處
F5跑起來會(huì)再次斷下來,單步執(zhí)行返回到另一處調(diào)用
?
?
尾部mov???? dword ptr [ecx],eax這句很關(guān)鍵,不能讓他執(zhí)行,一旦執(zhí)行windbg就失去通信了
對(duì)上圖中edcaa803位置寫入75然后F5跑起來? 再次斷下來發(fā)現(xiàn)調(diào)用位置還是上面這里。
修改CALL EAX上面那行也就是edcaa7c4位置寫入75再次跑起來就不會(huì)再斷下來了 游戲正常運(yùn)行。
但是游戲登陸以后,保護(hù)會(huì)出現(xiàn)錯(cuò)誤重新加載一次保護(hù),然后按照上面的方法重新過一次就可以了。
?
接下來就等游戲跑起來以后windbg手動(dòng)斷下來,命令行鍵入!process 0 0回車
得到當(dāng)前所有進(jìn)程的EPROCESS對(duì)象地址
?
注意這里完成后要讓虛擬機(jī)盡快跑起來,中斷久了游戲會(huì)和服務(wù)器斷開連接。
好了會(huì)找到兩個(gè)游戲進(jìn)程,接下來虛擬機(jī)里面打開任務(wù)管理器,查看當(dāng)前游戲的進(jìn)程ID轉(zhuǎn)換16進(jìn)制
?
?
轉(zhuǎn)換后就是上面獲取到的CID:0370 www.2cto.com
然后對(duì)PROCESS 85f5d228 這個(gè)地址+BC處下數(shù)據(jù)寫入斷點(diǎn),+bc就是DebugPort地址了
指令ba w 4[85f5d228 +bc]?? //ba指令格式ba Access Size [地址] Access為訪問方式Size為監(jiān)控訪問位置大小
?
然后跑起來,立馬就會(huì)斷下來,這里注意多跑幾次,有兩個(gè)地方做了清零如下圖
第一處:
?
?
?
第二處:
?
?
?
xor???? ecx,ecx
xchg??? ecx,dword ptr [eax]
?
還有。。。
?
xor???? eax,eax
xchg??? eax,dword ptr [edi]
這兩個(gè)地方。
好了位置找到了,收工。
總結(jié)
以上是生活随笔為你收集整理的针对某游戏保护DebugPort清零的一次逆向的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 用VS2012或VS2013在win7下
- 下一篇: 内核层 inlinehook 隐藏进程
