原文发表于百度空间,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不行哦)

方法还有好多好多,标准方法就那么一两种,但是非标准的方法有多少种?尽情发挥想像吧~~

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

  1. 【旧文章搬运】Windbg+Vmware驱动调试入门(四)---VirtualKD内核调试加速工具

    原文发表于百度空间,2009-01-09========================================================================== 今天又想起 ...

  2. 【旧文章搬运】Windbg+Vmware驱动调试入门(二)---Vmware及GuestOS的设置

    原文发表于百度空间,2009-01-08========================================================================== 这一篇是主 ...

  3. 【旧文章搬运】Windbg+Vmware驱动调试入门(三)---Windbg基本调试入门

    原文发表于百度空间,2009-01-09========================================================================== 这一节的内 ...

  4. 【旧文章搬运】Windbg+Vmware驱动调试入门(一)---Windbg的设置

    原文发表于百度空间,2009-01-08========================================================================== Windb ...

  5. 【旧文章搬运】Windows内核常见数据结构(驱动相关)

    原文发表于百度空间,2008-7-24========================================================================== 这些是驱动中 ...

  6. 【旧文章搬运】分析了一下360安全卫士的HOOK(二)——架构与实现

    原文发表于百度空间及看雪论坛,2009-10-14 看雪论坛地址:https://bbs.pediy.com/thread-99460.htm 刚发这篇文章的时候,因为内容涉及360的核心产品,文章被 ...

  7. 【旧文章搬运】更正一个枚举PspCidTable时的错误

    原文发表于百度空间及看雪论坛,2009-02-27 看雪论坛地址:https://bbs.pediy.com/thread-82919.htm============================= ...

  8. 【旧文章搬运】关于NtUserBuildHwndList的一点记录~

    原文发表于百度空间,2011-04-07========================================================================== 该函数与r ...

  9. 【旧文章搬运】深入分析Win7的对象引用跟踪机制

    原文发表于百度空间及看雪论坛,2010-09-12 看雪论坛地址:https://bbs.pediy.com/thread-120296.htm============================ ...

随机推荐

  1. Windows下使用Nexus搭建Maven私服(使用)

    注意: 1.从3.0版本的Nexus开始,已经不再缓存https://repo1.maven.org/maven2/的包,所以当安装好之后,在界面上不会有任何的包可以搜索到,但是功能是一切正常的,只有 ...

  2. 应用程序中的server错误,没有名称为“ServiceBehavior”的服务行为

    应用程序中的server错误,没有名称为"ServiceBehavior"的服务行为         今天在阅读"创建和使用Web服务"的相关内容,在浏览器中查 ...

  3. 【c++】面向对象程序设计之虚函数详解

    一.动态绑定什么时候发生 当且仅当通过指针或引用调用虚函数时,才会在运行时解析该调用 二.派生类中的虚函数 当我们在派生类中覆盖了某个虚函数时,可以再一次使用virtual指出该函数的性质,但是这么做 ...

  4. mysql 建立utf8字符集数据库

    CREATE DATABASE `evaluate` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

  5. 上传jar包至maven私服

    1.maven环境变量配置(新建系统变量,编辑Path) 2.修改maven的setting文件 2.1 私服的用户配置 2.2 私服镜像配置 2.3 (我也不知道是啥) <profile> ...

  6. centos 7 -- Disk Requirements: At least 134MB more space needed on the / filesystem.

    用了幾年的centos7,今天執行yum update時,彈出一行有錯誤的提示:Disk Requirements:   At least 134MB more space needed on the ...

  7. vim编码方式配置的学习和思考

    哎呀呀,今天9月30号,立即就要十一长假了,心里还有点小小浮躁.工作已经基本做完,想成为技术大牛怎么能够如此浮躁.为了应付浮躁的心灵,决定写一篇小博,平静一把. 今天一个配置文件须要有中文,而且同事是 ...

  8. DataGuard备库ORA-01196故障恢复一则

    问题现象 在使用shutdown abort停DataGuard备库后.备库不能open,报ORA-01196错误. 详细例如以下: 发现一备库不能应用日志.查看备库日志没发现报错.怀疑是备库应用日志 ...

  9. C#语言 语句

    //有一组函数: //y=x(x<1) //y=2x-1(1<=x<10) //y=3x-11(x>=10) //括号内是x的满足条件 //实现功能,随意输出x /*Conso ...

  10. val();html();.text()区别 setInterval与setTimeout的区别

    val();html();.text()区别   对于innerHTML 属性,几乎所有的元素都有innerHTML属性,它是一个字符串,用来设置或获取位于对象起始和结束标签内的HTML.(获取HTM ...