您现在的位置: 捷凌网安 >> 文章中心 >> 黑客攻防 >> 正文
突破Icesword实现文件隐藏

作者:佚名 责任编辑:左决 点击数: 更新时间:2008-2-12 8:17:24

先介绍一下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] 下一页

  • 上一篇文章:

  • 下一篇文章:
  •  
    最进更新
    普通文章瑞星公司06月04日发布 每日计06-04
    普通文章陕西省地震局网站两次遭到"黑06-04
    普通文章谨防"Flash蛀虫"病毒 已感染06-04
    普通文章安全预警:“肉鸡猎人”抓肉06-04
    普通文章灰鸽子伪装成MSN、QQ等常用图06-04
    普通文章微软:Safari浏览器存在安全06-04
    普通文章中国黑客被疑导致美国2003年06-04
    普通文章微软建议用户暂停用苹果Safa06-04
    普通文章台北世贸中心官网被挂马06-04
    普通文章电脑身份验证无处不在 让黑客06-04
     
    推荐文章
    推荐文章触目惊心 专家解读黑色产业链06-04
    推荐文章网络黑色产业链日渐成型 奥运06-04
    推荐文章保护DNS服务器十大技巧06-04
    推荐文章Vista在非常规状态下数据备份06-04
    推荐文章Linux IPv6环境下DNS服务器配05-01
    推荐文章信息安全:阻止SSH口令尝试工05-01
    推荐文章解决网内终端无法通信故障05-01
    推荐文章熟透各种特殊IP地址 将IP藏一05-01
    推荐文章IE用户减少,黑客盯上Safari 05-01
    推荐文章我国网络安全形势非常严峻 应04-30
     
    热点文章 
    普通文章灰鸽子伪装成MSN、QQ等常用图06-04
    普通文章中国黑客被疑导致美国2003年06-04
    普通文章电脑身份验证无处不在 让黑客06-04
    推荐文章触目惊心 专家解读黑色产业链06-04
    普通文章Windows系统用户摆脱黑客攻击06-04
    普通文章病毒导致输入法无法切换的处06-04
    普通文章Informix注入整理05-23
    普通文章Cookies的注入方法和原理05-23
    普通文章SQL注射修改难猜解的MD505-23
    普通文章黑客眼中的OpenSSL:强大的密05-05

    | 设为首页 | 加入收藏 | 联系站长 | 广告服务 | 友情链接 | 版权申明 | 网站地图 |

    在线交流 捷凌网安主群:51649627
    Copyright 2007-2008 © 捷凌网安. All rights reserved.
    备案序号:蜀ICP备08001812号