阅读:1967回复:17
我需要在IFS HOOK中修改IOREQ,救急,100分奉送
我现在要拦截几个文件的读写操作。
举个例,有这两个文件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下开发的。 |
|
|
沙发#
发布于:2002-11-27 19:29
用户被禁言,该主题自动屏蔽! |
|
板凳#
发布于: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呢? |
|
|
地板#
发布于:2002-11-28 21:37
你可以做到啊. 你这样调试通了吗? :o |
|
|
地下室#
发布于: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] |
|
|
5楼#
发布于:2002-11-28 22:38
我是按照DDK的解释,自己通过Ring0 File IO把数据填进ioreq的。就是现在open还有问题。
|
|
|
6楼#
发布于:2002-11-29 10:02
SunMing.Cai: Drive=3=c:\\
rayyang2000: 我觉得排除driver mount的原因,问题可能出在ifs_hndl上 |
|
7楼#
发布于:2002-11-29 12:29
对呀!ioreq里面的一些handle都是直接由fsd填的,hooker根本不知道哪个handle是哪个fsd。
看来只有用WinDbg来调试了,也许可以看出一点端倪。 :( |
|
|
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] |
|
|
9楼#
发布于:2002-12-02 12:37
不错啊!可惜我现在没法试:(
|
|
10楼#
发布于:2002-12-02 14:47
用户被禁言,该主题自动屏蔽! |
|
11楼#
发布于:2002-12-02 19:32
用户被禁言,该主题自动屏蔽! |
|
12楼#
发布于:2004-06-02 13:50
上面的例子根本不能解决问题,
搂主问的是能不能修改ir_ppath,其他的能修改又有何用? 我也找了半天修改ir_ppath的方法,可以没有找到。 我现在的思路就是修改ioreq对应的未公布结构中的路径,然后调用 ParsePath试试了。 |
|
|
13楼#
发布于:2004-06-02 13:53
我现在要拦截几个文件的读写操作。 修改盘符相对来说容易一些,但是修改ir_ppath可能没有什么办法,不知道哪位大虾试过,提示一下也好。 当然最笨的办法就是打开附加一个文件 |
|
|
14楼#
发布于:2004-06-02 17:12
结合DISKMON来做怎么样
重定向该文件的写操作 我没有做过 看法仅仅提供一种思路 |
|
|
15楼#
发布于:2004-06-04 22:15
这么老的帖子你们都能翻出来,够韧劲啊!
|
|
|
16楼#
发布于:2004-06-28 15:49
异盘--修改ir_rh
路径不同:修改ir_ppath, 其实ir_ppath与unicode格式是一样的,将L"\"改成word"Length"即可 另一方案也是可行的,那就是用自己的fsd函数指针替换掉系统的指针,这个必许在open的时候填充好hndlmsc系列函数,肯定没问题 |
|
|
17楼#
发布于:2004-07-02 16:54
怎么能得到file mon的源代码啊?
|
|