免费教程_免费网赚教程_破解版软件-寂涯网络学习基地

当前位置: 主页 > 系统综合 > 各类编程 > 进程防火墙驱动开发的再次挖掘

进程防火墙驱动开发的再次挖掘

时间:2012-03-25 15:05来源:未知 整理:寂涯网络 点击:

前段时间,我们实验室需要为外面某公司开发一个安全方面的软件,这个项目很大, 由于制度问题,我在这里无法透露,我在这里只是谈论技术有关,其中有一个要求就是需 要按照某些策略来进行限制进程的启动,实际上就是开发一个进程防火墙,黑白名单由自 己指定,当时我接到该任务,心中一阵窃喜;这个我在 2009年就已经实现,我在 2009年写过一篇文章叫《“二次华山论剑“---再论进程防火墙》,就是当创建进程时候,可以被拦截,由用户判定是否拦截进程。因此没多想,直接把相关的代码和文档丢给师 弟,让他们去修改,并提出设计方案,在应用层建立一个队列,创建一个进程就挂起后放入队列,另一个队列处于检测进程队列状态中,一旦发现进程等待状态中有新的元素,就 提取该挂起进程的 ID 进行判定,如果在黑名单中,直接结束,不在则直接继续运行挂起的 进程。
但是按照此方案设计后,测试发现几个问题:第一、采取应用层队列挂钩会造成极大 的延时,同步效果不好;第二使用 Ntdll 的 ZwSuspendProcess 函数不能挂起父进程是 Winlogon.exe 创建的进程,比如:taskMgr.exe(任务管理器)等进程。这个时候只能否定 这种方案。利用 PsSetCreateProcessNotifyRoutine 回调函数来做进程防火墙,难道不 行 ,这 个时候 我逆向了 一下 QQ 管 家的 TSKsp.sys 驱动文 件,发现 它也 是通过 PsSetCreateProcessNotifyRoutine 回调函数来进行进程过滤的,并且判断了父进程是否 是 Explorer.exe 或者 Winlogon.exe,其中用到大量的同步以及互锁机制;因此我决定重新 分析 PsSetCreateProcessNotifyRoutine 回调函数的流程,我发现该回调函数的简单流 程:NtCreateProcessEx--->PspCreateProcess,PspCreateProcess 函数初始化进程相关 的参数、结构、任务等,然后进程环境搭建好后,运行第一个线程(主线程),利用 PspCreateThread 函数,这个函数完成初始化主线程的参数、结构(比如 TCB)等工作以后, 将会再使用 ExReferenceCallBackBlock 函数来进行遍历执行 PsSetCreateProcessNotifyRoutine 回调函数表中 的 8 个函数地址,后面继续遍历 PspCreateThreadNotifyRoutine 回调函数等,经过一系列复杂的工作后才能启动进程;这 里不做过多阐述,有兴趣的黑防读者可以通过阅读 wrk1.2 来理解,也可以构建 wrk 环境来 调试进程创建流程,估计跟目前的操作系统的流程会有所不同因为 wrk 是 window 2003 sp1(X86)下使用的内核源码,目前的流行操作系统 win7 肯定是不一样。通过上面的分析得 知 PsSetCreateProcessNotifyRoutine 回调函数将会在第一个主线程未启动之前启动,这 说 明进 程 已 经 被 映射 进入 内 存而 且与 主 线 程 创建 是 同 步 事 件 , 因此 决 定 就 在 PspCreateThreadNotifyRoutine  回调函 数里做过滤。 在回调函数中使 用 ZwTerminateProcess 来强制结束黑名单上的进程,效果示意图 1:
图1
如果是写自己编写工具测试这样也无所谓,但是写产品,这种提示框是不能出现,难 道你要用户自己去点一下,首先为什么会提示这个框,这是由于应用软件在新建进程时, 比 如我 们双 击进 程图 标 时, 这样 父进 程 --- 一 般是 Explorer.exe 会 利用 CreateProcessInternalW 这 个函数来 创建进 程,如 果在主线 程还没 有执行 前,就 被 ZwTerminateProcess 结束 ,那么 Explorer.exe 会认为 遇到什 么不明错 误,会 调用 drwtsn32.exe 来上报错误,这个效果需要你开启系统的错误报告检测功能,在“我的电脑
-系统属性-高级-错误报告一栏中”。如果父进程为 cmd 命令行的话,在回调函数结束进程 也会提示”访问被拒绝”等信息,除了父进程是 Winlogon.exe 里进行强制结束进程不会出 现这种错误提示框,估计是采取别的隐藏手段来通知 Winlogon.exe 创建进程失败吧,这里 没有细跟。因此只能采取别的方法来结束进程,这里使用修改入 PE 文件入口地址的指令, 让其自己结束,这样就不会出现提示框,在内核中修改应用层的地址空间的内容要使用 ZwProtectVirtualMemory 函数,这个函数是个未导出的函数,所以要查找一下,该函数起 始地址在 ZwPulseEvent 的地址空间的上方不远处,原理是因为如下图 2:
图2

所以从 ZwPluseEvent 的起始地址往上面空间找,通过判定 Mov eax,0x89 的指令特征来定 位;还要注意 PE 文件入口是如何定位的。
下面直接给出核心源代码:

本页地址 http://www.jybase.net/biancheng/20120325808.html

百度搜索更多

谷歌搜索更多

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------

评价:
昵称: 验证码:点击我更换图片
推荐内容
赞助商
赞助商


关于本站免责声明视频更新google百度地图视频地图RRS订阅

如有什么问题请在本站留言,或发邮件到 hxt167#foxmail.com