=ku=ku=
驱动牛犊
驱动牛犊
  • 注册日期2003-01-16
  • 最后登录2010-12-02
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望23点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2885回复:16

vcmfc:帮忙看看

楼主#
更多 发布于:2003-02-26 16:42
用你给的这段原码!有问题啊 :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);
} :( :( :(

最新喜欢:

cyliucyliu
*__*
=ku=ku=
驱动牛犊
驱动牛犊
  • 注册日期2003-01-16
  • 最后登录2010-12-02
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望23点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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; :(
*__*
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-02-26 18:31
faint..........


先传给file system后再处理。
=ku=ku=
驱动牛犊
驱动牛犊
  • 注册日期2003-01-16
  • 最后登录2010-12-02
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望23点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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 );
}
}

 


*__*
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-02-27 04:42
case IRP_MJ_DIRECTORY_CONTROL:
if( currentIrpStack->MinorFunction == IRP_MN_QUERY_DIRECTORY ) {
.......先传给file system
  ApcHookHideFile( Irp, currentIrpStack );


上面代码只提供思路,你要变通一下,而且参考代码有几种情形没有考虑,我已说明了,参考相关贴子。
=ku=ku=
驱动牛犊
驱动牛犊
  • 注册日期2003-01-16
  • 最后登录2010-12-02
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望23点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-02-27 11:02
感谢!达人的回复!我会再试试!知道这东西不是能几天完事。但是~~~~~~~
都快崩溃了! :( :( :
*__*
=ku=ku=
驱动牛犊
驱动牛犊
  • 注册日期2003-01-16
  • 最后登录2010-12-02
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望23点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-02-27 16:34
你看,我改成这样了也不行!放到FilemonHookDone里去调hidefile也一样啊?只为了隐藏文件夹啊!

case IRP_MN_QUERY_DIRECTORY:
                queryDirectory = (PQUERY_DIRECTORY)&currentIrpStack->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; :( :( :( :(
*__*
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-02-28 09:46
再说一次:

在处理之前一定要先传递给file system,你明白我说的话吗?
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-02-28 09:48
在这个IRP处理中,如果文件系统没有处理的话,那里有目录信息,所以一定要等到file system读完目录/文件信息后,我们在接管控制,去掉我们要过滤的东东。
nustzhua
驱动中牛
驱动中牛
  • 注册日期2002-06-19
  • 最后登录2015-09-27
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-02-28 10:02
“所以一定要等到file system读完目录/文件信息后,我们在接管控制,去掉我们要过滤的东东。”这句话是不是意味上面的代码应该在完成例程中执行。也就是说我们从filesystem中得到QueryBuffer = (PFILE_BOTH_DIR_INFORMATION) Irp->UserBuffer;在QueryBuffer中放置的是目录信息,为了隐藏目录或文件我们QueryBuffer去掉文件(目录)名。然后回掉给用户态程序。是不是这样的呢。
不限容量的免费邮箱 www.k65.net
=ku=ku=
驱动牛犊
驱动牛犊
  • 注册日期2003-01-16
  • 最后登录2010-12-02
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望23点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-02-28 10:27
非常感谢啊 !vcmfc我做好了!哈哈!我是在FilemonHookDone里处理的!,IoCallDriver( hookExt->FileSystem, Irp )之后。但还有
个问题在地址栏里直接键入隐藏的文件夹路径还是能显示出来啊! :) :) :)
*__*
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-02-28 16:45
这简单,在IRP_MJ_CREATE中拒绝访问,不就可以了。

这要看你们的体系统了。

上面代码你要考虑其它两种情形,不然会死定了。
1.根目录下目录的处理
2.当隐藏目录是目录链中的最后一个,也要做特殊处理,这两个问题很常见。

过几天上北京工作了,不能再来了。

886各位兄弟。
=ku=ku=
驱动牛犊
驱动牛犊
  • 注册日期2003-01-16
  • 最后登录2010-12-02
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望23点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-02-28 17:37
感谢你再次提醒,我会改掉哪两点的!你要来北京la !一路顺风哦!
我就在北京那!用不用去接你啊??哈哈,有事qq:50156928联系咯
*__*
nustzhua
驱动中牛
驱动中牛
  • 注册日期2002-06-19
  • 最后登录2015-09-27
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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字节的文件。这种情况下该如何隐藏呢?
不限容量的免费邮箱 www.k65.net
shinesi
驱动牛犊
驱动牛犊
  • 注册日期2003-04-04
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-02-21 09:35
try

c:\\\0
你帮我,我帮你
shinesi
驱动牛犊
驱动牛犊
  • 注册日期2003-04-04
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-02-21 09:36
try again

c:\\\\0
你帮我,我帮你
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
16楼#
发布于:2005-02-21 10:06
这种方法能避过PJF的那个文件查看器吗??
据说他的方法是 直接构造自己的IRP给文件系统驱动,根本不通过你的过滤驱动......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
游客

返回顶部