我的目的是在98下面挂钩createfile和writefile,一开始用的WriteProcessMemory()失败了,在网上搜索了一下说:Win9X下,kernel32.dll,user32.dll,gdi32.dll这些代码是处于系统保护中的,用户无法在ring3下对他们进行改写。同时找了一段代码:
       //在Ring0状态下修改系统共享的代码 
       Ring0WriteMemory(void   *   dst,void   *src,int   copySize);
       这个函数具体的代码大家可以在网上搜,到处都有。
       ……
       好了到此为止出现问题了,我在test.exe中注入了挂钩createfile和writefile的dll,成功了。但是现在出现了一个问题,在test.exe启动的情况下,如果打开电脑上其他任何的文件都出现非法操作。 
       我是这么理解的,因为kernel32.dll,user32.dll,gdi32.dll中的代码是共享地址中的,我在test.exe启动的时候挂钩了createfile和writefile两个api,此时我打开电脑的任何文件,这个操作貌似也要调用createfile,而此时createfile已经被挂钩了,所以出现非法操作。
       不知道我这样理解对不对,如果对的,想问问怎么解决

解决方案 »

  1.   

    你可以自己定义一个fake creatfile,只对某些特定进程操作,其他的放过
      

  2.   

    我是自己写了个mycreatefile和mywritefile,我上代码吧!
    1)、MyCreateFile:
    HANDLE WINAPI MyCreateFile(LPCTSTR lpFileName,
       DWORD dwDesiredAccess,
       DWORD dwShareMode,
       LPSECURITY_ATTRIBUTES lpSecurityAttributes,
       DWORD dwCreationDisposition,
       DWORD dwFlagsAndAttributes,
       HANDLE hTemplateFile)
    {
    HANDLE nReturn = NULL;
    myHookCreateFile.SetHookOff();
    myHookWriteFile.SetHookOff();
    nReturn = CreateFileA(lpFileName,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile);
    //如果发现打开的文件,就是要监控的文件,此处sControlPrintPort中保存了指定的文件名,则将此文件的句柄保存在hookFileHandle变量中。
    if(strcmpi((const char *)sControlPrintPort,lpFileName) == 0 ){
    hookFileHandle = nReturn;
    }

    myHookCreateFile.SetHookOn();
    myHookWriteFile.SetHookOn();
    return (nReturn);
    }2)、MyWriteFile:
    int WINAPI MyWriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped){
    int nReturn = 0;
    int result;
    DWORD   dwCount;  
    myHookCreateFile.SetHookOff();
    myHookWriteFile.SetHookOff();
    //如果写文件的句柄为要监控的句柄,则将写入内容发给串口通讯模块,并将串口模块返回的数据
    //写入到监控的句柄内,完成写入内容的截取和替换
    if(hookFileHandle == hFile){
    此处进行一些自己的操作
                      nReturn = WriteFile(hFile,lpBuffer,nNumberOfBytesToWrite,lpNumberOfBytesWritten,lpOverlapped);
    }
    else{
    nReturn = WriteFile(hFile,lpBuffer,nNumberOfBytesToWrite,lpNumberOfBytesWritten,lpOverlapped);
    }
    myHookCreateFile.SetHookOn();
    myHookWriteFile.SetHookOn();
    return (nReturn);
    }      以上是我自己的MyCreateFile和MyWriteFile,内部其实只对指定的文件进行了操作。
    3)、我的挂钩方式:JMP+MyFuncAddress的方式。
          在Nt下面可以调用WriteProcessMemory替换掉Createfile的前五个字节;可是由于9x下Kernel32.dll,user32.dll,gdi32.dll这些代码是处于系统保护中的,用户无法在ring3下对他们进行改写。网上给了一个方法在Ring0状态下修改系统共享。
    具体代码见http://topic.csdn.net/t/20030316/20/1537968.html的5楼。总结:在这种情况下,出现了我在顶楼描述的问题。
      
     诚心求教 非常非常的诚心,知道的还请指点一下,因为很急,催的很紧,我也很郁闷 哭啊 呜啊呜啊。
      

  3.   

    我还疑惑一个问题:在9x下,比如我在test.exe启动的时候挂钩了Createfile和Writefile,貌似说9x下Kernel32.dll等dll代码是共享的,这样如果我其他的进程调用Createfile的时候岂不是最开始执行的是JMP NewFuncAddress; 这样能跳转到我的NewFuncAddress 不会出现什么地址越界啊什么的问题么,哎 其实我也弄的迷迷糊糊的。
      

  4.   

    9x都是共享的,你挂钩一个writeprocessmemory等于勾勒所有的.
      

  5.   

    我继续问哈,既然我挂钩一个createfile,如果别的进程调用createfile的时候,是不是也会走我自己的MyCreatefile???
      

  6.   

    我刚有搜了一下,9x下挂钩确实会存在我说的问题,原因也跟我说的差不多。详细说法见http://help.madshi.net/SystemWideApiHooking.htm
    这个帖子也讲了怎么解决问题,我没看懂他那个代码,有没有好心人给我讲解讲解呀???
      

  7.   

    就是说有这么一个Shared Area,如果你一个进程修改了,那么所有的其他的进程都会看到这个修改,就是说都收到了影响。就是要保证你的钩子DLL里面的回调函数必须不处在进程的> $80000000的地方,才不会影响到别的进程。你这个英文文章和你的问题不搭界,人家说的是怎么实现系统全局Hook