剛剛接觸軟體破解還有驅動編寫,好多東西都不熟,折騰了好久,把中間可能對大家有價值的過程記錄下來。
剛開始碰到的問題就是不能核心調試,因為要寫驅動,需要用到。一般禁用核心調試都是在驅動裡調用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 ,如需轉載請自行聯系原作者