通行证│用户名: 密码: 验证码: 验证码,看不清楚?请点击刷新验证码 电信网通铁通移动   在线
文章搜索:
热门搜索:红客 黑鹰 红客技术 安全动画 红客培训
首页 文章 软件 动画 资源 励志 论坛 邮箱 会员 军事 科技 博客 爱心红客 最近更新 800g资源
 业内新闻 漏洞公告 病毒公告 电脑知识 网络知识 菜鸟入门 攻防教程 黑客攻防 安全编程 工具使用 综合安全 个人安全 安全相关 Q Q安全 原创精华 红客人物 站内事件
您现在的位置: 爱国者安全网 >> 文章类 >> 红客教程 >> 网络攻防 >> 文章正文
推荐:突破Icesword实现文件隐藏
责任编辑:酷酷の鱼   更新日期:2008-2-13
 

来源:安全中国

先介绍一下icesword是如何查找文件的。基本原理就是自己构造一个irp出来,然后直接IoCallDriver发送到fsd。但是icesword做了更多的工作。它直接读取ntfs.sys 和fastfat.sys,从pe文件格式的角度上计算出正确的fsd的dispatch routine地址,然后再call。而且icesword自己实现了一个IoCallDriver。所以一般的fsd hook是对付不了icesword的。

  前段时间cardmagic公布了一种方法,hook IofCompleteRequest。然后在UserBuffer里处理要隐藏的文件。到目前位置,api hook 基本上走到尽头了。那么如果要处理 call dispatch routine 后的buffer还可以在哪里下手呢?

  写过驱动的人容易知道,一般的filter类驱动在往下层驱动传递irp的时候会设置一个完成函数,就是CompletionRoutine。IofCallDriver 调用下层驱动,下层驱动处理完成之后CompletionRoutine 就会被调用。那么我们能不能hook掉查询文件的irp 的完成函数呢?调试的时候发现当 MajorFunction==IRP_MJ_DIRECTORY_CONTROL,  MinorFunction==IRP_MN_QUERY_DIRECTORY 的时候IrpStackLocation中的CompletionRoutine的是空的。如何解决呢?先总结一下,现在面临两个问题:

1 如何得到icesword下发的irp ?
2 如何为捕获到的irp设置一个callback的完成函数?

下面我来逐个突破:
  icesword毕竟还是基于os开发的东西,所以它不可能独立于os去做所有的事。就是说\\FileSystem\\ntfs 的IRP_MJ_DIRECTORY_CONTROL的处理函数它一定会被调用。既然我们不能hook这个dispatch routine,那么我们是否可以hook 这个routine中调用过的函数,然后判断函数返回地址,和dispatch routine的地址做比较以此来判断是否在查询文件。
  先看ntfs.sys的开头部分代码:
INIT:0009527E                 mov     dword ptr [esi+7Ch], offset _NtfsFsdLockControl@8 ; NtfsFsdLockControl(x,x)
INIT:00095285                 mov     dword ptr [esi+68h], offset _NtfsFsdDirectoryControl@8 ; NtfsFsdDirectoryControl(x,x)
INIT:0009528C                 mov     dword ptr [esi+50h], offset _NtfsFsdSetInformation@8 ; NtfsFsdSetInformation(x,x)
INIT:00095293                 mov     dword ptr [esi+38h], offset _NtfsFsdCreate@8 ; NtfsFsdCreate(x,x)
INIT:0009529A                 mov     dword ptr [esi+40h], offset _NtfsFsdClose@8 ; NtfsFsdClose(x,x)
INIT:000952A1                 mov     dword ptr [esi+44h], offset _NtfsFsdRead@8 ; NtfsFsdRead(x,x)
INIT:000952A8                 mov     dword ptr [esi+48h], offset _NtfsFsdWrite@8 ; NtfsFsdWrite(x,x)
INIT:000952AF                 mov     dword ptr [esi+5Ch], offset _NtfsFsdFlushBuffers@8 ; NtfsFsdFlushBuffers(x,x)
INIT:000952B6                 mov     dword ptr [esi+6Ch], offset _NtfsFsdFileSystemControl@8 ; NtfsFsdFileSystemControl(x,x)
INIT:000952BD                 mov     dword ptr [esi+80h], offset _NtfsFsdCleanup@8 ; NtfsFsdCleanup(x,x)
INIT:000952C7                 mov     dword ptr [esi+78h], offset _NtfsFsdShutdown@8 ; NtfsFsdShutdown(x,x)
INIT:000952CE                 mov     dword ptr [esi+0A4h], offset _NtfsFsdPnp@8 ; NtfsFsdPnp(x,x)
INIT:000952D8                 mov     dword ptr [esi+28h], offset _NtfsFastIoDispatch
INIT:000952DF                 mov     eax, offset _NtfsFsdDispatchWait@8 ; NtfsFsdDispatchWait(x,x)

  开头这部分是初始化驱动的分发历程,我们需要关注的是 mov     dword ptr [esi+68h], offset _NtfsFsdDirectoryControl@8 , 跟进来:
PAGE:00037FBD                 push    14Ch
PAGE:00037FC2                 push    offset unk_28848
PAGE:00037FC7                 call    __SEH_prolog
PAGE:00037FCC                 xor     edi, edi
PAGE:00037FCE                 mov     [ebp+var_1C], edi
PAGE:00037FD1                 call    ds:__imp__KeEnterCriticalRegion@0 ; KeEnterCriticalRegion()
PAGE:00037FD7                 push    1
PAGE:00037FD9                 push    1
PAGE:00037FDB                 lea     eax, [ebp+var_4C]
PAGE:00037FDE                 push    eax
PAGE:00037FDF                 call    _NtfsInitializeTopLevelIrp@12 ; NtfsInitializeTopLevelIrp(x,x,x)
PAGE:00037FE4                 mov     esi, eax
PAGE:00037FE6                 mov     [ebp+var_20], esi
PAGE:00037FE9
PAGE:00037FE9 loc_37FE9:                              ; CODE XREF: MakeRoomForAttribute(x,x,x,x)+2B19j
PAGE:00037FE9                 xor     ebx, ebx
PAGE:00037FEB                 mov     [ebp+ms_exc.disabled], ebx
PAGE:00037FEE                 cmp     [ebp+var_1C], ebx
PAGE:00037FF1                 jnz     short loc_3806C
PAGE:00037FF3                 mov     byte ptr [ebp+var_24], bl
PAGE:00037FF6                 push    [ebp+arg_4]
PAGE:00037FF9                 call    ds:__imp__IoIsOperationSynchronous@4 ; IoIsOperationSynchronous(x)   // 我想从这个函数下手
PAGE:00037FFF                 test    al, al
PAGE:00038001                 jz      short loc_38010
PAGE:00038003                 mov     byte ptr [ebp+var_24], 1
PAGE:00038007                 lea     eax, [ebp+var_15C]
PAGE:0003800D                 mov     [ebp+var_1C], eax
PAGE:00038010
PAGE:00038010 loc_38010:                              ; CODE XREF: NtfsFsdDirectoryControl(x,x)+44j
PAGE:00038010                 lea     eax, [ebp+var_1C]
PAGE:00038013                 push    eax
PAGE:00038014                 push    [ebp+var_24]
PAGE:00038017                 push    [ebp+arg_4]
PAGE:0003801A                 call    _NtfsInitializeIrpContext@12 ; NtfsInitializeIrpContext(x,x,x)

[1] [2] 下一页

  • 上一篇文章:
  • 下一篇文章: 没有了
  • 最近更新
    推荐文章 瑞星公司02月13日发布 每日计算机病毒及木马播报
    普通文章 优化C++程序编译效率的实例
    普通文章 分析蠕虫及压缩的网络流量
    推荐文章 推荐:突破Icesword实现文件隐藏
    普通文章 如何配置RadASM来支持你的编译器
    普通文章 深入剖析EFS文件加密系统
    普通文章 网络安全重心正从被动检测转向主动防御
    普通文章 洪流来袭——剖析“拒绝服务”攻击
    普通文章 明星激情照被黑客利用 三种"阴谋"方式传毒
    普通文章 节后上班当心潜伏木马 节后上班应先杀毒
    热门文章
    普通文章入侵工具Knark的分析及防范
    普通文章认清本质 计算机病毒防治常遇问题
    普通文章假日警惕虚假淘宝网诈骗
    普通文章饶过现代Anti-Rookit工具的内核模块扫描(ZT)
    普通文章WordPress WassUp插件 spy.php脚本含SQL注入漏洞
    普通文章Icesword 驱动部分分析(ZT)
    普通文章[Tips]XSS Worm Defense
    普通文章文图分析:钓鱼网站拿什么欺骗善良玩家
    普通文章Gnumeric XLS HLINK Opcode处理远程代码执行漏洞
    普通文章SwiftView ActiveX控件和浏览器插件含栈溢出漏洞
    精彩专题