scutfang
驱动牛犊
驱动牛犊
  • 注册日期2007-03-18
  • 最后登录2008-02-29
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
阅读:3935回复:12

求助:SSDT钩子

楼主#
更多 发布于:2007-05-19 14:47
各位驱动大牛:
     有个问题求教,我想做一个系统创建文件的日志,想法是,用SSDT钩子ZwCreateFile()函数,然后在自己NewZwCreateFile()函数里面写入日志文件,可是这是遇到一个问题,就是写日志文件同样需要ZwCreateFile()以打开一个文件句柄,用来操作自己的日志文件,因为这时系统的ZwCreateFile()已经被我的NewZwCreateFile()替换,所以这时我想应该是调用老得系统ZwCreate
File(),可是每次调用总是得不到文件句柄,不知道我错在哪?希望大牛给我提示,或者给新的思路,实现,创建文件时的同时写入日志,什么时间创建了什么文件,谢谢。下面是我的代码,每次我打开log.log句柄的返回值总是0Xc0000005
NTSTATUS
NTAPI
NewNtCreateFile(
                PHANDLE FileHandle,
                ACCESS_MASK DesiredAccess,
                POBJECT_ATTRIBUTES ObjectAttributes,
                PIO_STATUS_BLOCK IoStatusBlock,
                PLARGE_INTEGER AllocationSize OPTIONAL,
                ULONG FileAttributes,
                ULONG ShareAccess,
                ULONG CreateDisposition,
                ULONG CreateOptions,
                PVOID EaBuffer OPTIONAL,
                ULONG EaLength)
{
    int rc;
    CHAR aProcessName[PROCNAMELEN];

    NTSTATUS status;
    OBJECT_ATTRIBUTES oa;
    IO_STATUS_BLOCK iostatus;
    HANDLE hfile=NULL;              
    char pathname[256]={0};
    UNICODE_STRING full_pathname;

    ANSI_STRING asFileName;


    GetProcessName( aProcessName );
    DbgPrint("rootkit: NewNtCreateFile() from %s\n.The file name is %S\n", aProcessName,ObjectAttributes->ObjectName->Buffer);

    memcpy(pathname,"\\??\\c:\\log.log",strlen("\\??\\c:\\log.log"));

    RtlInitAnsiString(&asFileName,pathname);
    RtlAnsiStringToUnicodeString(&full_pathname,&asFileName,1);

    DbgPrint("path:%S\n", full_pathname.Buffer);

    InitializeObjectAttributes(&oa, &full_pathname, OBJ_CASE_INSENSITIVE, NULL, NULL);
    rc=((NTCREATEFILE)(OldNtCreateFile)) (&hfile,
        DesiredAccess,  
        &oa,
        &iostatus,
        AllocationSize,
        FileAttributes,
        ShareAccess,
        CreateDisposition,
        CreateOptions,
        EaBuffer,
        EaLength);

    if (!hfile)
    {
        DbgPrint("rootkit: ZwCreateFile Fail\n");
    }
    else
    {
        DbgPrint("rootkit: FileHandle is 0x%X\n", hfile);
        ZwClose(hfile);
    }
    DbgPrint("rootkit: NtCreateFile : rc = %x\n", rc);


    rc=((NTCREATEFILE)(OldNtCreateFile)) (
        FileHandle,
        DesiredAccess,
        ObjectAttributes,
        IoStatusBlock,
        AllocationSize,
        FileAttributes,
        ShareAccess,
        CreateDisposition,
        CreateOptions,
        EaBuffer,
        EaLength);
    if(FileHandle)
    {
        DbgPrint("rootkit: FileHandle is 0x%X\n", *FileHandle);
    }
    else DbgPrint("rootkit: FileHandle is NULL\n");
    DbgPrint("rootkit: NtCreateFile : rc = %x\n", rc);
    return rc;
}

最新喜欢:

linshierlinshi...
kcrazy
驱动牛犊
驱动牛犊
  • 注册日期2006-02-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分252分
  • 威望37点
  • 贡献值1点
  • 好评度25点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-05-19 15:33
引用第0楼scutfang于2007-05-19 14:47发表的 求助:SSDT钩子 :

DbgPrint("rootkit: NtCreateFile : rc = %x\n", rc);



返回什么错?
scutfang
驱动牛犊
驱动牛犊
  • 注册日期2007-03-18
  • 最后登录2008-02-29
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-05-19 21:48
0Xc0000005
GNiDiA
驱动小牛
驱动小牛
  • 注册日期2006-10-11
  • 最后登录2017-10-09
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望145点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2007-05-19 22:06
写错了,更正一下,指针参数的地址应该是小于MM_USER_PROBE_ADDRESS
具体地说,就是NtCreateFile的1,3,4参数及OBJECT_ATTRIBUTES.ObjectName.Buffer这几个指针,
否则将返回C0000005错误。
troylees
驱动牛犊
驱动牛犊
  • 注册日期2006-05-10
  • 最后登录2009-05-01
  • 粉丝0
  • 关注0
  • 积分678分
  • 威望128点
  • 贡献值0点
  • 好评度67点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-05-20 02:00
呵呵,同时天涯沦落人呀,我到现在也不知道究竟是什么问题,不过可以肯定的一点是Hook了以后才有的,我也试过应该没有重入的问题,我改变思路了,现在是Hook之前创建文件,UnHook之后写文件。问题还没有解决之前只有这样用咯。还有我的帖子,大家有兴趣看看吧,谢谢了
http://bbs.driverdevelop.com/htm_data/16/0705/101801.html
scutfang
驱动牛犊
驱动牛犊
  • 注册日期2007-03-18
  • 最后登录2008-02-29
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-05-20 12:47
引用第3楼GNiDiA于2007-05-19 22:06发表的  :
写错了,更正一下,指针参数的地址应该是小于MM_USER_PROBE_ADDRESS
具体地说,就是NtCreateFile的1,3,4参数及OBJECT_ATTRIBUTES.ObjectName.Buffer这几个指针,
否则将返回C0000005错误。



具体怎么改?谢谢,小弟是菜鸟!
hxfjb
驱动牛犊
驱动牛犊
  • 注册日期2004-06-22
  • 最后登录2008-07-14
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-05-20 15:43
1 你的流程非常不好。调用ZwCreateFile需要很多内部处理,如果你的Hook函数每次都要调用一下原始的函数会导致性能下降很多。所以建议你在驱动的入口处调用该函数得到log的句柄,而在你的hook函数中仅仅写日志文件。
2 你需要调用QueryObject来得到目的文件的名称。
hxfjb
驱动牛犊
驱动牛犊
  • 注册日期2004-06-22
  • 最后登录2008-07-14
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-05-20 15:46
第二条搞错了。嘿嘿。
GNiDiA
驱动小牛
驱动小牛
  • 注册日期2006-10-11
  • 最后登录2017-10-09
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望145点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2007-05-20 23:12
用到指针的地方都用ZwAllocateVirtualMemory来申请内存作为参数,不要用局部变量

ps. 为什么不用IoCreateFile()呢?
scutfang
驱动牛犊
驱动牛犊
  • 注册日期2007-03-18
  • 最后登录2008-02-29
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-05-21 11:16
呵呵,问题已经解决,谢谢大家的关心,问题应该是中断级别的问题吧IRQL=DISPATCH_LEVEL 下是不能创建文件的,查了些大牛写的东西,解决方案是,在Driverentry()中创建先的系统线程,新的系统线程,一直运行于while循环中等待信号量,而每次调用NewNtCreateFile()都产生一个信号量,新建的线程是运行在Passive_level下的,所以每次都输出正常。
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
10楼#
发布于:2007-05-21 13:18
DISPATCH_LEVEL 不能切换线程。。当然不能创建文件了(需要切换到文件系统驱动等)
驱动开发者 呵呵
super9
驱动牛犊
驱动牛犊
  • 注册日期2008-08-06
  • 最后登录2009-04-29
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望99点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2008-10-11 22:06
引用第9楼scutfang于2007-05-21 11:16发表的  :
呵呵,问题已经解决,谢谢大家的关心,问题应该是中断级别的问题吧IRQL=DISPATCH_LEVEL 下是不能创建文件的,查了些大牛写的东西,解决方案是,在Driverentry()中创建先的系统线程,新的系统线程,一直运行于while循环中等待信号量,而每次调用NewNtCreateFile()都产生一个信号量,新建的线程是运行在Passive_level下的,所以每次都输出正常。

请问具体怎么实现啊?没有源代码,看着好抽象
jorenboy
驱动牛犊
驱动牛犊
  • 注册日期2008-07-19
  • 最后登录2010-03-21
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望178点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2008-10-29 22:34
没有进行参数检查啊!
游客

返回顶部