SunMing.Cai
驱动牛犊
驱动牛犊
  • 注册日期2002-11-25
  • 最后登录2008-01-10
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1967回复:17

我需要在IFS HOOK中修改IOREQ,救急,100分奉送

楼主#
更多 发布于:2002-11-27 18:18
我现在要拦截几个文件的读写操作。
举个例,有这两个文件C:\\TEST.TXT和D:\\TEST.TXT
我参考过了file mon的源码代,现在知道如何拦截各个文件操作,也知道怎样获得文件名。但它是基于\"passive\"的,没有modify ioreq的部分。
我现在要让系统在打开文件C:\\TEST.TXT时,让它实际打开D:\\TEST.TXT。也就是说,只需要拦截Create操作就行了。其它如delete,find之类的都不需要再处理。

现在老板促得我急!有那个兄弟能帮我这个忙,我要源码或sample。我会给帮我的解决问题的人我100分的,我现在只有200分啦。我的邮箱是networld@21cn.net。请各个兄弟指教。

我现在是用vtools在win9x下开发的。
梦想驱动人生 ------------------------ MSN:saleonnet@hotmail.com ICQ:175745619 OQ:14892627
xzjfile
禁止发言
禁止发言
  • 注册日期2001-12-14
  • 最后登录2018-07-12
  • 粉丝0
  • 关注0
  • 积分6970分
  • 威望50721点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-11-27 19:29
用户被禁言,该主题自动屏蔽!
SunMing.Cai
驱动牛犊
驱动牛犊
  • 注册日期2002-11-25
  • 最后登录2008-01-10
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-27 19:38
你试过吗?有没有效果,可不可以发个示例代码给我呢?

我记得以前也有位兄弟问过这个问题,他当时也试过改ir_path,但是好像不行呀.

我还想问一下,这时的ir_path是全路径的吗?
当我的win32 app exe位于c:\\windows目录,这时它调用createfile(\"test.txt\",...)
那我拦截到的ir_path是 c:\\windows\\test.txt.还是 test.txt呢?

梦想驱动人生 ------------------------ MSN:saleonnet@hotmail.com ICQ:175745619 OQ:14892627
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-28 21:37
你可以做到啊.
在调用prehook前,把ir_ppath改为你的.
不过,如果用户调用了EnumHandle获得的FileName可就是新的了.
你可以也一并给做了.呵呵


你这样调试通了吗?  :o
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
SunMing.Cai
驱动牛犊
驱动牛犊
  • 注册日期2002-11-25
  • 最后登录2008-01-10
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-28 21:54
就是不行呀.所以觉得奇怪.我一遇到这个问题时,我也想应该是改一下ir_ppath就行了.但事实不是这样子.
我把pir里的各个字节都看过了.
比哪我访问的是c:\\windows\\system.ini
那pir的数据是这样的
pir->ir_ppath->pp_totalLength, //42          
pir->ir_ppath->pp_prefixLength,//20
pir->ir_ppath->pp_elements[0].pe_length //16
pir->ir_ppath->pp_elements[0].pe_unichars里放下面的unicode字符串 \"windows\\system.ini\"
就是没有C:\\的,而这里ndrive是3.
还有其它如pir->ir_aux2的数据跟ppath的差不多.

所以我是想,其实这时ioreq里的数据应该只是一个复制品(包手ndrive)罢了.修改复制品,当然不会影响原来的数据了,所以createfile在执行时,应该是将api参数存放在其它如ir_data

那个兄弟能给个正确的说法呢,希望调试过了,再回贴子

[编辑 -  12/2/02 by  SunMing.Cai]
梦想驱动人生 ------------------------ MSN:saleonnet@hotmail.com ICQ:175745619 OQ:14892627
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-28 22:38
我是按照DDK的解释,自己通过Ring0 File IO把数据填进ioreq的。就是现在open还有问题。
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
Coolice
驱动小牛
驱动小牛
  • 注册日期2002-11-13
  • 最后登录2003-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-29 10:02
SunMing.Cai: Drive=3=c:\\
rayyang2000: 我觉得排除driver mount的原因,问题可能出在ifs_hndl上
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-11-29 12:29
对呀!ioreq里面的一些handle都是直接由fsd填的,hooker根本不知道哪个handle是哪个fsd。

看来只有用WinDbg来调试了,也许可以看出一点端倪。 :(
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
SunMing.Cai
驱动牛犊
驱动牛犊
  • 注册日期2002-11-25
  • 最后登录2008-01-10
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-12-01 12:51
这是win95Inside这本书中fsinfile例子的片段
//
//  Volume-based api function, VFN_OPEN
//
int FS_OpenFile( pioreq pir ) {

    if ( pir->ir_rh == (void*)FSD_RES_HANDLE ) {
        int diridx;
        OPEN_FILE* pof;
        BOOL bFileExists;
        dos_time dt;
        string_t UniFCB[11];    
        BYTE options = pir->ir_options & 0x7f;

        Debug_Printf( \"FS_OPENFILE - \" );

        /* Since FSIF only supports a root directory, fail any path that has subdirectories */
        if ( pir->ir_ppath->pp_prefixLength != 4 )
            return ( pir->ir_error = ERROR_PATH_NOT_FOUND );

        /* First, see if the file already exists, i.e. it has a directory entry */
        bFileExists = FindDirEntry( pir, IFSLastElement(pir->ir_ppath)->pe_unichars, &diridx );

        if ( bFileExists ) {
            if ( options == ACTION_CREATENEW ) /* create a new file, fail if exists */
                return ( pir->ir_error = ERROR_ACCESS_DENIED );
            }
        else {
            if (options == ACTION_OPENEXISTING || /* open an existing file */
                options == ACTION_REPLACEEXISTING ) /* replace an existing file */
                return ( pir->ir_error = ERROR_FILE_NOT_FOUND );
            }              

        /* Allocate an FSIF file structure */
        pof = (POPEN_FILE)IFSMgr_GetHeap( sizeof( OPEN_FILE ) );
        if ( pof == NULL ) return ( pir->ir_error = ERROR_NOT_ENOUGH_MEMORY );

        if ( !bFileExists )
            if ( !FindFreeDirEntry( &diridx ) )
                return ( pir->ir_error = ERROR_TOO_MANY_OPEN_FILES );

        switch( options ) {
            case ACTION_REPLACEEXISTING:
                Debug_Printf( \"Replace existing %08lx\\n\", pof );
                TruncateAction( pir, diridx );
                break;
            case ACTION_CREATEALWAYS:
                Debug_Printf( \"Create always %08lx\\n\", pof );
                if (bFileExists) TruncateAction( pir, diridx );
                else CreateAction( pir, diridx );
                break;
            case ACTION_CREATENEW:
                Debug_Printf( \"Create new %08lx\\n\", pof );
                CreateAction( pir, diridx );
                break;
            case ACTION_OPENEXISTING:
                Debug_Printf( \"Open existing %08lx\\n\", pof );
                OpenExistingAction( pir, diridx );
                break;
            case ACTION_OPENALWAYS:
                Debug_Printf( \"Open always %08lx\\n\", pof );
                if (bFileExists) OpenExistingAction( pir, diridx );
                else CreateAction( pir, diridx );
                break;
            }

        pof->sfn         = pir->ir_sfn;
        pof->attrib      = pir->ir_attr & 0xff;
        pof->mode        = pir->ir_flags;
        pof->cursize     = dirbuf[diridx].base.size;
        pof->pos         = 0;
        pof->dir_index   = diridx;

        AddOpenFile( pof );

        /* Fill in the returned ioreq structure */
        SetHandleFunc( pir, FS_ReadFile, FS_WriteFile, &hm );
        pir->ir_fh = pof;
        dt.dt_date = dirbuf[diridx].base.date;
        dt.dt_time = dirbuf[diridx].base.time;
        pir->ir_dostime = dt;
        pir->ir_size = dirbuf[diridx].base.size;
        pir->ir_attr = dirbuf[diridx].base.attrib;

        return ( pir->ir_error = ERROR_SUCCESS );
        }

    return ( pir->ir_error = ERROR_INVALID_FUNCTION );
    }

人家就可以直接填充pir,直接返回,我看我们也可以试试看。
win95Inside程序
http://pc-cn.vicp.net/bigdownloads/vcbook/winfs.zip

[编辑 -  12/2/02 by  SunMing.Cai]
梦想驱动人生 ------------------------ MSN:saleonnet@hotmail.com ICQ:175745619 OQ:14892627
Coolice
驱动小牛
驱动小牛
  • 注册日期2002-11-13
  • 最后登录2003-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-12-02 12:37
不错啊!可惜我现在没法试:(
xzjfile
禁止发言
禁止发言
  • 注册日期2001-12-14
  • 最后登录2018-07-12
  • 粉丝0
  • 关注0
  • 积分6970分
  • 威望50721点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2002-12-02 14:47
用户被禁言,该主题自动屏蔽!
xzjfile
禁止发言
禁止发言
  • 注册日期2001-12-14
  • 最后登录2018-07-12
  • 粉丝0
  • 关注0
  • 积分6970分
  • 威望50721点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2002-12-02 19:32
用户被禁言,该主题自动屏蔽!
punk
驱动小牛
驱动小牛
  • 注册日期2001-04-07
  • 最后登录2018-06-01
  • 粉丝0
  • 关注0
  • 积分621分
  • 威望164点
  • 贡献值0点
  • 好评度60点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-06-02 13:50
上面的例子根本不能解决问题,
搂主问的是能不能修改ir_ppath,其他的能修改又有何用?
我也找了半天修改ir_ppath的方法,可以没有找到。
我现在的思路就是修改ioreq对应的未公布结构中的路径,然后调用
ParsePath试试了。
不停学习
punk
驱动小牛
驱动小牛
  • 注册日期2001-04-07
  • 最后登录2018-06-01
  • 粉丝0
  • 关注0
  • 积分621分
  • 威望164点
  • 贡献值0点
  • 好评度60点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-06-02 13:53
我现在要拦截几个文件的读写操作。
举个例,有这两个文件C:\\TEST.TXT和D:\\TEST.TXT
我参考过了file mon的源码代,现在知道如何拦截各个文件操作,也知道怎样获得文件名。但它是基于\"passive\"的,没有modify ioreq的部分。
我现在要让系统在打开文件C:\\TEST.TXT时,让它实际打开D:\\TEST.TXT。也就是说,只需要拦截Create操作就行了。其它如delete,find之类的都不需要再处理。

现在老板促得我急!有那个兄弟能帮我这个忙,我要源码或sample。我会给帮我的解决问题的人我100分的,我现在只有200分啦。我的邮箱是networld@21cn.net。请各个兄弟指教。

我现在是用vtools在win9x下开发的。
 


修改盘符相对来说容易一些,但是修改ir_ppath可能没有什么办法,不知道哪位大虾试过,提示一下也好。
当然最笨的办法就是打开附加一个文件
不停学习
walkonthesky
驱动中牛
驱动中牛
  • 注册日期2003-11-26
  • 最后登录2012-11-06
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-06-02 17:12
结合DISKMON来做怎么样

重定向该文件的写操作

我没有做过
看法仅仅提供一种思路
[img]http://www.driverdevelop.com/forum/upload/walkonthesky/2004-07-08_2004-07-07_b847.gif[/img]
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-06-04 22:15
这么老的帖子你们都能翻出来,够韧劲啊!
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
punk
驱动小牛
驱动小牛
  • 注册日期2001-04-07
  • 最后登录2018-06-01
  • 粉丝0
  • 关注0
  • 积分621分
  • 威望164点
  • 贡献值0点
  • 好评度60点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-06-28 15:49
异盘--修改ir_rh
路径不同:修改ir_ppath,
其实ir_ppath与unicode格式是一样的,将L"\"改成word"Length"即可
另一方案也是可行的,那就是用自己的fsd函数指针替换掉系统的指针,这个必许在open的时候填充好hndlmsc系列函数,肯定没问题
不停学习
youkenkin
驱动牛犊
驱动牛犊
  • 注册日期2004-04-14
  • 最后登录2004-07-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-07-02 16:54
怎么能得到file mon的源代码啊?
游客

返回顶部