liuyang714
驱动牛犊
驱动牛犊
  • 注册日期2003-06-04
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2721回复:23

Hook System Service 的问题

楼主#
更多 发布于:2003-07-17 15:18
各位老大,我写了一个对 System ZwCreateFile 的 Hook,用来把系统对某个特定的文件的读写重定向到不同的目标文件中去,比如说当系统读 C:\\1.txt 时,我必需根据当前的登陆用户,让系统读到的是 C:\\user\\1.txt。

现在所有事情都搞定了,除开最后一步,当监测到系统读写 C:\\1.txt 时,我调用 RealNtCreateFile 希望打开 C:\\user\\1.txt 然后返回对它的句柄,但是此时系统却提示我没有权限,这是什么原因呢?还有我在 HookZwCreateFile 里面试图对任何其它文件进行打开操作都一样,都提示我没有权限。

不知达到我的重定向目的,是不是一定只有 Hook ZwCreateFile 一种方法呢?通过写 File System Driver 有没有可能实现这个功能?

不好意思,我接触驱动开发才几周时间,有很多都不懂,见笑了。
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-17 15:32
IFS FILTER最简单,看webcrazy的做法。


不要10行代码。
chacker
驱动小牛
驱动小牛
  • 注册日期2002-11-22
  • 最后登录2007-11-15
  • 粉丝0
  • 关注0
  • 积分193分
  • 威望20点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-17 15:49
是不是没有ring0呢?说错别见笑! :)
驱动要有ring0吗?
liuyang714
驱动牛犊
驱动牛犊
  • 注册日期2003-06-04
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-17 16:14
to vcmfc
谢谢,想不到的确有人和我有同样的需求,不过他的网站上没有提供源代码,还是没有头绪啊?
用 IFS FILTER 是不是实现起来比较简单啊?不知我从头开始看 ifs 驱动一个星期之内可不可以搞得定,没办法,项目说来就来,也不打个招呼,逼得紧啊。 :(

to chacker
在驱动里都是 ring0 吧。
liuyang714
驱动牛犊
驱动牛犊
  • 注册日期2003-06-04
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-19 09:56
在看《Windows NT File System Internals》,晕死,700 多页!没半个月是看不完的了。:(

在被 hook 的 ZwCreateFile 里面为什么不能够调用自己的 ZwCreateFile,有哪位 DX 知道吗?好像是权限问题,也许与核心堆栈与用户堆栈有关吧,把用户提供的参数作为参数调用就可以,自己分配内存建立的参数则发生权限不够的错误。
lu0
lu0
论坛版主
论坛版主
  • 注册日期2001-06-10
  • 最后登录2016-04-05
  • 粉丝2
  • 关注0
  • 积分-6311分
  • 威望21111点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-07-19 12:16
HOOK可以调用ZWCREATEFILE, 你自己考虑过重入的问题么?
Regards, Lu Lin Webmaster of Inside Programming http://www.lu0s1.com
liuyang714
驱动牛犊
驱动牛犊
  • 注册日期2003-06-04
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-07-19 12:37
我的意思是调用原来的被 hook 的 ZwCreateFile,也就是被 Hook 之前的那个 CreateFile,应该没有重入的问题吧?
SupermiLG
驱动牛犊
驱动牛犊
  • 注册日期2003-01-28
  • 最后登录2006-02-03
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-07-21 00:34
重解析绝对不是这样做的。Create File的机制满复杂的。
我可以给你一段代码。不过,我是大三的学生,我希望知道外界的情况,也希望寻找商机。直说吧,为了购买硬件继续研究系统,我希望弄点小Money,校园是个闭塞的环境,我希望在外界也有些同行。你只要告诉我你的单位,及开发的目的,我会把代码发给你。算是交个朋友,E-mail给我吧,13574849558@hnmail.com
liuyang714
驱动牛犊
驱动牛犊
  • 注册日期2003-06-04
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-07-21 09:19
你好,给你的邮件发不出,还是发到这里好了。

我们是一家美资公司,总部接美国的项目到我们这边的分公司来开发,做的事情很杂,主要是看客户的意思了,这次这个 driver 也是临时上马,因此才会有这么多问题,研究了一个月,其实用开始的一种方法也差不多做好了,只不过不完美罢了。
购买代码是公司行为,我没有这个权利,不好意思哦。我正在尝试用 fsd filter driver 来做,因为当前问题解决得不是很完美,心里总是觉得看着有点不爽。

你是株州的吗?
SupermiLG
驱动牛犊
驱动牛犊
  • 注册日期2003-01-28
  • 最后登录2006-02-03
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-07-21 11:49
请不要查我的手机号,我的学校在湖南,是上次全国计算机系实力排名第一的学校(不是清华),当然如果你不愿发邮件,我可以把部分关键代码贴上来,让大家批评指正,程序比较长,我不能全贴,见谅。我又没说要你的Money:),仍旧可以通过邮件找我。想一个星期学会FSD的开发,可能性不太大,除非你有很深DDK开发经历。有点泼冷水了,不过还是希望下面的代码能给你一点帮助。

DbgPrint((\"REPARSE in create:\"));

CUString CUTargetName(&AnsiSource.Buffer[2]);
CUTargetName=CUString(\"\\\\??\\\\C:\\\\user\")+CUTargetName;

#if DBG
ANSI_STRING filename;
RtlUnicodeStringToAnsiString( &filename, &(UNICODE_STRING)CUTargetName, TRUE );
DbgPrint((\" \'%s\' \\n\",filename.Buffer));
RtlFreeAnsiString(&filename);
#endif

ExFreePool(FileObject->FileName.Buffer);
FileObject->FileName.Length = 0;
FileObject->FileName.MaximumLength = ((UNICODE_STRING)CUTargetName).MaximumLength;
// and allocate fresh space
FileObject->FileName.Buffer=(PWCHAR)ExAllocatePool(NonPagedPool, ((UNICODE_STRING)CUTargetName).MaximumLength);

RtlCopyUnicodeString(&FileObject->FileName, (PUNICODE_STRING)&((UNICODE_STRING)CUTargetName));
FileObject->FileName.Buffer[FileObject->FileName.Length/2] = UNICODE_NULL;

pIrp->IoStatus.Status = STATUS_REPARSE;
pIrp->IoStatus.Information = IO_REPARSE;
IoCompleteRequest( pIrp, IO_NO_INCREMENT );

RtlFreeAnsiString(&AnsiSource);

return STATUS_REPARSE;
liuyang714
驱动牛犊
驱动牛犊
  • 注册日期2003-06-04
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-07-21 12:27
不好意思,我没查你的手机号,只不过看着 hnmail.com 比较眼熟,上这个网站看到了 0733 的区号,因为我也是湖南人,所以看着有些亲切罢了。
我知道你们学校,而且我有个同学正在那里读研。;)

给你发的邮件老是提示 - Returned mail: response error,不知是什么原因。
SupermiLG
驱动牛犊
驱动牛犊
  • 注册日期2003-01-28
  • 最后登录2006-02-03
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-07-21 13:00
邮件地址写错了,不好意思哈
13574849558@hnmcc.com
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-07-21 13:17
楼上的原理很简单:将原Buffer里的文件换掉就可以了。不过我认为不需要重新分配Buffer,当然,你的方法是保险。

我在IFS FILTER试过,STATUS_REPARSE是不行的。也许在HOOK API是可以。有时间我也试一下。
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-07-21 13:20
兄弟湖南哪儿????
SupermiLG
驱动牛犊
驱动牛犊
  • 注册日期2003-01-28
  • 最后登录2006-02-03
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-07-21 13:26
楼上那位,这些代码是实际检测过的。没有问题。在IRP_Create时,只有通过irp rephrase 才可以实现重定向,如果单改文件名是不可能实现的,因为在IRP传下来时,IO管理器已经“保留”了些文件信息,只有让IO管理器重解析才能。其他,譬如IRP_Write等采用其他方法定向。
SupermiLG
驱动牛犊
驱动牛犊
  • 注册日期2003-01-28
  • 最后登录2006-02-03
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-07-21 13:37
我并不愿意在公共场合暴露,可以用邮件联系我,vcmfc也一定是高手,能给我个联系方式吗?有些技术我希望讨论,但我不喜欢发贴:)
liuyang714
驱动牛犊
驱动牛犊
  • 注册日期2003-06-04
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-07-21 14:13
to SupermiLG
晕倒,不过你的代码很有启发,谢谢了,vcmfc 是高手哦,包括其它高手们,给了我很多启发,省了不少自己去摸索花的时间,呵呵。
to vcmfc
你也是湖南的吗?我是湖南湘潭的,不过现在在广东。
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-07-21 17:09
to SupermiLG:在 HOOK API,我没有试过,但在IFS FILTER,我敢肯定说,绝对不需要那个标志,换文件名只在同盘有效,但在不同盘还要作其它处理。我不知道你是如何处理,我在IFS FILTER实现过,还在一个产品中使用,这东东没意思。你提到\"IO管理器已经“保留”了些文件信息\",我对这点感到怀疑,可能你是在HOOK API层,而我是在IFS FILTER层。你这种方法我当时也试过,且是rayyang2000告诉我的。
 我的意思是:你的方法是行的,便在IFS FILTER是不行的,可能是我当时没做好。

  我的mail:vcmfc@vip.sina.com

to liuyang714:我老婆是,下月我就要去湖南了,去看我的小虫虫了,它将在9月诞生了。我也是从广东逃到北京来的。在南方混了N年了。惨呀!
SupermiLG
驱动牛犊
驱动牛犊
  • 注册日期2003-01-28
  • 最后登录2006-02-03
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-07-21 17:19
呵呵,vcmfc,我的工作是在IFS Filter层作的,而且只有这样才能实现对不同盘有效,比方说,把C:\\1.txt 定向到 d:\\2.txt呵呵,今天晚上写个例子,要的话也可以给你一份。
另外,我在湖南长沙,你来这我们可以聚一聚嘛,我买单,呵呵呵。上面邮箱地址上有我的手机号。不过给个邮箱地址,要不怎么给你?
SupermiLG
驱动牛犊
驱动牛犊
  • 注册日期2003-01-28
  • 最后登录2006-02-03
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-07-21 17:20
不好意思,看到你的E-Mail了
上一页
游客

返回顶部