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

当前位置: 主页 > 系统综合 > 各类编程 > 过滤IRP突破冰刃文件检测

过滤IRP突破冰刃文件检测

时间:2012-02-27 14:04来源:未知 整理:寂涯网络 点击:

本文介绍的是在文件系统层上绕过冰刃的文件检测功能,而不是磁盘系统层。说到windows的文件,不得不谈文件的隐藏。对于文件隐藏技术,上层一点就是hook系统函数实现文件的隐藏,在R3和R0下都可以HOOK ZwQueryDirectoryFile来实现文件的隐藏,但是这个函数太接近应用层,ark工具完全可以绕过这个函数自己发送irp实现文件的枚举。稍微底层一点的,可以替换fsd的分发例程,或者hook fsd的分发例程。但是这些都逃不过冰刃的文件检测。那么冰刃的文件检测是怎么样的呢?其实冰刃采用Raw FSD 1/0来枚举文件和目录的,就是自己构造irp (MajorFunction=IRP_MJ_DIRECT0RY_C0NTR0L MinorFunction==IRP_MN_QUERY_DIRECTORY)然后调用FSD的分发例程。在这里有几点要注意:
1. 冰刃在填充irp的时候,IRP栈单元的Flags设置了SL_RETURN_SINGLE_ENTRY,所以文件系 统每次只会返回一条FILE_BOTH_DIR_INFORMATION结构的记录,而不是全部),当IoStatus. Status==STATUS_NO_MO_FILES时候枚举结束。
2. 冰刃在下发irp的时候,并不是调用Iofcalldriver来实现irp的下发,而是直接获取fsd真实的分发例程,call过去的,并且会不停的恢复fsd分发例程的前十几个字节,所以大部分在文件系统层的方法都无法绕过冰刃,如卩30分发例程替换,line hook分发例程等等都是没用的。
难道真的没有办法绕过冰刃的检测吗?当然不是,否则也不会又此文。方法是在四?处理前设置完成例程,当1即完成后在完成例程中处理返回的数据。现在面临2个问题:
1如何捕获冰刃下发的IRP 2如何为捕获的IRP设置完成例程
由于冰刃是直接在call完成例程的的,而且不停恢复完成例程的前十几个字节,所以 我们不能直接110呢完成例程,但是我们可以110呢完成例程中调用的系统函数。所以,应该先获得真实的完成例程,通过ntfs. sys的driver_object的MajorFunction域获取是不行的,该处的数据可能被更改。我们可以做?磁盘文件故伪.8%,分析它。通过IDA分析 ntfs.sys 的 driverentry 函数:
INIT:0009546D push eax ;DeviceName
INIT:0009546E push ebx ;DeviceExtensionSize
INIT:0009546F push esi ;DriverObject
INIT:00095470 call ds:IoCreateDevice
INIT:00095476 cmp eax, ebx 
INIT:00095478 jl loc_95A79    
INIT:0009547E mov dword ptr [esi+7Ch], offset loc_ 89CE9
INIT:00095485 mov dword ptr [esi+68h], offset loc_ 381BD
INIT:0009548C mov dword ptr [esi+50h], offset loc_ .13ABB
INIT:00095493 mov dword ptr [esi+38h], offset loc_ 35E01
INIT:0009549A mov dword ptr [esi+40h], offset loc_ 352EA
INIT:000954A1 mov dword ptr [esi+44h], offset loc_ .12F2F
INIT:000954A8 mov dword ptr [esi+48h], offset loc_ .llB4B
INIT:000954AF mov dword ptr [esi+5Ch], offset loc_ 500E5
INIT:000954B6 mov dword ptr [esi+6Ch], offset loc_ 3A958
INIT:000954BD mov dword ptr [esi+80h], offset loc_ 35CB8
INIT:000954C7 mov dword ptr [esi+78h], offset off_ 247F2
INIT:000954CE mov dword ptr [esi+0A4h], offset loc _52A0E
INIT:000954D8 mov dword ptr [esi+28h], offset dword_2F9A0

发现 driverentry 函数对于 IRP_MJ_DIRB (NtfsFsdDirectoryControl)赋值的指令是爪0¥ dword ptr 特征码是:c74668。具体获取NtfsfsdDirectoryControl的代码如下:
[code]
int GetRvaofFun()
HANDLE hfile, hmap;
PIMAGE_DOS_HEADER 1pmemory; PIMAGE_NT_HEADERS ntheader;
ULONG imagebase, driverentry, FsdRoutine ULONG sectionnums, i; PIMAGE_SECTION_HEADER sectionheader; //这里是打开文件,并建立文件内存映像,
if (lpmemory==0)
{
return 0;
}
//检测DOS头和NT头,确保是有效的?£文件 if(lpmemory->e_magic!=IMAGE_DOS_SIGNATURE)
{
return 0;
}
ntheader=(PIMAGE_NT_HEADERS)((ULONG)lpmemory+lpmemory->e_lfanew); if(ntheader->Signature!=IMAGE_NT_SIGNATURE)
return 0;
}
imagebase=ntheader->OptionalHeader. ImageBase; //加载的基址
driverentry=ntheader->OptionalHeader. Addre s sOfEntryPo i nt;
/ /driverentry函数的地址,是一个rva。
//下面的代码将driverentry这个rva转换成rvw文件偏移
sectionnums=ntheader->Fi1eHeader. NumberOfSections;
sectionheader=(PIMAGE_SECTION_HEADER)((ULONG)ntheader+sizeof(IMAGE_NT_H EADERS));

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

百度搜索更多

谷歌搜索更多

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

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


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

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