繞過驅動保護經典例子

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




剛開始碰到的問題就是不能內核調試,因爲要寫驅動,需要用到。一般禁用內核調試都是在驅動裏調用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的函數以後,加上網上的資料,主要是參考看雪裏的這篇資料:
http://bbs.pediy.com/showthread.php?t=126802



但是悲劇的是,有的時候修改了TX的代碼,機器直接就重啓了,參考看雪裏另外一篇文章,把重啓這個問題也解決了:
http://bbs.pediy.com/showthread.php?t=129810&highlight=DNF



很多都是大俠們已經研究了很透的東西,只是我比較愚笨,花了很多時間才搞明白整個過程,完整驅動的代碼可以在我這個求助帖裏找到:
http://www.ghoffice.com/bbs/read-htm-tid-91059.html
發佈了14 篇原創文章 · 獲贊 8 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章