阅读:3935回复:12
求助:SSDT钩子
各位驱动大牛:
有个问题求教,我想做一个系统创建文件的日志,想法是,用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; } |
|
最新喜欢:linshi... |
沙发#
发布于:2007-05-19 15:33
引用第0楼scutfang于2007-05-19 14:47发表的 求助:SSDT钩子 : 返回什么错? |
|
板凳#
发布于:2007-05-19 21:48
0Xc0000005
|
|
地板#
发布于:2007-05-19 22:06
写错了,更正一下,指针参数的地址应该是小于MM_USER_PROBE_ADDRESS
具体地说,就是NtCreateFile的1,3,4参数及OBJECT_ATTRIBUTES.ObjectName.Buffer这几个指针, 否则将返回C0000005错误。 |
|
地下室#
发布于:2007-05-20 02:00
呵呵,同时天涯沦落人呀,我到现在也不知道究竟是什么问题,不过可以肯定的一点是Hook了以后才有的,我也试过应该没有重入的问题,我改变思路了,现在是Hook之前创建文件,UnHook之后写文件。问题还没有解决之前只有这样用咯。还有我的帖子,大家有兴趣看看吧,谢谢了
http://bbs.driverdevelop.com/htm_data/16/0705/101801.html |
|
5楼#
发布于:2007-05-20 12:47
引用第3楼GNiDiA于2007-05-19 22:06发表的 : 具体怎么改?谢谢,小弟是菜鸟! |
|
6楼#
发布于:2007-05-20 15:43
1 你的流程非常不好。调用ZwCreateFile需要很多内部处理,如果你的Hook函数每次都要调用一下原始的函数会导致性能下降很多。所以建议你在驱动的入口处调用该函数得到log的句柄,而在你的hook函数中仅仅写日志文件。
2 你需要调用QueryObject来得到目的文件的名称。 |
|
7楼#
发布于:2007-05-20 15:46
第二条搞错了。嘿嘿。
|
|
8楼#
发布于:2007-05-20 23:12
用到指针的地方都用ZwAllocateVirtualMemory来申请内存作为参数,不要用局部变量
ps. 为什么不用IoCreateFile()呢? |
|
9楼#
发布于:2007-05-21 11:16
呵呵,问题已经解决,谢谢大家的关心,问题应该是中断级别的问题吧IRQL=DISPATCH_LEVEL 下是不能创建文件的,查了些大牛写的东西,解决方案是,在Driverentry()中创建先的系统线程,新的系统线程,一直运行于while循环中等待信号量,而每次调用NewNtCreateFile()都产生一个信号量,新建的线程是运行在Passive_level下的,所以每次都输出正常。
|
|
10楼#
发布于:2007-05-21 13:18
DISPATCH_LEVEL 不能切换线程。。当然不能创建文件了(需要切换到文件系统驱动等)
|
|
|
11楼#
发布于:2008-10-11 22:06
引用第9楼scutfang于2007-05-21 11:16发表的 : 请问具体怎么实现啊?没有源代码,看着好抽象 |
|
12楼#
发布于:2008-10-29 22:34
没有进行参数检查啊!
|
|