首页
社区
课程
招聘
[己解决]如何从一个文件的FILE_OBJECT得到该文件的完整路径?
发表于: 2008-3-7 11:25 18485

[己解决]如何从一个文件的FILE_OBJECT得到该文件的完整路径?

2008-3-7 11:25
18485

从FILE_OBJECT结构体中的Filename属性可以得到该文件的文件名,例如:abc.exe
另外从FILE_OBJECT结构体中的RelatedFileObject结构体下的Filename还可以进一步得到该文件的相对路径,例如:\AAAA\BBBB\CCCC

这样综合起来,我只能得到该文件没有盘符的路径:\AAAA\BBBB\CCCC\abc.exe

因此我的问题是,从FILE_OBJECT结构体中如何得到该文件所在的盘符信息?谢谢!


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (11)
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
2
http://www.debugman.com/read.php?tid=813
2008-3-7 11:31
0
雪    币: 66
活跃值: (15)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
3
真逗, debugman变成了第八个男人~ 这绿帽子戴得也太多了~
2008-3-7 15:02
0
雪    币: 222
活跃值: (44)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
4
多谢!
通过ObQueryNameString(file, fileNameInformation, 1024, &retSize); 
最终得到了该文件的物理路径,例如:\Device\HarddiskVolume1\AAAA\BBBB\CCCC\abc.exe

基本上这就差不多了,\Device\HarddiskVolume1 就是c:

另外,ObQueryNameString函数需要在驱动中引入一个头文件:#include "ntifs.h"
这里顺便上传上来!如何和ntddk.h中的定义重复了,直接把ntifs.h中的定义注释掉就好了!

ntifs.rar
上传的附件:
2008-3-7 16:51
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
RtlVolumeDeviceToDosName
2008-3-7 22:14
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
6
要邪恶方法,不要用文件路径或者名称来思考~
2008-3-7 23:22
0
雪    币: 222
活跃值: (44)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
7
多谢5楼!同时这两天看了看sysinternal的FileMon和RegMon,颇有收获!

本问题,从FILE_OBJECT到该文件的完整路径的方法,我个人总结如下:
//相关变量
HANDLE filehandle=0;
PFILE_OBJECT file=0;
PFILE_OBJECT relatedfile=0;
POBJECT_HANDLE_INFORMATION info=0; 
char filefullname_c[1024];
ANSI_STRING filefullname_a; 
UNICODE_STRING filefullname_u;
int relatedfilelength;
POBJECT_NAME_INFORMATION      fileNameInformation;
ULONG retSize;

//先得到盘符
RtlVolumeDeviceToDosName(file->DeviceObject,&filefullname_u);
RtlUnicodeStringToAnsiString(&filefullname_a,&filefullname_u,1);
strncpy(filefullname_c,filefullname_a.Buffer,filefullname_a.Length); 
filefullname_c[filefullname_a.Length]='\0';
relatedfilelength=filefullname_a.Length;

//相对路径
relatedfile=file->RelatedFileObject;
RtlUnicodeStringToAnsiString(&filefullname_a,&relatedfile->FileName,1);
strncat(filefullname_c,filefullname_a.Buffer,filefullname_a.Length); 
filefullname_c[relatedfilelength+filefullname_a.Length]='\0';
relatedfilelength+=filefullname_a.Length;

//文件名
RtlUnicodeStringToAnsiString(&filefullname_a,&file->FileName,1);
strcat(filefullname_c,"\\");
strncat(filefullname_c,filefullname_a.Buffer,filefullname_a.Length);
filefullname_c[relatedfilelength+filefullname_a.Length+1]='\0';


最终的文件路径就放在:filefullname_c
2008-3-9 02:24
0
雪    币: 222
活跃值: (44)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
8
上面这段代码可以做成一个函数,只要输入一个文件的FILE_OBJECT对象,就能输出该文件的完整路径(DosName)

哈哈!希望对大家有用!
2008-3-9 02:27
0
雪    币: 228
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼主看的是什么?我也很想了解这方面的信息,方便的话能给我一份么?非常感谢.
我的邮箱:korall@163.com
2008-3-17 13:45
0
雪    币: 222
活跃值: (44)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
10
看的 sysinternal的FileMon和RegMon
2008-3-18 19:42
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
不错!学习一下
2008-3-19 00:42
0
雪    币: 29
活跃值: (61)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
谢谢了
2017-7-10 10:39
0
游客
登录 | 注册 方可回帖
返回
//