ring0 / ring3 跨级别进程通信.

进行WDM/IFS开发时,常需要开发一个GUI来同用户互动,并借此控制驱动程序的行为,或者向用户汇报底层信息。一个著名的例子是FileMon。这个程序功能全面,但其不足也很致命:通过轮询法来交互ring0/ring3的数据,经常造成系统资源不足,或者干脆挂起。

在用户模态下的进程间通信模式,可以移植到ring0/ring3的通信中,使得kernel进程中的流程与用户态进程进行同步。这种可能性来自于内核对象管理技术——所有的Mutex/Semaphore都是内核对象(这也是多线程程序设计所依赖的基本服务)。由于ring0/ring3中的进程都能访问这些“基本”内核对象,利用他们来做同步是理所当然的。这样的同步模式和平常使用没有多少区别,只是ring0程序在访问Mutex/Semaphore是步骤不同。

下文摘自一篇本科毕业论文,这个片断剖析了杀毒引擎中内核/用户态通信技术,十分有借鉴价值。

注:文中"Hooksys.sys"为NT Service的binary image, "guidll.dll"为用户态GUI进程的组件


Hooksys.sys中使用命名的信号量来唤醒ring3级线程。具体做法如下:首先在guidll.dll中调用CreateSemaphore创建一个命名信号量Hookopen并设为无信号状态,同时调用CreateThread创建一个线程。线程代码的入口处通过调用WaitForSingleObject在此信号量上等待被ring0钩子函数唤醒查毒。驱动程序这边则在初始化过程中通过未公开的例程ObReferenceObjectByName(/BaseNamedObjects/Hookopen)得到命名信号量对象Hookopen的指针,当它拦截到文件打开请求时调用KeReleaseSemaphore将Hookopen置为有信号状态唤醒ring3级等待检查打开文件的线程。其实guidll.dll共创建了两个命名信号量,还有一个Hookclose用于唤醒ring3级等待检查关闭文件的线程。

 

guidll.dll中使用命名的事件来唤醒暂时挂起等待查毒完毕的ring0钩子函数。具体做法如下:Hooksys.sys在其初始化过程中通过ZwCreateEvent函数创建一组命名事件对象(此处必须合理设置安全描述符,否则ring3线程将无法使用事件句柄)并得到其句柄,同时通过ObReferenceObjectByHandle得到句柄引用的事件对象的指针。然后Hooksys.sys将这一组事件句柄和指针对以及事件名保存在备用链表的每个元素中:ring3使用句柄,ring0使用指针。当钩子函数拦截到文件请求时它首先唤醒ring3查毒线程,然后马上调用KeWaitForSingleObject在一个事件/BaseNamedObjects/Hookxxxx上等待查毒的完成。而被唤醒的ring3查毒线程通过OpenEventA函数由事件名字得到其句柄,在结束查毒后发出一个SetEvent调用将事件置为有信号状态从而唤醒ring0挂起的钩子函数。当然,以上讨论仅限于打开文件操作,钩子函数在拦截到其它文件请求时并不调用KeWaitForSingleObject等待查毒的完成,而是唤醒ring3查毒线程后直接返回;相应的ring3查毒线程也就不必在查毒完成后调用SetEvent进行远程唤醒。

 

补充一些未公布系统函数

With a little bit of research (and some help from
alert readers), we know the prototype for        
ObReferenceObjectByName looks like this:         
                                                 
extern "C"                                       
NTSYSAPI                                         
NTSTATUS NTAPI ObReferenceObjectByName(          
    IN PUNICODE_STRING ObjectPath,               
    IN ULONG Attributes,                         
    IN PACCESS_STATE PassedAccessState OPTIONAL, 
    IN ACCESS_MASK DesiredAccess OPTIONAL,       
    IN POBJECT_TYPE ObjectType,                  
    IN KPROCESSOR_MODE AccessMode,               
    IN OUT PVOID ParseContext OPTIONAL,          
    OUT PVOID *ObjectPtr                         
);                                               

原文见http://vmsone.com/~decuslib/vmssig/vmslt99b/nt/objectrefbyname.txt

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Ring3层隐藏进程是指在计算机的操作系统中,利用一些特殊的技术手段或者恶意软件来隐藏自身的进程,使其在操作系统层面上不被察觉或无法被发现。 首先,Ring3是指计算机操作系统的用户态环境。在这个层级中,进程运行的权限较低,无法直接访问操作系统的核心态环境。 隐藏进程的目的通常是为了避免被用户或者安全软件察觉,以实现各种恶意目的。常见的方法有以下几种: 1. 修改进程的属性:利用各种技术手段修改进程的属性,使其在任务管理器或者其他进程监视工具中不可见。例如,通过修改进程的PEB(Process Environment Block)来删除或修改进程自身在系统进程列表中的记录。 2. 加载进程钩子:通过操作系统提供的进程钩子机制,在进程创建、退出或运行过程中,植入一些对进程操作的控制逻辑。通过这种方式,可以在进程管理工具中隐藏自身的存在,或者篡改系统的行为。 3. 修改系统调用表:通过篡改操作系统的系统调用表或函数表,使得某些关键的系统调用或函数返回伪造的结果。通过这种方式,可以欺骗监控工具或者病毒扫描工具,隐藏自己的存在。 4. rootkit技术:rootkit技术是一种更为复杂和高级的隐藏进程技术。它可以在系统内部植入自己的恶意代码,并与操作系统的核心态环境进行交互。通过这种方式,可以在操作系统层面上彻底控制系统的行为,使自身进程无法被发现。 总而言之,Ring3层隐藏进程是恶意软件或黑客利用各种技术手段,在操作系统的用户态环境中隐藏自身的进程,从而实现对被感染系统的控制和掩盖自身存在的目的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bluemiles

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值