阅读:3845回复:20
文件过滤驱动是否能在系统启动的时候创建读写自己的日志文件?百分相送,需要完整的例子。
文件过滤驱动是否能在系统启动的时候创建读写自己的日志文件,例如拦截IRP_MJ_CREATE,当系统调用KERNEL32.dll时候进入我的MyCreate函数中,这个时候我将文件名写入日志,这个时候会蓝屏并自动reboot,有谁知道为什么?怎么解决这个问题?百分相送,需要完整的例子。filter@redsec.org
注释:当启动启动完也就是显示出桌面的时候读写日志文件操作一切正常,读写操作用ZwCreateFile,ZwWriteFile,ZwReadFile函数完成。 驱动启动类型为start:0 [编辑 - 2/7/05 by paladinii] |
|
|
沙发#
发布于:2005-02-03 21:03
怎么没人应答阿?再加100分。牛人们现身吧。别告诉我这个问题在这里解决不了,还得去OSR?
|
|
|
板凳#
发布于:2005-02-04 00:20
首先,文件过滤驱动应该不能引导启动。你可以把START 设置为 1 由I/O系统启动。
我以前写过一个把IRP_MJ_CREATE里拦截到文件名写到一个你指定的文件中。我是用一个系统线程来写文件。这种方法是可以实现的。 |
|
地板#
发布于:2005-02-04 09:52
谢谢duanran的回答,能不能把你的例子发给我参考一下,或者写文件的线程的片断也可。谢谢! paladin@redsec.org
|
|
|
地下室#
发布于:2005-02-04 13:49
typedef struct _FILELIST {
TCHAR szFullPathName[PATH_LEN + 1]; LIST_ENTRY FileListNext; }FILELIST, *PFILELIST; typedef struct _GLOBALS_FILELIST_INFO { HANDLE g_FileListHandle; PVOID g_ThreadObject; BOOLEAN g_ThreadShouldStop; KEVENT g_FileListEvent; LIST_ENTRY g_FileListHead; KSPIN_LOCK g_FileListSpinLock; }GLOBALS_FILELIST_INFO, *PGLOBALS_FILELIST_INFO; static GLOBALS_FILELIST_INFO g_FileList_Info; VOID FileListThread (IN PVOID Context) { ULONG uWriteSize = PATH_LEN * sizeof(TCHAR); PLIST_ENTRY ListEntry = NULL; PFILELIST pFileListNode = NULL; IO_STATUS_BLOCK IoStatusBlock; PGLOBALS_FILELIST_INFO pFileListInfo = (PGLOBALS_FILELIST_INFO)Context; KeSetPriorityThread( KeGetCurrentThread(), LOW_REALTIME_PRIORITY); while( TRUE ) { KeWaitForSingleObject( &pFileListInfo->g_FileListEvent, Executive, KernelMode, FALSE, NULL ); while( ListEntry = ExInterlockedRemoveHeadList ( &pFileListInfo->g_FileListHead, &pFileListInfo->g_FileListSpinLock) ) { pFileListNode = (PFILELIST)CONTAINING_RECORD(ListEntry, FILELIST, FileListNext); ZwWriteFile( pFileListInfo->g_FileListHandle, NULL, NULL, NULL, &IoStatusBlock, pFileListNode->szFullPathName, uWriteSize, NULL, NULL ); ExFreePool(pFileListNode); } if( pFileListInfo->g_ThreadShouldStop ) { ZwClose(pFileListInfo->g_FileListHandle); PsTerminateSystemThread(STATUS_SUCCESS); } } } NTSTATUS FileListOpenFile(WCHAR *wFileName) { NTSTATUS ntstatus = STATUS_SUCCESS; UNICODE_STRING uniFileName; IO_STATUS_BLOCK IoStatusBlock; OBJECT_ATTRIBUTES ObjectAttributes; RtlInitUnicodeString(&uniFileName, wFileName); InitializeObjectAttributes( &ObjectAttributes, &uniFileName, OBJ_CASE_INSENSITIVE, NULL, NULL ); ntstatus = ZwCreateFile(&g_FileList_Info.g_FileListHandle, GENERIC_READ | GENERIC_WRITE, &ObjectAttributes, &IoStatusBlock, 0, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OVERWRITE_IF, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0 ); if( !NT_SUCCESS(ntstatus) ) { //DbgPrint("Cannot ZwCreateFile %S : 0x%x\n", wFileName, ntstatus); } return ntstatus; } NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { ............. ntStatus = FileListOpenFile(wFileName); if (!NT_SUCCESS(ntStatus)){ //DbgPrint("Cannot Open FileList.lst\n"); } KeInitializeSpinLock(&g_FileList_Info.g_FileListSpinLock); KeInitializeEvent( &g_FileList_Info.g_FileListEvent, SynchronizationEvent, FALSE ); InitializeListHead(&g_FileList_Info.g_FileListHead); g_FileList_Info.g_ThreadShouldStop = FALSE; ntStatus = PsCreateSystemThread( &thread_handle, (ACCESS_MASK) 0L, NULL, NULL, NULL, FileListThread, &g_FileList_Info ); if (!NT_SUCCESS(ntStatus)){ //DbgPrint("FileMon: Create System Thread Failed\n"); } ntStatus = ObReferenceObjectByHandle( thread_handle, THREAD_ALL_ACCESS, NULL, KernelMode, &g_FileList_Info.g_ThreadObject, NULL ); if (!NT_SUCCESS(ntStatus)) { ZwClose(thread_handle); g_FileList_Info.g_ThreadShouldStop = TRUE; KeSetEvent( &g_FileList_Info.g_FileListEvent, (KPRIORITY) 0, FALSE); } ZwClose(thread_handle); } IRP_MJ_CREATE Routine 里加入下面代码 if( IsTerminateThread == FALSE ) { pFileListNode = (PFILELIST)ExAllocatePool(NonPagedPool, sizeof(FILELIST)); if( pFileListNode != NULL ) { memset(pFileListNode->szFullPathName, 0, sizeof(pFileListNode->szFullPathName)); // fullPathName 是在IRP_MJ_CREATE中得到的文件完整路径 _tcsncpy(pFileListNode->szFullPathName, fullPathName, PATH_LEN); ExInterlockedInsertTailList( &g_FileList_Info.g_FileListHead, &pFileListNode->FileListNext, &g_FileList_Info.g_FileListSpinLock ); KeSetEvent( &g_FileList_Info.g_FileListEvent, (KPRIORITY) 0, FALSE); } else { g_FileList_Info.g_ThreadShouldStop = TRUE; KeSetEvent( &g_FileList_Info.g_FileListEvent, (KPRIORITY) 0, FALSE); } |
|
5楼#
发布于:2005-02-04 17:43
会不会有IRP_MJ_CREATE重入的问题?
恳请把完整的代码发给我的邮箱里 谢谢! 对了,先给分,目前只能给50分,我会再开几个贴子,到时你只要随便留言我就会给分的。 [编辑 - 2/4/05 by paladinii] |
|
|
6楼#
发布于:2005-02-04 23:50
你说的很对。
所以我在驱动入口中用ZwCreateFile来打开你要写的文件,然后用全局变量来保存句柄。系统线程只用来写文件,这样就避开IRP_MJ_CREATE的重入问题了。 你用FILEMON把我贴子中的代码加入相应的地方就可以了。 |
|
7楼#
发布于:2005-02-05 09:26
ok, 我去试试。
|
|
|
8楼#
发布于:2005-02-06 13:22
还有个问题,如果我每次要打开的文件都不同该怎么处理呢?或者说我想截获类似kernel32.DLL等这样的系统文件调用,然后我先去打开该文件,然后才向下传递给底层的文件驱动。这个时候该怎么处理呢?
另外,怎样保证我的过滤驱动在kernel32.dll之前启动,请高人指点,分数仍然有效。想要多少分都可以,只要有本事拿就行。最好附有例子代码或者发到我信箱。 filter@redsec.org [编辑 - 2/6/05 by paladinii] [编辑 - 2/7/05 by paladinii] |
|
|
9楼#
发布于:2005-02-07 18:37
大家是不是都准备过年了?自己顶!
祝大家新春愉快,身体健康! 来年到这里转转,有能耐的给回个贴子,很急阿!大虾们。 |
|
|
10楼#
发布于:2005-02-08 17:36
自己构造IRP。
设置驱动是IO系统启动,并加入FILE SYSTEM组,应该可以保证在KERNEL.DLL之前启动。我曾经可以记录到KERNEL.DLL的加载。 |
|
11楼#
发布于:2005-02-09 13:55
感谢楼上兄弟,不过能否说的详细点?
设置驱动是IO系统启动,并加入FILE SYSTEM组,应该可以保证在KERNEL.DLL之前启动。我曾经可以记录到KERNEL.DLL的加载。 |
|
|
12楼#
发布于:2005-02-10 21:47
在你的驱动注册表键值里。start = 1 Group = FILE SYSTEM
这里需要注意几个问题,我是曾经遇到过的,我也一起贴上来。 驱动的启动类型为I/O启动时(Start = 1),在驱动入口点需要注意以下问题: 当I/O系统启动Start为1的驱动时,这时windows系统正在完成Ntoskrnl第二个启动阶段的工作,在此时注册表只有HAREWARE和SYSTEM两个键值。对象管理器创建了名字空间跟目录、ObjectType目录、\??目录和链接到\??目录的\DosDevices。 所以在写驱动入口例程时,我们不能对注册表其他键值进行访问;不能创建命名对象因为这时对象管理器名字空间没有BaseNameObjects这个目录。 |
|
13楼#
发布于:2005-02-16 10:39
duanran:
驱动的启动类型为I/O启动时(Start = 1),在驱动入口点需要注意以下问题: 这些你是怎么知道的?是自己总结的经验?跟踪调试的结论还是看其他的资料得出的?有没有相关的资料或者书籍介绍一下,谢谢! |
|
|
14楼#
发布于:2005-02-16 18:49
自己顶!!!
[编辑 - 2/19/05 by paladinii] |
|
|
15楼#
发布于:2005-02-19 18:54
各位大虾有好招没有??
|
|
|
16楼#
发布于:2005-02-26 10:26
自己在顶!
|
|
|
17楼#
发布于:2005-03-02 08:50
duanran: [quote]驱动的启动类型为I/O启动时(Start = 1),在驱动入口点需要注意以下问题: 这些你是怎么知道的?是自己总结的经验?跟踪调试的结论还是看其他的资料得出的?有没有相关的资料或者书籍介绍一下,谢谢! [/quote] 是啊,教我们学习的方法和解决我们的问题是同样重要的。大侠能告诉方法么? |
|
18楼#
发布于:2005-03-02 09:21
呵呵,我问的这个问题有点弱了。自己问完才发现难怪没有人回答。cicada, 我来给你回答吧。
Windows Internals 有详细的介绍I/O管理器、对象管理器怎么来创建名字空间。最后,详细介绍了系统引导的过程。建议你看看这本书。 |
|
|
19楼#
发布于:2005-06-25 14:46
我参考了这里的代码,但结果是ZwCreateFile()打开文件成功,但ZwWriteFile()不成功,不知为什么
|
|
上一页
下一页