阅读:2884回复:16
vcmfc:帮忙看看
用你给的这段原码!有问题啊 :QueryBuffer->NextEntryOffset 值不对啊!没转换unicode是也是这样啊!
VOID HideFile( PIRP Irp, PIO_STACK_LOCATION currentIrpStack ) { ANSI_STRING zz; UNICODE_STRING u_zz; PFILE_BOTH_DIR_INFORMATION QueryBuffer = NULL; ULONG offset = 0; ULONG currentPosition = 0; ULONG bufferLength = currentIrpStack->Parameters.QueryFile.Length; ULONG NewLength = 0; WCHAR fileNameToRemove[] = L\"TestH\"; PUCHAR startEntryToRemove = NULL; PUCHAR startNextEntry = NULL; NewLength = bufferLength; QueryBuffer = (PFILE_BOTH_DIR_INFORMATION) Irp->UserBuffer; if( QueryBuffer->NextEntryOffset > bufferLength ) return; do { offset = QueryBuffer->NextEntryOffset; DbgPrint((\"offset= %d\\n\",offset)); RtlInitUnicodeString(&u_zz,QueryBuffer->FileName); RtlUnicodeStringToAnsiString(&zz,&u_zz,TRUE); DbgPrint((\"FileName= %s\\n\",zz.Buffer)); if( strncmp(zz.Buffer, \"TestH\", 5 ) == 0 ) { startEntryToRemove = (PUCHAR) QueryBuffer; startNextEntry = (PUCHAR) QueryBuffer + offset; RtlMoveMemory( startEntryToRemove, startNextEntry, bufferLength - currentPosition - offset ); NewLength -= offset; break; } currentPosition += offset; QueryBuffer = (PFILE_BOTH_DIR_INFORMATION) ( (PUCHAR) QueryBuffer + offset ); } while( offset != 0 ); Irp->IoStatus.Information = NewLength; RtlFreeAnsiString(&zz); } :( :( :( |
|
最新喜欢:cyliu
|
沙发#
发布于:2003-02-26 16:50
这段代码是不是有错误啊1(当然除了你说的那两个以外)
QueryBuffer->NextEntryOffset 值不对啊! VOID ApcHookHideFile( PIRP Irp, PIO_STACK_LOCATION currentIrpStack ) { PFILE_BOTH_DIR_INFORMATION QueryBuffer = NULL; ULONG offset = 0; ULONG currentPosition = 0; ULONG bufferLength = currentIrpStack->Parameters.QueryFile.Length; ULONG NewLength = 0; WCHAR fileNameToRemove[] = L\"TestH\"; PUCHAR startEntryToRemove = NULL; PUCHAR startNextEntry = NULL; NewLength = bufferLength; QueryBuffer = (PFILE_BOTH_DIR_INFORMATION) Irp->UserBuffer; if( QueryBuffer->NextEntryOffset > bufferLength ) return; do { offset = QueryBuffer->NextEntryOffset; DebugPrint( ( \"HookRoutine : QUERY_DIR : TestH - ws 0xd\\n\", QueryBuffer->FileName, QueryBuffer->NextEntryOffset ) ); if( wcsncmp(QueryBuffer->FileName, fileNameToRemove, 5 ) == 0 ) { startEntryToRemove = (PUCHAR) QueryBuffer; startNextEntry = (PUCHAR) QueryBuffer + offset; RtlMoveMemory( startEntryToRemove, startNextEntry, bufferLength - currentPosition - offset ); NewLength -= offset; break; } currentPosition += offset; QueryBuffer = (PFILE_BOTH_DIR_INFORMATION) ( (PUCHAR) QueryBuffer + offset ); } while( offset != 0 ); Irp->IoStatus.Information = NewLength; } case IRP_MJ_DIRECTORY_CONTROL: if( currentIrpStack->MinorFunction == IRP_MN_QUERY_DIRECTORY ) { if( strncmp( fullPathName, \"C:\\\\0\", 3 ) == 0 ) { ApcHookHideFile( Irp, currentIrpStack ); } } break; :( |
|
|
板凳#
发布于:2003-02-26 18:31
faint..........
先传给file system后再处理。 |
|
地板#
发布于:2003-02-26 19:19
大人,不好意思吓到你了,小弟我做文件驱动才三天哪!
问题很多而且很夸张,请锏谅!(破不得以啊!) 你是说,这样调用是错的吗?我把 filemon 中irp_mj_directory_contorl 换成 case IRP_MJ_DIRECTORY_CONTROL: if( currentIrpStack->MinorFunction == IRP_MN_QUERY_DIRECTORY ) { if( strncmp( fullPathName, \"C:\\\\0\", 3 ) == 0 ) { ApcHookHideFile( Irp, currentIrpStack ); } } |
|
|
地下室#
发布于:2003-02-27 04:42
case IRP_MJ_DIRECTORY_CONTROL:
if( currentIrpStack->MinorFunction == IRP_MN_QUERY_DIRECTORY ) { .......先传给file system ApcHookHideFile( Irp, currentIrpStack ); 上面代码只提供思路,你要变通一下,而且参考代码有几种情形没有考虑,我已说明了,参考相关贴子。 |
|
5楼#
发布于:2003-02-27 11:02
感谢!达人的回复!我会再试试!知道这东西不是能几天完事。但是~~~~~~~
都快崩溃了! :( :( : |
|
|
6楼#
发布于:2003-02-27 16:34
你看,我改成这样了也不行!放到FilemonHookDone里去调hidefile也一样啊?只为了隐藏文件夹啊!
case IRP_MN_QUERY_DIRECTORY: queryDirectory = (PQUERY_DIRECTORY)¤tIrpStack->Parameters; queryFilter = NULL; if( queryDirectory->FileName ) { if( NT_SUCCESS( RtlUnicodeStringToAnsiString( &directoryFilter, queryDirectory->FileName, TRUE ))) { queryFilter = ExAllocatePool( PagedPool, directoryFilter.Length + 1 ); if( queryFilter ) { memcpy( queryFilter, directoryFilter.Buffer, directoryFilter.Length ); queryFilter[ directoryFilter.Length ] = 0; // // Massage DOS-internal wildcards // for( i = 0; i < strlen( queryFilter ); i++ ) { if( queryFilter == \'<\' ) queryFilter = \'*\'; else if( queryFilter == \'>\' ) queryFilter = \'?\'; } } RtlFreeAnsiString( &directoryFilter ); } } if( queryFilter ) { hookCompletion = LogRecord( TRUE, &seqNum, &dateTime, NULL, \"%s\\tIRP_MJ_DIRECTORY_CONTROL\\t%s\\t%s: %s\", name, fullPathName, FileInformation[queryDirectory->FileInformationClass], queryFilter ); ExFreePool( queryFilter ); } else { hookCompletion = LogRecord( TRUE, &seqNum, &dateTime, NULL, \"%s\\tIRP_MJ_DIRECTORY_CONTROL\\t%s\\t%s\", name, fullPathName, FileInformation[queryDirectory->FileInformationClass] ); } if( currentIrpStack->MinorFunction == IRP_MN_QUERY_DIRECTORY) { if(strncmp(fullPathName, \"C:\\\\0\", 3 ) == 0 ) { HideFile(Irp, currentIrpStack ); } } break; :( :( :( :( |
|
|
7楼#
发布于:2003-02-28 09:46
再说一次:
在处理之前一定要先传递给file system,你明白我说的话吗? |
|
8楼#
发布于:2003-02-28 09:48
在这个IRP处理中,如果文件系统没有处理的话,那里有目录信息,所以一定要等到file system读完目录/文件信息后,我们在接管控制,去掉我们要过滤的东东。
|
|
9楼#
发布于:2003-02-28 10:02
“所以一定要等到file system读完目录/文件信息后,我们在接管控制,去掉我们要过滤的东东。”这句话是不是意味上面的代码应该在完成例程中执行。也就是说我们从filesystem中得到QueryBuffer = (PFILE_BOTH_DIR_INFORMATION) Irp->UserBuffer;在QueryBuffer中放置的是目录信息,为了隐藏目录或文件我们QueryBuffer去掉文件(目录)名。然后回掉给用户态程序。是不是这样的呢。
|
|
|
10楼#
发布于:2003-02-28 10:27
非常感谢啊 !vcmfc我做好了!哈哈!我是在FilemonHookDone里处理的!,IoCallDriver( hookExt->FileSystem, Irp )之后。但还有
个问题在地址栏里直接键入隐藏的文件夹路径还是能显示出来啊! :) :) :) |
|
|
11楼#
发布于:2003-02-28 16:45
这简单,在IRP_MJ_CREATE中拒绝访问,不就可以了。
这要看你们的体系统了。 上面代码你要考虑其它两种情形,不然会死定了。 1.根目录下目录的处理 2.当隐藏目录是目录链中的最后一个,也要做特殊处理,这两个问题很常见。 过几天上北京工作了,不能再来了。 886各位兄弟。 |
|
12楼#
发布于:2003-02-28 17:37
感谢你再次提醒,我会改掉哪两点的!你要来北京la !一路顺风哦!
我就在北京那!用不用去接你啊??哈哈,有事qq:50156928联系咯 |
|
|
13楼#
发布于:2003-03-05 15:10
按照上面的方法,我实现了文件的隐藏,可是有一个问题不知道如何解决:比如说我们隐藏d;\\temp\\test1.txt文件,在temp只有这一个文件,跟踪发现第一个调用IRP_MN_QUERY_DIRECTORY完成时,由Irp->UserBuffer得到的QueryBuffer中的文件名位test1.txt而NextEntryOffset为0。此时该如何处置呢。我们不能像上面那样改变 Irp->UserBuffer的地址。我把Irp->UserBuffer的内容清空可是出现的是一个0字节的文件。这种情况下该如何隐藏呢?
|
|
|
14楼#
发布于:2005-02-21 09:35
try
c:\\\0 |
|
|
15楼#
发布于:2005-02-21 09:36
try again
c:\\\\0 |
|
|
16楼#
发布于:2005-02-21 10:06
这种方法能避过PJF的那个文件查看器吗??
据说他的方法是 直接构造自己的IRP给文件系统驱动,根本不通过你的过滤驱动...... |
|
|