日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

过 DNF TP 驱动保护(一)

發(fā)布時(shí)間:2024/4/11 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 过 DNF TP 驱动保护(一) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄:

?????????????????

01. 博文簡(jiǎn)介:

02. 環(huán)境及工具準(zhǔn)備:

03. 分析 TP 所做的保護(hù):

04. 干掉 NtOpenProcess 中的 Deep InLine Hook:

05. 干掉 NtOpenThread 中的 Deep InLine Hook:

06. 干掉 NtReadVirtualMemory 中的 InLine Hook:

07. 干掉 NtWriteVirtualMemory 中的 InLine Hook:

08. 干掉 KiAttachProcess 的 InLine Hook:

09. 干掉 NtGetContextThread 中的 InLine Hook:

10. 干掉 NtSetContextThread 中的 InLine Hook:

11. 干掉 DbgkpQueueMessage 中的 InLine Hook:

12. 干掉 DbgkpSetProcessDebugObject 中的 InLine Hook:

13. 干掉 Debug 清零:

????????????????????????????????????????????

????????????????????????????????????????????

共四篇,本篇為第一篇。

????????????????????????????????????????????

????????????????????????????????????????????

01. 博文簡(jiǎn)介:

?????????????????????????

?

?

?

?

?

本篇博文僅僅是我對(duì)過 TP 保護(hù)所作的一個(gè)總結(jié),里面沒有啥高深的技術(shù),

僅僅是 Hook 而已,并且只有些 InLine Hook 和 SSDT Hook 的代碼,

這些對(duì)大牛而言都是小菜一碟,所以大牛們可以直接飄過咯 ^_^

然后就是關(guān)于本篇博文,估計(jì)會(huì)比較長(zhǎng),所以我會(huì)按照上面的目錄分出來一,二,三,四篇相繼發(fā)表。

?????????????????

我先來裝回逼科普下 TP 吧,直接從百度百科抄襲點(diǎn)過來:

TP 系統(tǒng)全稱 TenProtect,是由騰訊自主研發(fā)推出的安全系統(tǒng),可以有效保護(hù)游戲不受外掛侵犯,同時(shí)具備反木馬盜號(hào)功能,

能有效的防止用戶游戲帳號(hào)和虛擬財(cái)產(chǎn)被竊取。騰訊 TP 系統(tǒng)主要作用為外掛檢測(cè)、反盜號(hào)、反非法工作室、防非法消息。

?????????????????

具體功能如下:

反注入:TP系統(tǒng)能有效的阻止非法模塊對(duì)游戲進(jìn)行注入;

反加速:TP系統(tǒng)能防止游戲客戶端的非法加速功能;

反模擬按鍵:TP系統(tǒng)能有效阻止模擬按鍵程序;

反脫機(jī): TP系統(tǒng)能針對(duì)非正常登錄游戲的行為進(jìn)行檢測(cè);

反調(diào)試: TP系統(tǒng)采用內(nèi)核級(jí)反調(diào)試技術(shù),保護(hù)游戲進(jìn)程不被調(diào)試和分析;

反木馬: TP系統(tǒng)可以保護(hù)玩家?guī)ぬ?hào)不被木馬程序竊取;

檢測(cè)外掛功能:TP系統(tǒng)能對(duì)外掛功能進(jìn)行檢測(cè);

指令混淆: TP系統(tǒng)能對(duì)正常指令進(jìn)行虛擬和變形,加大外掛作者逆向難度;

特征匹配: TP系統(tǒng)采用特征碼匹配技術(shù),能準(zhǔn)確檢測(cè)到外掛的使用;

文件校驗(yàn):TP系統(tǒng)可以準(zhǔn)確檢測(cè)游戲目錄下的文件是否被第三方程序篡改;

游戲內(nèi)存數(shù)據(jù)校驗(yàn): TP系統(tǒng)所特有技術(shù)手段可以準(zhǔn)確感知到游戲關(guān)鍵數(shù)據(jù)的異常;

游戲進(jìn)程保護(hù): TP系統(tǒng)可以保護(hù)游戲進(jìn)程不被第三方程序讀寫;

游戲虛擬財(cái)產(chǎn)保護(hù): 在玩家因不當(dāng)操作引起帳號(hào)泄漏情況下,TP系統(tǒng)也可以保護(hù)玩家?guī)ぬ?hào)內(nèi)虛擬財(cái)產(chǎn)不被不法份子轉(zhuǎn)移;

?????????????????

我?guī)讉€(gè)日子弄了過 TP 的驅(qū)動(dòng)保護(hù),算下來前前后后也弄了半來個(gè)月,

雖然比較累,但還是收獲了蠻多東西,這篇博文就是將如何過掉 TP 做的一個(gè)總結(jié)而已,

在這篇文章中我會(huì)一一介紹過掉 TP 所 Hook 的各種 API 的思路,并附上簡(jiǎn)要的代碼,

在過 TP 驅(qū)動(dòng)保護(hù)的過程中以及一些思路和一些代碼也很大程度上都是來自國(guó)內(nèi)的幾大論壇,

主要是看雪,一蓑煙雨,DebugMan 等論壇,這里對(duì)我所借鑒的那些哥們說 Many Thanks。

同時(shí)也得特別感謝劉總,很多地方若沒有劉總的指導(dǎo),則還指不定何時(shí)能夠弄出來呢。

?????????????????

值得一提的是,我現(xiàn)在所做的過 TP 驅(qū)動(dòng)保護(hù)只支持 32 位 XP,在所有的 32 位 XP 上都可以正常運(yùn)行,

不過 Win7 的話還不行,因?yàn)槔锩嬗玫搅怂阉魈卣鞔a來定位未導(dǎo)出 API,而我只針對(duì) XP 做了處理。

?????????????????

免責(zé)聲明:

此文僅作為技術(shù)交流,有心之人切記不要拿來做壞事,尤其是不要拿來做傷天害理,或者傷害企鵝利益的事情,

對(duì)于那些有心要做壞事的,則所有后果或者反正是壞的方面的責(zé)任都與我無關(guān),

如果此文傷害了某些公司的利益或者之類的,請(qǐng)站內(nèi)消息或者留言聯(lián)系我,本人看到后會(huì)第一時(shí)間關(guān)閉此文。

????????????????????????????????

????????????????????????????????

02. 環(huán)境及工具準(zhǔn)備:

????????????????????????????????

前面也提過了,此次過 TP 的驅(qū)動(dòng)保護(hù)僅僅只適用于 XP 系統(tǒng),所以,首先你得準(zhǔn)備個(gè)虛擬機(jī),

然后裝個(gè) XP 的系統(tǒng),至于是 XP SP2 還是 XP SPxxx 就隨便了,當(dāng)然,如果你喜歡 BSOD 的話,

也完全可以裝個(gè)其他的系統(tǒng),然后的話,就得準(zhǔn)備幾個(gè)專業(yè)工具了,首先一個(gè)當(dāng)然是 Xuetr 了,

不過 TP 能夠檢測(cè)出 Xuetr,所以 Xuetr 在 XP 機(jī)器上和 TP 同時(shí)運(yùn)行時(shí),

輕則導(dǎo)致 TP 彈出警告框,重則藍(lán)屏,這個(gè)看個(gè)人運(yùn)氣了。

然后還有一個(gè)工具也很重量級(jí),也是 Rootkit 檢測(cè)工具,叫做 Kernel Detective,

并且更重要的是 TP 和 Kernel Detective 是可以并存的,不會(huì)像 Xuetr 那樣會(huì)被 TP 檢測(cè)出來,

不過 Kernel Detective 想比與 Xuetr 來說,Xuetr 能夠掃描內(nèi)核的 InLine Hook,這個(gè)很強(qiáng)大,

這兩個(gè)工具都很重要,其次就是 WinDbg 和 OD 以及 CE 了。

至于 WinDbg 的話自然是用來調(diào)試 Windows 內(nèi)核或者調(diào)試驅(qū)動(dòng)程序了,

而 OD 和 CE 的話可以用來測(cè)試咱所寫的驅(qū)動(dòng)是否真正的有效果,也就是測(cè)試是否真正的過了 TP 保護(hù)。

最后就是開發(fā)環(huán)境了,我的是 Visual Studio 2010 + Visual DDK + WDK,這個(gè)可以隨意搭建。

????????????????????????????????

????????????????????????????????

03. 分析 TP 所做的保護(hù):

????????????????????????????????

如果真要分析 TP 所做的保護(hù)的話,還是比較麻煩的,不過好在各種論壇里面,各種前輩給指出了明路,

比如墮落天才有一篇極好的文章,不過這篇文章是 2010 年 12 月份的了,中間 TP 也不是吃飯的,肯定是有更新了,

(繼續(xù)為墮落天才打廣告)

文章名稱:《散談?dòng)螒虮Wo(hù)那點(diǎn)事~就從_TP開始入手吧》

文章地址:http://bbs.pediy.com/showthread.php?t=126802

不過這篇文章的參考價(jià)值還是很大的,比如在 NtOpenProcess,NtOpenThread 等等系統(tǒng)服務(wù)的 Hook 上,

TP 也還是差不多的,也就是變化不大,甚至很多的代碼都可以拿過來直接用,而至于 TP 更新的一些內(nèi)核函數(shù)的 Hook 的話,

也可以從其他論壇里面找到一些,所以最主要的一點(diǎn)就是放狗搜索,放狗搜索到一些資料以后,

可以用 WinDbg 或者 Kernel Detective 來驗(yàn)證這個(gè)內(nèi)核 API 是否真的被 TP 所干掉了。

具體的俺也不曉得要怎么說了,總結(jié)一句就是放狗搜索。

下面放出幾張截圖,我是用 Xuetr 進(jìn)行掃描的,

?

????????????????????????????????

????????????????????????????????

04. 干掉 NtOpenProcess 中的 Deep InLine Hook:

????????????????????????????????

TP Hook NtOpenProcess 的直接效果就是咱在應(yīng)用層里面調(diào)用 OpenProcess(DNF 進(jìn)程) 失敗,

并且在 OD 或者 CE 里面也根本找不到 DNF 游戲的進(jìn)程,更別提什么打開或者附加了,

這使得咱根本對(duì) DNF 無從下手。研究過 TP 的都知道,TP 在 NtOpenProcess 中是下了深層的 InLine 鉤子,

這個(gè)也早已經(jīng)不是什么秘密,各個(gè)論壇上的都知道,是 Hook 的 ObOpenObjectByPointer,

對(duì)于這個(gè),可以使用 Xuetr 掃描內(nèi)核鉤子掃描出來(TP 對(duì) Xuetr 好像敏感,在 XP 機(jī)上可能藍(lán)屏)。

在一些簡(jiǎn)單的 InLine Hook 中,咱都是直接拿內(nèi)核 API 的頭 5 個(gè)或者頭 7 個(gè)字節(jié)做 Hook,

這種 Hook 方式是很容易被干掉的,直接 SSDT Hook 就可以干掉,

對(duì)于用 SSDT Hook 干掉淺層的 InLine Hook 可以參考看雪上墮落天才的文章:

文章名稱:《SSDT Hook 的妙用 - 對(duì)抗 Ring0 InLine Hook》

文章地址:http://bbs.pediy.com/showthread.php?t=40832

不過 TP 是做的 Deep InLine Hook,也就是 Hook 的是 NtOpenProcess 深層的地址,而不是函數(shù)頭,

要想用 SSDT Hook 來干掉的話,除非自己重寫 NtOpenProcess,否則很難干掉,

而且 TP 在對(duì) NtOpenProcess 上還有檢測(cè),所以即使是重寫 NtOpenProcess 也很麻煩,

因?yàn)樵谥貙懼幸脖仨氁@過 TP 可以被 TP 檢測(cè)到,從而彈出經(jīng)典的 TP 警告框。

????????????????????????????????

在這里咱可以在 Kernel Detective 中看到它所做的 InLine Hook,

首先是啟動(dòng) Kernel Detective,然后在 SSDT 子菜單中,找到 NtOpenProcess,

然后在上面右鍵,在右鍵菜單中選擇反匯編當(dāng)前地址,從而就會(huì)跳轉(zhuǎn)到 NtOpenProcess 的反匯編代碼中了,

由于我的電腦太爛了,開個(gè)虛擬機(jī),再跑個(gè) DNF,再主機(jī)里面開個(gè) Visual Studio 的話,估計(jì)半天會(huì)沒反應(yīng),

所以這里截圖截的都是沒有啟動(dòng) DNF 的圖,也就是在 TP 還沒有進(jìn)行 Hook 時(shí)候的截圖,

對(duì)于電腦配置好的朋友,可以自己去測(cè)試,測(cè)試結(jié)果除了地址外,其他基本都是一樣的,

????????????????????????????????

那么如何實(shí)現(xiàn)干掉 TP 對(duì) NtOpenProcess 所做的 Hook 呢 ?

一般干掉的意思就是恢復(fù) Hook,但是恢復(fù) Hook 有一個(gè)很嚴(yán)重的問題,那就是很容易就被 TP 檢測(cè)到了,

其實(shí)可以換個(gè)思路,為什么一定要干掉 TP 對(duì) NtOpenProcess 所做的 Hook 呢 ?

就算被干掉了,還得干掉 TP 用來檢測(cè) NtOpenProcess 的 Hook 是否被干掉的線程之類的,

這樣就比較麻煩了,為何不直接繞過 TP 的 Hook 呢 ?

要想繞過 TP 的保護(hù)的話,我們也可以下一個(gè) InLine Hook,如果發(fā)現(xiàn)是 DNF 進(jìn)程的話,那好啊,

咱直接跳到 TP 下的 InLine Hook 中執(zhí)行(這樣 TP 還是執(zhí)行它原來的代碼,從而檢測(cè)不出來被改變了)

而如果不是 DNF 進(jìn)程的話,那咱就跳過 TP 下的 InLine Hook 就好了,

上面這樣說是說不清楚的,來點(diǎn)干脆的,寫點(diǎn)偽代碼比較容易看懂:

????????????????????????????????

TP 啟動(dòng)之前,也就是 Hook 之前的偽代碼:

1: push dword ptr[ebp-38] 2: push dword ptr[ebp-24] 3: call ObOpenObjectByPointer 4: mov edi,eax 5: lea eax,dword ptr[ebp-B8]

????????????????????????????????

TP 啟動(dòng)之后,也就是 Hook 之后的偽代碼:

1: push dword ptr[ebp-38] 2: push dword ptr[ebp-24] 3: call TPHookedObOpenObjectByPointer //這里代表 TP Hook ObOpenObjectByPointer 的函數(shù) 4: mov edi,eax 5: lea eax,dword ptr[ebp-B8]

????????????????????????????????

繞過 TP 所做的 Hook 的偽代碼(DNF 檢測(cè)不出來自己被繞過了,要是能檢測(cè)出來也就不叫繞過了):

1: push dword ptr[ebp-38] 2: push dword ptr[ebp-24] 3: if(是 DNF 進(jìn)程) 4: { 5: call TPHookedObOpenObjectByPointer 6: } 7: else 8: { 9: call ObOpenObjectByPointer 10: } 11: mov edi,eax 12: lea eax,dword ptr[ebp-B8]

????????????????????????????????

有了偽代碼以后,我們要做的也就比較清楚了,要想實(shí)現(xiàn)“繞過 TP 所做的 Hook 的偽代碼”的話,

咱得自己也下一個(gè) InLine Hook,至于我們?cè)谀睦锵?InLine Hook 的話,也很明白,

至少得再 call ObOpenObjectByPointer 之前吧,否則都已經(jīng)進(jìn)入 TP 的 Hook 了,還談什么繞過呢 ?

下面給出一副截圖來標(biāo)記將要下我們自己的 InLine Hook 的位置,

????????????????????????????????

現(xiàn)在已經(jīng)知道要在哪個(gè)位置下 InLine Hook 了,那么下一個(gè)問題就是咱如何才能得到這個(gè)地址呢?

辦法自然是搜索特征碼了,具體的實(shí)現(xiàn)方式可以看下面的截圖,通過搜索特征碼咱就可以得到咱要下 Hook 的地址了。

????????????????????????????????

既然要下 InLine Hook 的位置也找到了,同時(shí),如何繞過 TP 的 InLine Hook 的偽代碼也出來了,

那么就只需要在找到的位置處安裝一個(gè) InLine Hook,同時(shí)完成我們 Hook 時(shí)的過濾代碼就 OK 了。

下面對(duì)如何繞過 TP 的 InLine Hook 的偽代碼再做一個(gè)詳細(xì)點(diǎn)的說明,具體的都已經(jīng)很簡(jiǎn)單了,

我們已經(jīng)得到了 0x805C0D74 這個(gè)地址,這個(gè)地址 + 6 即是 0x805C0D7A,對(duì)應(yīng)的就是 call 指令了,

所以如果是 DNF 進(jìn)程的話,我們就直接跳到這個(gè)指令上來,從而執(zhí)行 call TPHookedObOpenObjectByPointer,

1: __asm 2: { 3: push dword ptr [ebp-38h] 4: push dword ptr [ebp-24h] 5: jmp 0x805C0D7A 6: }

同時(shí)?0x805C0D74 + 11 = 0x805C0D7F 也就是 mov 指令,也就是說如果不是 DNF 進(jìn)程的話,

咱自己實(shí)現(xiàn)下面的代碼就 OK 了,也就是調(diào)用內(nèi)核原始的 ObOpenObjectByPointer,

ObOpenObjectByPointer 這個(gè)函數(shù)是內(nèi)核導(dǎo)出函數(shù),可以使用 MmGetSystemRoutineAddress 獲取其地址,

1: __asm 2: { 3: push dword ptr [ebp-38h] 4: push dword ptr [ebp-24h] 5: call ObOpenObjectByPointer 6: jmp 0x805C0D7F 7: }

????????????????????????????????

下面是先貼出安裝 InLine Hook 的代碼,用來干掉 TP 對(duì) call ObOpenObjectPointer 的 Hook

1: /************************************************************************/ 2: /* 安裝鉤子從而過掉 TP 保護(hù)所 Hook 的 NtOpenProcess - 讓 TP 失效 3: /************************************************************************/ 4: VOID InstallPassTPNtOpenProcess() 5: { 6: CHAR szCode[7] = 7: { 8: (char)0xff, 9: (char)0x75, 10: (char)0xc8, 11: (char)0xff, 12: (char)0x75, 13: (char)0xdc, 14: (char)0xe8 15: }; 16: ? 17: /* 獲取原生的 NtOpenProcess 和 ObOpenObjectByPointer 的地址 */ 18: uOriginNtOpenProcessAddr = MmGetSystemFunAddress(L"NtOpenProcess"); 19: uOriginObOpenObjectByPointerAddr = MmGetSystemFunAddress(L"ObOpenObjectByPointer"); 20: ? 21: /* 從 NtOpenProcess 這個(gè)地址開始搜索長(zhǎng)度為 7 的特征碼字符串,得到的地址將會(huì)被安裝 InLine Hook */ 22: uMyHookedNtOpenProcessAddr = SearchFeature(uOriginNtOpenProcessAddr, szCode, 7) - 7; 23: ? 24: /* 計(jì)算出自定義 InLine Hook 的跳轉(zhuǎn)地址 */ 25: uMyHookedNtOpenProcessJmpAddr = uMyHookedNtOpenProcessAddr + 11; 26: ? 27: /* 計(jì)算出 TP InLine Hook 的跳轉(zhuǎn)地址 */ 28: uTPHookedNtOpenProcessJmpAddr = uMyHookedNtOpenProcessAddr + 6; 29: ? 30: /* 安裝一個(gè) InLine Hook */ 31: InstallInLineHook(uMyHookedNtOpenProcessAddr, (ULONG)InLineHookNtOpenProcess); 32: ? 33: KdPrint(("Pass TP - NtOpenProcess Installed.")); 34: }

????????????????????????????????

下面再給出我們自己 InLine Hook 的中繼實(shí)現(xiàn):

1: /************************************************************************/ 2: /* 自定義的 NtOpenProcess,用來實(shí)現(xiàn) InLine Hook Kernel API 3: /************************************************************************/ 4: NTSYSHOOKAPI void InLineHookNtOpenProcess() 5: { 6: __asm 7: { 8: push dword ptr [ebp-38h] 9: push dword ptr [ebp-24h] 10: } 11: ? 12: /* 開始過濾 */ 13: if(ValidateCurrentProcessIsDNF() == TRUE) 14: { 15: __asm 16: { 17: /* 如果是 DNF 進(jìn)程調(diào)用的話,則調(diào)用已經(jīng)被 TP Hook 的 NtOpenProcess */ 18: jmp uTPHookedNtOpenProcessJmpAddr 19: } 20: } 21: ? 22: __asm 23: { 24: /* 如果不是 DNF 進(jìn)程調(diào)用的話,則調(diào)用 ntoskrnl.exe 中的 NtOpenProcess */ 25: call uOriginObOpenObjectByPointerAddr 26: jmp uMyHookedNtOpenProcessJmpAddr 27: } 28: }

????????????????????????????????

????????????????????????????????

05. 干掉 NtOpenThread 中的 Deep InLine Hook:

????????????????????????????????

上面已經(jīng)干掉了 NtOpenProcess 中的 Deep InLine Hook 了,其實(shí)很多人都能猜得到,

既然 TP 搞掉了 NtOpenProcess,那么 TP 就沒有理由不搞掉 NtOpenThread 這個(gè)內(nèi)核服務(wù)了,

不錯(cuò),TP 在內(nèi)核中確實(shí)也干掉了 NtOpenThread 這個(gè)內(nèi)核服務(wù),并且同樣用的 Deep InLine Hook,

并且跟 NtOpenProcess 一樣,NtOpenThread 中也是對(duì) ObOpenObjectByPointer 做的 InLine Hook,

不相信的童鞋可以分別在啟動(dòng) DNF 游戲之前和之后用 Kernel Detective 經(jīng)過反匯編查看 NtOpenThread 的反匯編代碼,

比較兩次的反匯編代碼就可以看出來 TP 在 NtOpenThread 中所動(dòng)的手腳了,具體的步驟可以如下:

先找到 NtOpenThread 的反匯編地址,然后再在反匯編代碼中找到 call ObOpenObjectByPointer(TP 啟動(dòng)之前),

????????????????????????????????

和干掉 NtOpenProcess 中的 Deep InLine Hook 一樣,我們還是使用繞過去的方式來做,

由于前面已經(jīng)以這種方式分析分析過 NtOpenThread 了,所以咱直接來分析地址就 OK 了,

首先我們一樣搜索特征碼定位到我們將要安裝 InLine Hook 的地址,

????????????????????????????????

下面對(duì)如何繞過 TP 的 InLine Hook 的再做一個(gè)詳細(xì)點(diǎn)的說明,

我們已經(jīng)得到了 0x805C0FF6 這個(gè)地址,這個(gè)地址 + 6 即是 0x805C0FFC,對(duì)應(yīng)的就是 call 指令了,

所以如果是 DNF 進(jìn)程的話,我們就直接跳到這個(gè)指令上來,從而執(zhí)行 call TPHookedObOpenObjectByPointer,

1: __asm 2: { 3: push dword ptr [ebp-34h] 4: push dword ptr [ebp-20h] 5: jmp 0x805C0FFC 6: }

同時(shí)?0x805C0FF6 + 11 = 0x805C1001 也就是 mov 指令,也就是說如果不是 DNF 進(jìn)程的話,

咱自己實(shí)現(xiàn)下面的代碼就 OK 了,也就是調(diào)用內(nèi)核原始的 ObOpenObjectByPointer,

ObOpenObjectByPointer 這個(gè)函數(shù)是內(nèi)核導(dǎo)出函數(shù),可以使用 MmGetSystemRoutineAddress 獲取其地址,

1: __asm 2: { 3: push dword ptr [ebp-34h] 4: push dword ptr [ebp-20h] 5: call ObOpenObjectByPointer 6: jmp 0x805C1001 7: }

????????????????????????????????

下面先貼出用來安裝 InLine Hook 的代碼,用來干掉 TP 對(duì) Call ObOpenObjectByPointer 做的 Hook:

1: /************************************************************************/ 2: /* 安裝鉤子從而過掉 TP 保護(hù)所 Hook 的 NtOpenThread - 讓 TP 失效 3: /************************************************************************/ 4: VOID InstallPassTPNtOpenThread() 5: { 6: CHAR szCode[7] = 7: { 8: (char)0xff, 9: (char)0x75, 10: (char)0xcc, 11: (char)0xff, 12: (char)0x75, 13: (char)0xe0, 14: (char)0xe8 15: }; 16: ? 17: /* 獲取原生的 NtOpenThread 和 ObOpenObjectByPointer 的地址 */ 18: uOriginNtOpenThreadAddr = MmGetSystemFunAddress(L"NtOpenThread"); 19: uOriginObOpenObjectByPointerAddr = MmGetSystemFunAddress(L"ObOpenObjectByPointer"); 20: ? 21: /* 從 NtOpenThread 這個(gè)地址開始搜索長(zhǎng)度為 7 的特征碼字符串,得到的地址將會(huì)被安裝 InLine Hook */ 22: uMyHookedNtOpenThreadAddr = SearchFeature(uOriginNtOpenThreadAddr, szCode, 7) - 7; 23: uMyHookedNtOpenThreadJmpAddr = uMyHookedNtOpenThreadAddr + 11; 24: uTPHookedNtOpenThreadJmpAddr = uMyHookedNtOpenThreadAddr + 6; 25: ? 26: InstallInLineHook(uMyHookedNtOpenThreadAddr, (ULONG)InLineHookNtOpenThread); 27: ? 28: KdPrint(("Pass TP - NtOpenThread Installed.")); 29: }

????????????????????????????????

下面再給出我們自己 InLine Hook 的中繼實(shí)現(xiàn):

1: /************************************************************************/ 2: /* 自定義的 NtOpenThread,用來實(shí)現(xiàn) InLine Hook Kernel API 3: /************************************************************************/ 4: NTSYSHOOKAPI void InLineHookNtOpenThread() 5: { 6: __asm 7: { 8: push dword ptr [ebp-34h] 9: push dword ptr [ebp-20h] 10: } 11: ? 12: /* 開始過濾 */ 13: if(ValidateCurrentProcessIsDNF() == TRUE) 14: { 15: __asm 16: { 17: /* 如果是 DNF 進(jìn)程調(diào)用的話,則調(diào)用已經(jīng)被 TP Hook 的 NtOpenThread */ 18: jmp uTPHookedNtOpenThreadJmpAddr 19: } 20: } 21: ? 22: __asm 23: { 24: /* 如果不是 DNF 進(jìn)程調(diào)用的話,則調(diào)用 ntoskrnl.exe 中的 NtOpenThread */ 25: call uOriginObOpenObjectByPointerAddr 26: jmp uMyHookedNtOpenThreadJmpAddr 27: } 28: }

????????????????????????????????

?

????????????????????????????????????????????????

總結(jié):

????????????????????????????????????????????????

《過 DNF TP 驅(qū)動(dòng)保護(hù)》的第一篇到這里就結(jié)束了,經(jīng)過上面的處理,

我們已經(jīng)過掉了 TP 在 NtOpenProcess 和 NtOpenThread 中的 InLine Hook,

現(xiàn)在已經(jīng)能在 OD 或 CE 里看到 DNF 游戲進(jìn)程并且在 Ring3 下也可以調(diào)用 OpenProcess 打開 DNF 進(jìn)程了,

不過完成了這些離過 DNF TP 驅(qū)動(dòng)保護(hù)還很遠(yuǎn),詳情還得留到下回分解了。

下面給出兩張截圖來顯示一下咱的戰(zhàn)果:

? ? ? ? ? ?? ? ? ? ? ? ??????????? ? ??

現(xiàn)已支持過掉最新版本的 TP 保護(hù)(2013年04月23日),

如有需要者(有償提供),請(qǐng)聯(lián)系 QQ:1751048662

總結(jié)

以上是生活随笔為你收集整理的过 DNF TP 驱动保护(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。