# 戳戳HackShield Ring0反調試

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2015-10-13T02:54:00Z
Canonical: https://wepostx.com/topics/1103

> 乌云历史资料归档
>
> **原始作者：** 腿骨
> **原始编号：** superkieran-wooyundrops:820
> **原始发布时间：** 2015-10-13 10:54
> **声明：内容仅用于技术研究和个人使用，版权归 wooyun.org。**

---

Author: 蔡耀德

# 0x00 前言

之前玩遊戲，玩累了想說用Cheat Engine來搞搞遊戲，果然被檢測了，上網找了一下他anti debugger的方式是從Ring0來的，但是大多數都只剩下解法沒有實作，只好自己做做看了

# 0x01 前置準備

- 可以跑TMD殼的VM
[http://forum.gamer.com.tw/Co.php?bsn=07650&sn=4416070](http://forum.gamer.com.tw/Co.php?bsn=07650&sn=4416070)

- 雙機調試
HS本身有對內核調試器檢測所以這邊直接用HideKd解決
[http://blog.dbgtech.net/blog/?p=93](http://blog.dbgtech.net/blog/?p=93)

- 開發平台
直接用WDK解決,內含會用到的windbg
[https://msdn.microsoft.com/zh-tw/windows/hardware/gg454513.aspx](https://msdn.microsoft.com/zh-tw/windows/hardware/gg454513.aspx)

# 0x02 測試遊戲保護

HS啟動後的效果:

![原文图片](/media/2016/06/c7207bd7812480bdb44599b8bff3ccd5)

開著SOD的OD找不到遊戲
再來是寫外掛常用的CE
開内核模式會直接被偵測到
如果不開 直接鎖定的話的話會跳錯誤

![原文图片](/media/2016/06/258d5e4c52b45ca85bfecde6d1f78856)

![原文图片](/media/2016/06/2422b6955f74cdac6ef7053490816bcd)

到以上基本上可以確定常用的工具都不能用了
只好來處理HS了!

# 0x03 分析遊戲保護

![原文图片](/media/2016/06/d9fcea742930ca78082e8b8465591ed1)

遊戲丟進OD，入口點看是TMD殼，放棄
直接啟動遊戲後等HackShield加載
拿PcHunter看看
SSDT表

![原文图片](/media/2016/06/c2fb0a13df667ba4f644e180b42e9c8a)

ShadowSSDT表

![原文图片](/media/2016/06/6a39348b0ba4cd77e77346e5660e6ba1)

![原文图片](/media/2016/06/b643acde8b8c612928d83ad147fdbb8e)

上面三張圖可以看到，HackShield在Ring0的地方加載了他的驅動hook了很多debugger會用到的函數，以及一些未導出的函數
先補提一下windows大概的函數調用過程

![原文图片](/media/2016/06/c38422db072bacdcb1c14919b30caf99)

在SSDT表裡面的函數最後都會透過SSDT表轉發到該函數地址執行
所以HackShield就在該函數的R0部分裝上了鉤子
執行過程就變成這樣

![原文图片](/media/2016/06/c6cb7a2a751084c3b6f17073f009dcf1)

在調用該函數的時候順便調用了反外掛的檢測
//這邊就當大家都已經會雙機調試而且已經處理好了
HS加載以前的

![原文图片](/media/2016/06/d169bae298b25524fa23aad396619e93)

讓HS啟動以後…..

![原文图片](/media/2016/06/323f0d302f511d56dfd3264eb52e82f0)

跟進去剛剛的地址看看

![原文图片](/media/2016/06/c55bca4bd33ee59260cfcc6c63f8a076)

可以看到他先被jmp到HS的處理函數裡面了
其他函數也都大同小異
到這邊分析完成

# 0x04 處理遊戲保護

//這邊就當大家都已經會寫跟編譯driver了
PCHunter工具有直接恢復的功能,但直接恢復過不久他就會把鉤子寫回去!
所以這裡用其他的處理方式
以下用nt!ntWriteVirtualMemory示範

![原文图片](/media/2016/06/1450b110f1432e7c67d4d900c178edc9)

由於不能直接恢復鉤子,而且HS本身會定期調用自身檢測鉤子在不在
所以在他前幾個byte寫入自己的鉤子

![原文图片](/media/2016/06/a3c17e2c5154c429c653162b9c2d383b)

至於怎麼判斷….(win7_32位元作業系統)

![原文图片](/media/2016/06/89b112d060cebe753bc73312cf2138ab)

把所有函數處理掉以後就差不多了!

# 0x05 成果

可以使用OD跟CE了! Enjoy it!

![原文图片](/media/2016/06/63f6a6a012cdd7da34b5dd035ca90c3b)

![原文图片](/media/2016/06/db7ef4e829247b35e5f11d5faaa3f4e3)

# 0x06 番外篇

後來發現他檢測鉤子是否被修改的方法其實只是定期調用自己個函數,如果有定期調用的話他並不會去把它的鉤子寫回去
所以只要定期去執行HS hook的內容,就可以直接bypass掉hs對鉤子是否被改寫的檢測了!這應該算是HS小小的一個0day吧!

## Replies
