【旧文章搬运】无Device的驱动如何通信
原文發(fā)表于百度空間,2009-07-14
==========================================================================
標(biāo)準(zhǔn)的驅(qū)動(dòng)與ring3的通信過程是這樣的:
驅(qū)動(dòng)中創(chuàng)建設(shè)備,并為設(shè)備創(chuàng)建符號(hào)鏈接,ring3用CreateFile打開符號(hào)鏈接得到設(shè)備句柄,然后DeviceIoControl發(fā)送ControlCode
DeviceIoControl的內(nèi)容被封裝成IRP到達(dá)Device,Device其所屬Driver的對(duì)應(yīng)派遣例程對(duì)IRP進(jìn)行處理,處理完后IoCompleteRequest完成該IRP最后返回到ring3.
如果有必要的話,還得用Event進(jìn)行一下同步~
如果沒有Device(甚至還可能沒有DriverObject),這一切該如何進(jìn)行?
道理其實(shí)是很簡(jiǎn)單的,我們不要拘泥于某些固定的東西不變,來好好想一想。
先扯點(diǎn)通信的東西。通信,就是把信息從發(fā)信者傳送到收信者的過程,信息傳輸?shù)耐ǖ谰褪切诺馈?br />我們的目標(biāo)是把信息從ring3傳遞到驅(qū)動(dòng)中去,上面的標(biāo)準(zhǔn)通信過程,其實(shí)只不過是相當(dāng)于我們自己建立了一個(gè)標(biāo)準(zhǔn)信道
沒有Device,只是說不能用標(biāo)準(zhǔn)信道來通信了,但是還可以有別的通信方法,只要我們能把信息從ring3傳遞給驅(qū)動(dòng),任何方法都可以~~
我來隨便說幾種吧:
一、共享內(nèi)存+Event
ring3用CreateFileMapping創(chuàng)建一塊命名的共享內(nèi)存,還有一個(gè)事件對(duì)象,ring0中獲取相應(yīng)的對(duì)象,共享內(nèi)存中的內(nèi)容事先定好格式,比如哪里是ControlCode,哪里是InputLength,哪里是OutputLength,哪里是InputBuffer,哪里是OutputBuffer,構(gòu)成一個(gè)簡(jiǎn)單的協(xié)議包,這其實(shí)相當(dāng)于一個(gè)變形的IRP結(jié)構(gòu)~~當(dāng)需要通信的時(shí)候,ring3將相應(yīng)的內(nèi)容寫入共享內(nèi)存,然后設(shè)置Event通知驅(qū)動(dòng),驅(qū)動(dòng)收到后就可以從共享內(nèi)存中取到ControlCode,InputLen,InputBuffer等等信息,進(jìn)行相應(yīng)處理就可以了,處理完后再以Event通知ring3,ring3就可以從OutputBuffer中獲取處理結(jié)果了,不過這里沒有考慮異步模式,一般自己的驅(qū)動(dòng)也很少用異步~
二、Hook IopXxxControlFile
NtDeviceIoControlFile直接調(diào)用IopXxxControlFile進(jìn)行處理,很容易Hook(Call替換方式hook最好,安全),也沒有SSDT Hook那么扎眼。Hook該函數(shù)最大的好處是你仍然可以使用標(biāo)準(zhǔn)的DeviceIoControl來發(fā)送ControlCode和驅(qū)動(dòng)通信.Hook成功后,可以打開任意一個(gè)Device,比如Beep,,然后就可以用DeviceIoControl發(fā)送ControlCode了,當(dāng)然ControlCode得有點(diǎn)特殊標(biāo)記(比如某個(gè)特殊標(biāo)志位),總之你得能認(rèn)出來這是你的ring3 App發(fā)來的ControlCode就行,然后Hook函數(shù)中如果是自己的ControlCode就進(jìn)行相應(yīng)處理,否則調(diào)用原始函數(shù)讓系統(tǒng)處理去吧?;蛘咦约菏褂靡粋€(gè)特殊的無效句柄(但是要保證能通過檢查到達(dá)ring0)來發(fā)DeviceIoControl,驅(qū)動(dòng)中檢查此句柄是否是某特殊值,是則認(rèn)為是自已人發(fā)的ControlCode,進(jìn)行處理就OK了。
稍微變形一點(diǎn),直接Hook掉Beep的IRP_MJ_DEVICE_CONTROL派遣例程,然后ring3直接打開Beep用DeviceIoControl發(fā)ControlCode就行了~~
三、Hook NativeAPI
先舉兩個(gè)例子:
HideToolz沒有Device,是使用ZwTerminateProcess來通信的~
某游戲的驅(qū)動(dòng)用ZwQueryVirtualMemory來通信~~
不需要說什么了吧?NativeAPI都要經(jīng)過syscall進(jìn)入ring0,然后可能繼續(xù)到達(dá)某些XX位置,只要在適當(dāng)?shù)奈恢脭r截一下取走自己的信息就行了~
其實(shí)只要能把信息傳遞給驅(qū)動(dòng),很多API都可以(當(dāng)然純r(jià)ing3實(shí)現(xiàn)的API不行哦)
方法還有好多好多,標(biāo)準(zhǔn)方法就那么一兩種,但是非標(biāo)準(zhǔn)的方法有多少種?盡情發(fā)揮想像吧~~
轉(zhuǎn)載于:https://www.cnblogs.com/achillis/p/10181781.html
總結(jié)
以上是生活随笔為你收集整理的【旧文章搬运】无Device的驱动如何通信的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 实现透明背景但背景上元素不透明
 - 下一篇: 【Python生成器与迭代器的区别】