天天看點

破解XXX遊戲驅動保護過程總結

剛剛接觸軟體破解還有驅動編寫,好多東西都不熟,折騰了好久,把中間可能對大家有價值的過程記錄下來。 

剛開始碰到的問題就是不能核心調試,因為要寫驅動,需要用到。一般禁用核心調試都是在驅動裡調用KdDisableDebugger,往上回溯一個函數,基本上就是驅動檢測禁用是否成功的代碼,否則就是一個循環不停的調用KdDisableDebugger函數。 

我的做法是修改KdDisableDebugger代碼,這樣不管什麼時候被調用到,核心調試都不能被禁用,無非就是驅動那個死循環會導緻機器卡死罷了,在KdDisableDebugger上設定一個斷點,中斷後,就把KdDisableDebugger和驅動的代碼都改掉,然後禁用斷點,繼續核心的執行。我用的是下面這個指令做這段話說的事情: 

bp KdDisableDebugger"eb nt!KdDisableDebugger+26 75;eb nt!KdDisableDebugger+41 75;ebTesSafe+5069 74;eb TesSafe+2703 75;bd 0;g" 

然後就是把驅動裡hook的函數恢複,為了找到核心ssdt表裡被hook的函數,看了網上的資料,有工具可以做這個事情,一是那些工具我都沒有用過,不大會用,二是我想把核心裡具體被inline hook的位址找出來,是以我就用了下面這個windbg腳本做這個事情,運作腳本之前需要記下eax, ebx, ecx的值,等腳本運作完成以後恢複。當然也可以用windbg裡的僞寄存器,但是文法還有點不熟,就直接用現成的寄存器了,在啟動遊戲之前,先dump一下: 

.logopen c:\logs\beforehook.txt  # 因為dump出來的東西比較多,就放到一個log裡 

r ebx = 0                        # 計數器 

# 周遊ssdt表,把裡面每個函數的彙編代碼都dump出來,因為不知道每個函數的大小,是以每個函數都dump 1000行。 

r ecx=poi(nt!KeServiceDescriptorTable) 

.for (r eax=ecx;@eax < ecx+0x474; reax=eax+4; rebx=ebx+1) { r ebx; u poi(@eax) L1000}  

# 儲存log 

.logclose 

接下來,遊戲啟動之後,再dump一次,用kdiff3做個對比就知道哪些函數被修改過了。 

看到被hook的函數以後,加上網上的資料,主要是參考看雪裡的這篇資料: 

但是悲劇的是,有的時候修改了TX的代碼,機器直接就重新開機了,參考看雪裡另外一篇文章,把重新開機這個問題也解決了: 

很多都是大俠們已經研究了很透的東西,隻是我比較愚笨,花了很多時間才搞明白整個過程,完整驅動的代碼可以在我這個求助帖裡找到: 

本文轉自 donjuan 部落格園部落格,原文連結:http://www.cnblogs.com/killmyday/archive/2011/07/23/2115118.html   ,如需轉載請自行聯系原作者

繼續閱讀