我做了一个系统钩子用于截获删除文件的操作,安装钩子后可以正常拦截API,但是卸载钩子后系统老是出错,请大家帮我看一下原因在哪里。
安装钩子:
hHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)GetMsgProc,hmodDll,0);
在回调函数中修改函数地址:
HookAllAPI("kernel32.dll",GetProcAddress(GetModuleHandle("kernel32.dll"),
  "DeleteFileW"),(PROC)&H_DeleteFileW,NULL);
HookAllAPI("kernel32.dll",GetProcAddress(GetModuleHandle("kernel32.dll"),
  "DeleteFileA"),(PROC)&H_DeleteFileA,NULL);在卸载钩子的函数中这样写:
UnhookWindowsHookEx(hHook);
//
UnhookAllAPIHooks("kernel32.dll",GetProcAddress(GetModuleHandle("kernel32.dll"),
   "DeleteFileW"),(PROC)&H_DeleteFileW,NULL);
UnhookAllAPIHooks("kernel32.dll",GetProcAddress(GetModuleHandle("kernel32.dll"),
   "DeleteFileA"),(PROC)&H_DeleteFileA,NULL);
UnhookAllAPIHooks是对HookAllAPI的反操作,HookAllAPIhook所有进程。

解决方案 »

  1.   

    要对Hook的API进行解除成功后再卸载钩子函数。
      

  2.   

    我把UnhookWindowsHookEx(hHook);放在UnhookAllAPIHooks后面执行也是一样的出错,我认为应该还是没有把修改过的函数地址改回去,我一卸载钩子,系统还是调用钩子提供的函数,但是钩子已经不存在了,所以系统会出错。
      

  3.   

    是explorer和internet Explorer出错,然后当前窗口关闭,要注销或重启才恢复正常。
      

  4.   

    问题转变,在线等待解决问题,出错的原因是因为我对拦截FindFirstFileW和FindFirstFileA的处理不对,我是想通过拦截这两个函数实现隐藏文件的功能,大家说是否可行。但是我这样做的话每个文件夹下总有一个文件会显示出来,而且我一卸载钩子后,做任何操作就会出我上面提到的问题,我的自定义函数是这样的(protectPath 是我选择隐藏的文件夹):
    HANDLE WINAPI H_FindFirstFileA(LPCTSTR szOldName , LPWIN32_FIND_DATAA szNewName)
    {
    char name[MAX_PATH] = {0};
    strcat(name , szOldName);
    strcat(name , "文件已隐藏!");
    int len = strlen( protectPath );
    int ret = StrCmpN( protectPath , szOldName , len );
    if( ret == 0 )
    {
    MessageBox(NULL,name,"提示FindFirstFileA",MB_OK);
    return (HANDLE)-1;
    }
    else
    return FindFirstFileA( szOldName , szNewName );//返回原来的函数
    }
    //同上
    HANDLE WINAPI H_FindFirstFileW(LPCWSTR szOldName , LPWIN32_FIND_DATAW szNewName)
    {
    int   nLen   =   wcslen(szOldName)+1;     
        char   *buf   =   new   char[2*nLen]; 
    WideCharToMultiByte(CP_ACP,0,szOldName,nLen,buf,2*nLen,NULL,NULL); char name[MAX_PATH] = {0};
    strcat(name , buf);
    strcat(name , "文件已隐藏!");
    int len = strlen( protectPath );
    int ret = StrCmpN( protectPath , buf , len );
    if( ret == 0 )
    {
    MessageBox(NULL,name,"提示FindFirstFileW",MB_OK);
    return (HANDLE)-1;
    }
    else
    return FindFirstFileW( szOldName , szNewName );//返回原来的函数
    }
      

  5.   

    现在发现确实是UnhookAllAPIHooks不成功发生的错误,谁能帮帮我?
      

  6.   

    不知道你的API钩子是怎么写的,建议你还是使用微软的detours库。
      

  7.   

    detours库好像是不能用于商业用途哦
      

  8.   

    请大家帮忙:一是卸载钩子后出错,二是怎样拦截API达到隐藏某个文件夹的目的。
      

  9.   

    你是不是在HookAllAPI里面修改了系统API的开始几个字节,使API指向你自定义的函数?如果是的话,我估计可能是因为你的DLL在程序结束之后已经不在内存里面了,而你又修改了DeleteFileW和DeleteFileA的开始代码,使程序跑飞了。
      

  10.   

    拦截API以隐藏某个文件夹的功能已经实现,在此公布给大家,就是拦截FindNextFileA(HANDLE hFile , LPWIN32_FIND_DATAA findData)和FindNextFileW(HANDLE hFile , LPWIN32_FIND_DATAW findData)这两个API函数,先执行FindNextFileA和FindNextFileW以得到findData,如果findData->cFileName就是你要隐藏的文件或文件夹,就把findData->cFileName改名为“..”就行了,然后返回TRUE,不然会影响其他文件的显示。
    希望受益的朋友给我顶一下,现在第一个问题还没有解决:卸载钩子后出错