欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

初窥卡巴斯基ARK读取MBR

来源:本站整理 作者:佚名 时间:2018-07-06 TAG: 我要投稿

背景
LONG LONG LONG AGO就发现通过Hook磁盘端口驱动程序中的IRP_MJ_SCSI派遣函数方式过不了KB了,最近又遇到这个问题就想借此机会分析一下,看看万能的KB是如何绕过Hook读取MBR的。
作为一款商用软件的KB,出于兼容性、稳定性等原因应该不会使用太特殊的方法,初步猜想会通过重载磁盘端口驱动,自建I/O通道来绕过我们读取MBR,至此我们就有了研究方向,下面来开始我们的研究。
为了验证猜想,我搭建了双机调试环境,编写了两个Windbg脚本,编译了FakeMBR驱动程序。至于双机调试环境的搭建和Windbg脚本语法在这里就不说了,具体内容可以在网上找到资料,FakeMbr的编译和一般的驱动程序编译过程无异,在这里也不说了。对了FakeMbr的代码可以在Github找到,具体链接在文章的末尾。
如果有些朋友对文章中说的相关内容不太了解,可以参考文章末尾给出的参考链接,学习相关内容。
环境
虚拟机 :VMware Workstation 12
操作系统:Microsoft Windows 7 Ultimate 6.1.7600 Build 7600 X86
调试工具:Windbg 10.0.10586.567 X86
杀毒软件:卡巴斯基全方位安全软件 18.0.0.405(h)
脚本
HelloKB.txt
$$ 功能 : Hook指定的函数地址,打印相关信息,并对CompletionRoutine进行Hook
$$ 参数1: 函数地址
$$ 参数2: HelloKBC脚本路径
$$ ---------------------------------------------------------------------------------------------------------------------
$$ $$>a dt -r2 nt!_IRP poi(@esp + 0x8)
$$ StackLocation                           kd> dt -r2 nt!_IO_STACK_LOCATION poi(poi(@esp + 0x8) + 0x60)
$$ SRB                                     kd> dt -r2 storport!_SCSI_REQUEST_BLOCK poi(poi(poi(@esp + 0x8) + 0x60) +0x4)
$$ CDB                                     kd> dt -r2 storport!_CDB10 (poi(poi(poi(@esp + 0x8) + 0x60) +0x4) + 0x30)
$$ nt!_IO_STACK_LOCATION
$$ nt!_IO_STACK_LOCATION.CompletionRoutine kd> ? poi(poi(poi(@esp + 0x8) + 0x60) + 0x1c)
$$ storport!_SCSI_REQUEST_BLOCK
$$ storport!_SCSI_REQUEST_BLOCK.CdbLength  kd> ? poi(poi(poi(poi(@esp + 0x8) + 0x60) +0x4) + 0xa) & 0x0000`00ff
$$ stortport!_CDB10
$$ stortport!_CDB10.LogicalBlockByte0      kd> ? poi((poi(poi(poi(@esp + 0x8) + 0x60) +0x4) + 0x30) + 0x2) & 0x0000`00ff
$$ stortport!_CDB10.LogicalBlockByte1      kd> ? poi((poi(poi(poi(@esp + 0x8) + 0x60) +0x4) + 0x30) + 0x3) & 0x0000`00ff
$$ stortport!_CDB10.LogicalBlockByte2      kd> ? poi((poi(poi(poi(@esp + 0x8) + 0x60) +0x4) + 0x30) + 0x4) & 0x0000`00ff
$$ stortport!_CDB10.LogicalBlockByte3      kd> ? poi((poi(poi(poi(@esp + 0x8) + 0x60) +0x4) + 0x30) + 0x5) & 0x0000`00ff
$$ ---------------------------------------------------------------------------------------------------------------------
bp10000 ${$arg1} "
    r $t1=poi(poi(poi(poi(@esp + 0x8) + 0x60) +0x4) + 0xa) & 0x0000`00ff
    as /x ${/v:Length} $t1
    .echo
        .printf\"${$arg1} Length:%i\",$t1
    .echo
    .block
    {
        .if(${Length} == 0xa)
        {
            ad ${/v:Length}
            r $t2=poi((poi(poi(poi(@esp + 0x8) + 0x60) +0x4) + 0x30) + 0x0) & 0x0000`ffff
            .echo
                .printf\"${$arg1} OpCode:%i\",$t2
            .echo           
            .if($t2 == 0x28)
            {
                r $t3=poi((poi(poi(poi(@esp + 0x8) + 0x60) +0x4) + 0x30) + 0x2) & 0x0000`00ff
                r $t4=poi((poi(poi(poi(@esp + 0x8) + 0x60) +0x4) + 0x30) + 0x3) & 0x0000`00ff
                r $t5=poi((poi(poi(poi(@esp + 0x8) + 0x60) +0x4) + 0x30) + 0x4) & 0x0000`00ff

[1] [2] [3] [4] [5]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载