标 题: 【原创】PE监控器(监控系统PE文件的创建和改写操作)(开源) 作 者: zhxfl 时 间: 2012-05-01 链 接: http://bbs.pediy.com/showthread.php?t=150065 附 件: PPE 开源.rar blog :http://blog.sina.com.cn/zhenghuanxin [I]软件来源: [/I] 每次在网上下载一个小工具,都担心他是否被捆版了感染型的病毒,然后自己YY了一下,得到这样的结论:感染型病毒有一个修改系统已有PE文件的功能,那么我需要一个工具,用来监控一个新的陌生的应用程序第一次在我的系统中运行的时候是否修改了系统本来的文件,然后这个蛋疼的工具就产生了。 这个思想绝对不是什么有创意的思想,但是对于像我一样的初学者,(6000行的框架代码看完了,总得联系一下吧,苦逼硬挤,弄出这么一个需求),思想不等大雅之堂,所以开源出来,只供练手,高手略过。[I]开发环境:[/I] Vc6.0+wdk [I]Sys 编译指令:[/I] 先编译sfilter 在编译sflt_smpl 在cmd进入对应目录,然后my_build fre wxp即可。 [I]驱动安装 :[/I] 使用srvinstw.exe 安装服务(手工安装服务) 驱动服务名为:sflt_smpl 安装驱动时那个输入路径是有bug的,直接黏贴路径进去即可。用cmd启动服务。[I]功能说明 [/I] 图4 PEPS 界面以及运行效果 start :连接驱动服务。 service1:开启服务类型1,只监控create和write行为,不做拦截。 service2:开启服务类型2,监控create行为,拦截对系统已有文件的write行为。 delete :如果发现非法write行为,可以对create的文件做删除操作。清除病毒体。 exit :关闭驱动服务,退出程序。 about :版本信息。 num :拦截操作序号。 path :对应操作的路径。 operate :对应操作的类型。 [I]功能演示: [/I] 按 start 连接通信,先不要开启服务,在C盘下放a的文件夹,运行1.exe,这时候a文件夹里面NOTEPAD.EXE被感染,感染的特性是必须启动Text.dll,所以运行是弹出“中毒了”的标志。 现在开启service2,然后重新放一个没有被感染的notepad.exe在a文件夹里面,发现同时拦截了改写系统文件的行为。运行一下notepad.exe,没有被感染。 有运行了codeblock的安装程序,监控只有create创建文件行为,没有非法的改写行为。然后在运行其他安装程序,这些安装程序都是第一次在系统安装(如果不是第一次,肯定有覆盖行为)[I]改进空间: [/I] 作为练手的工具,这里只讨论效率上面的东西,我需要在驱动里面记录windows所有的创建(create)的文件的路径,这里我用了一个链表,每次有一个write行为,获取其路径,然后去create链表里面线性查找,如果没找到,说明这个写行为改写的是系统本来的文件,那么系统就表示系统PE文件被感染了。 这个做法看起来没什么问题,不过在链表里面线性查找,是一个不好的做法,要知道系统的文件请求IRP请求多得跟当年的日本鬼子一样,很快create的链表就会很长,而write操作也很多,所以复杂度就无法接受了。 改进的方法是:把create路径存在一颗平衡二叉树里面(在应用层的STL里面有set和map,都是用红黑树),把每次查找的复杂度从O(n)降低到log(n),log(n)可以认为是一个很小的常数,所以复杂度就降低下来了。另外也可以将字符串转化成数字,然后开一个数组,之后去hash,这个理论复杂度是0(1)。 之所以没弄这个优化,主要是因为驱动调试实在是有点困难,不像应用层,以后有时间在修改。见笑了。所以开了这个工具之后,要及时关闭。 另外,由于驱动通信上面设计的不好(一大堆互斥锁,忙等之类的),所以退出的时候,请做一个拷贝PE文件的操作,使得驱动里面的忙等结束。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!