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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【旧文章搬运】无Device的驱动如何通信

發布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【旧文章搬运】无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的驱动如何通信的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。