无Device的驱动如何通信(有机会实践一把)
来源:互联网 发布:淘宝的拍卖玉器可信吗 编辑:程序博客网 时间:2024/05/18 00:06
标准的驱动与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不行哦)
方法还有好多好多,标准方法就那么一两种,但是非标准的方法有多少种?尽情发挥想像吧~~
- 无Device的驱动如何通信(有机会实践一把)
- 无Device的驱动如何通信
- drm 驱动是如何创建 fb device 的
- 痛苦史---调稳 外设+无驱动+无硬件+不稳定平板的通信
- 有机会
- How to load our device drivers 如何装载我们的设备驱动
- 基于Device tree机制的驱动编写
- 停止IFIX的IGS驱动部分Device
- 无通信协作的思想
- 无通信的图像旋转
- 调试无符号的驱动
- 无刷电机的驱动
- 如何打一把好锁
- 装系统后无网卡驱动、USB驱动,如何处理
- 多线程通信的简单实践
- 在不使用redux的情况下 react无关系组件之间如何通信!
- 网络驱动和网卡如何通信
- Windows 驱动与驱动之间的通信
- linux启动流程
- 闭关第7天练级关键词
- performSelector 和 NSTimer没有执行的解决方法
- velocity 字符串解析
- PSTN与VoIP
- 无Device的驱动如何通信(有机会实践一把)
- 我的日期/时间类
- Android架构纵横谈之二——基于性能的考虑(1)
- vim——编辑利器
- C里的共同体和结构体的区别
- 36 选 7 彩票机选程序
- sys模块
- 写博客喽
- PSTN与PBX业务