终于比IceSword底层了

    IceSword有反调试功能,搞的我想研究一下它的原理都举步维艰。不过同样是pjf的作品FileMgr却没有设防,正好拿来开刀。
    经过IrpMon、IrpTrace、WinObj、NTObjects、WinDbg等工具的左右夹击,终于发现FileMgr通过直接 IoCallDriver(/Device/Ftdisk设备对象, 自定义的Irp);来绕过大部分的文件过滤驱动。然后再研究IceSword,果然是一样的原理。它和我准备用来实现knlls的原理一样,这种"英雄所 见略同"既是偶然也是必然。虽说IceSword绕过系统API自己实现了大量的操作,但文件系统实在复杂,在Ftdisk之下就要考虑NTFS和 FAT32之类的文件系统格式了,绕过系统支持不同的文件系统是不现实的,所以在磁盘类驱动层必然要把读写文件的控制权交给系统。
    不过,FileMgr和IceSword还是棋差一招,调用IoCallDriver会经过Io管理器,由Io管理器根据DRIVER_OBJECT的 MajorFunction[]来调用相应的Dispatch例程,只要修改MajorFunction[]就能hook发往Ftdisk的Irp了。我 本以为IceSword会直接找到并调用Ftdisk各个Dispatch例程,但在IceSword启动的前或后加载我的钩子都能起效,可见 IceSword还是用到了"不安全"的MajorFunction[]。 
    知道原理是一回事,"虎口拔牙"又是另一回事。文件系统相关IRP太复杂了,实时性要求又高,在没完全搞清楚之前还是不要动手,先写出knlls再说。

(11月30日添加)
    今天又研究了一下,发现IceSword调用Ftdisk的Dispatch只是表面现象,Ftdisk上的钩子没有勾到什么有价值的数据。改成挂钩/ FileSystem/NTFS,这才获得了所有访问文件系统的操作。如果是FAT32则需要挂钩/FileSystem/FastFat。
    我还没搞清除Ftdisk和ntfs/FastFat之间究竟是怎么个关系,Ftdisk应该是在具体的文件系统驱动之上提供统一的"接口"才对,但实际 上它们既不以NextDevice联系,也不以AttachedTo/AttachedDevice联系,Hook到的数据完全搞不清楚其含义,于是我郁 闷了。难道是通过DeviceNode?
    刚刚开始探索文件系统结构,就已经找不着北了。看来写knlls任重道远啊。


 

【作者: zzzevazzz

ftdisk是位于ntfs这类filesystem以下..disk这类storage driver以上的一个value added的驱动程序
他在partmgr的帮助下完成一下value added的功能
比如disk mirror等等
至于ftdisk跟disk的联系跟filesystem的联系都不是使用attach的方式完成的...

跟filesystem的联系是通过vpb来完成的
跟disk这是通过io control传递device object的指针完成的

发送到ftdisk的fdo的irp大部分是io control
而发送到ftdisk的pdo的irp则几乎都是read write

系统引导以后..disk.sys被加载..成功以后windows向其发送一个query bus relationship的irp...这个irp首先到达的驱动不是disk.sys而是作为disk的class的upperfilter加载的驱动...partmgr.sys

partmgr.sys在这个irp上设置一个完成routine然后传递下去...disk会为其每一个分区创建一个pdo..

irp完成的时候..partmgr.sys的完成routine调用..对irp作进一步的处理

他解析返回的device relation结构
对于里面返回的每一个device object..如果是以前没有的现在新出现了..则构造一个volume arrival的iocontrol发送到ftdisk.
如果是以前有的而现在却没有了则发送一个volume removal到ftdisk
完成这些操作了以后ftdisk设置device relation的count成员为0...这样windows并不认为disk返回了很多pdo..以至于windows并不发送诸如start stop这类pnp的irp到disk为每个分区创建的pdo..当然这个工作是有人来完成的..partmgr会发送这些irp到disk去
要验证这个说法很简单..构造一个query bus relation发送到disk.sys就能看到pdo.而发送到partmgr.sys就什么都看不到
windows也不承认disk创建的设备是pdo.因为windows会为每个pdo创建device node.而这些设备并没有对应的device node

ftdisk接受到用disk本身的pdo跟disk创建的分区的pdo作为input产生的volume arrival的时候就创建一个pdo.并且保持这两个指针.这个新创建得pdo是一个FILE_DEVICE_DISK类型的pdo.windows在IoCreateDevice的检查这种类型.为其创建一个vpb结构.并关联上去.同时ftdisk为这个新创建的pdo注册一个特别的device interface...系统里面的mountmgr.sys在这个device interface上注册了一个notification..mountmgr.sys得到运行.为这个pdo分配一个盘符.并创建符号连接/dosdevices/c:这样的到ftdisk创建的pdo上...

在第一次访问这个新创建的pdo的时候.比如某程序要读取c:/boot.txt...windows解析这个名字发现c:是一个符号链接.重定向到ftdisk的pdo上.再检查这个pdo.发现附加得有vpb.再检查vpb发现没有filesystem mount在上面.于是通知各个系统里面注册了得filesystem开始尝试mount这个新的volume.mount成功以后修改vpb的一个指针指向filesystem在mount过程中为这个即将要使用的新分区所创建的一个device上面.这样就通过vpb把filesystem跟ftdisk连接到了一起.

大致的情况就是如此.其中disk.sys是有源代码的.fastfat也是有源代码的.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一:SSDT表的hook检测和恢复 ~!~~~ 二:IDT表的hook检测和恢复 ~~~~~~(idt多处理器的恢复没处理,自己机器是单核的,没得搞,不过多核的列举可以) 三:系统加载驱动模块的检测 通过使用一个全局hash表(以DRIVEROBJECT为对象)来使用以下的方法来存储得到的结果,最终显示出来 1.常规的ZwQuerySystemInformation来列举 2通过打开驱动对象目录来列举 3搜索内核空间匹配驱动的特征来列举(这个功能里面我自己的主机一运行就死机,别的机器都没事,手动设置热键来蓝屏都不行,没dump没法分析,哎,郁闷) 4从本驱动的Modulelist开始遍历来列举驱动 四:进程的列举和进程所加载的dll检测 采用以下方法来列举进程: 1ZwQuerySystemInformation参数SystemProcessesAndThreadsInformation来枚举 2进程EPROCESS 结构的Activelist遍历来枚举 3通过解析句柄表来枚举进程 4通过Handletablelisthead枚举进程 5进程创建时都会向csrss来注册,从这个进程里面句柄表来枚举进程 6通过自身进程的HANDLETABLE来枚举进程 7通过EPROCESS的SessionProcessLinks来枚举进程 8通过EPROCESS ---VM---WorkingSetExpansionLinks获取进程 9暴力搜索内存MmSystemRangeStart以上查找PROCESS对象 进程操作: 进程的唤醒和暂停通过获取PsSuspendProcess和PsResumeProcess来操作的 进程结束通过进程空间清0和插入apc。 采用以下方法查找DLL: 1遍历VAD来查找dll 2挂靠到对应的进程查找InLoadOrderLinks来枚举dll 3暴力搜索对应进程空间查找pe特征来枚举dll DLL的操作: Dll的卸载是通过MmUnmapViewOfSection和MmmapViewOfSection(从sdt表中相应函数搜索到的)来实现的(本来想直接清0 dll空间,有时行有时不行)(只要将这个进程的ntdll卸载了,进程就结束了,一个好的杀进程的办法撒,绿色环保无污染),注入dll使用的是插入apc实现的。(注入的dll必须是realse版的。Debug版会出现***错误,全局dll注入貌似也是)插入apc效果不是很好,要有线程有告警状态才执行。 五:线程信息的检测 遍历ThreadList来枚举线程 线程的暂停和唤醒都是通过反汇编获取PsResumeThread和PsSuspendThread直接从r3传来ETHREAD来操作的,通过插入APC来结束线程 六:shadow sdt表的hook检测与恢复 没有采用pdb来解决函数名问题,直接写入xp和03的shandow表函数名(主要是自己的网不稳定,连windbg有时都连不上微软) 七:系统所有的过滤驱动的检测 查看各device下是否挂接有驱动之类的,可直接卸载 八:系统常用回调历程的检测和清除 只检查了PsSetLoadImageNotifyRoutine PsSetCreateThreadNotifyRoutine PsSetCreateProcessNotifyRoutine CmRegisterCallback这几个,至于那个什么shutdown回调不知道是啥玩意,就没搞了,有知道的顺便告诉我下撒,谢谢 九:文件系统fat和ntfs的分发函数检测 直接反汇编fat和ntfs的DriverEntry得到对应的填充分发的偏移,然后和当前已经运行的文件系统的分发相比是否被hook,并附带恢复 十:文件查看功能 自己解析ntfs和fat的结构,来实现列举文件和直接写磁盘删除。附带有普通的删除和发生IRP来删除。不过这里面有点问题,ntfs删除有时把目录给搞坏了,大家凑合着吧, Ntfs网上删除这些操作的代码不多,就是sudami大大的利用ntfs-3g来实现的,看了下,太多了,充满了结构。然后自己对照着系统删除文件时目录的变化来自己实现的。只处理了$BITMAP对应的位清除,父目录的对应文件的索引项的覆盖,删除文件对应的filerecord清0. 另外偷懒时间都没处理,呵呵,y的,一个破时间都都搞好几个字节移来移去的。 十一:常用内核模块钩子的检测和恢复 这里只检测了主要的内核模块nkrnlpa**.exe的.win32k.sys,hal.dll,比对它们的原始文件从而查找eat inline hook,iat hook ,和inline hook。Inline是从TEXT段开始一段位置开始比较的。(有点慢貌似,等待显示扫描完成就好了) 十二:应用层进程所加载dll的钩子 应用层钩子检测和内核模块钩子检测原理一样,不过为了能读写别的进程的空间,并没有使用openprocess去打开进程,而是通过KiattachProcess挂靠到当前进程,然后通过在r0直接读写进程空间的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值