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