我在DLL中HOOK了CreateFileA和CreateFileW,
当然还有
MoveFileW,MoveFileA
DeleteFileW,DeleteFileA
CopyFileW,CopyFileA等函数下面我说一下症状:1.把CreateFileA和CreateFileW的HOOK去掉,挂钩和卸载钩子后都没有任何问题
2.把CreateFileA和CreateFileW的HOOK加上后,挂钩没问题,卸载钩子后,点一下“开始”或双击“我的电脑”等操作时explorer会崩溃以上两个现象出现率是100%我观察了一下,CreateFileA和CreateFileW这两个函数与其他函数的唯一不同之处就在于返回值这两个是HANDLE型的,其他的都是BOOL型的,问题到底出现在哪呢?高手指点对了,最后说明一下,我用的是Detours技术。

解决方案 »

  1.   

    现在把范围缩小到了CreateFileW上了,但是我把代码改为如下,也就是说,我不写我自己的功能代码,我就让他返回它自己,做它自己该做的,卸载DLL后,explorer还是崩溃,太没天理了吧!!
    HANDLE WINAPI CopyCreateFileW(LPCWSTR lpFileName, 
    DWORD dwDesiredAccess, 
    DWORD dwShareMode, 
    LPSECURITY_ATTRIBUTES lpSecurityAttributes, 
    DWORD dwCreationDisposition, 
    DWORD dwFlagsAndAttributes, 
    HANDLE hTemplateFile );
    DETOUR_TRAMPOLINE(HANDLE WINAPI CopyCreateFileW(LPCWSTR lpFileName, 
      DWORD dwDesiredAccess, 
      DWORD dwShareMode, 
      LPSECURITY_ATTRIBUTES lpSecurityAttributes, 
      DWORD dwCreationDisposition, 
      DWORD dwFlagsAndAttributes, 
      HANDLE hTemplateFile ), 
      CreateFileW);
    HANDLE WINAPI MyCreateFileW(LPCWSTR lpFileName, 
    DWORD dwDesiredAccess, 
    DWORD dwShareMode, 
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD dwCreationDisposition,
    DWORD dwFlagsAndAttributes,
    HANDLE hTemplateFile )
    {
    //我想问问比尔盖兹,这样写都崩溃吗?太没天理了吧!!!一句我自己的代码都没有啊!
    return CopyCreateFileW(lpFileName,
    dwDesiredAccess,
    dwShareMode,
    lpSecurityAttributes,
    dwCreationDisposition,
    dwFlagsAndAttributes,
    hTemplateFile);}
      

  2.   

    CopyCreateFileW没有初始化!估计CopyCreateFileA也有同样问题!HANDLE WINAPI CopyCreateFileW(LPCWSTR lpFileName, 
                                  DWORD dwDesiredAccess, 
                                  DWORD dwShareMode, 
                                  LPSECURITY_ATTRIBUTES lpSecurityAttributes, 
                                  DWORD dwCreationDisposition, 
                                  DWORD dwFlagsAndAttributes, 
                                  HANDLE hTemplateFile )
                                   = CreateFileW; 兄弟,下次代码贴整齐点,必要的留点空格。这样别人也好看啊:)
      

  3.   

    另外:BILL GATES就像你老婆,她的话“永远”都是对的:)
      

  4.   

    按照你这个,我编译的时候报错error C2072: 'CopyCreateFileW' : initialization of a function
      

  5.   

    晕死,继续刷屏:(! 还有个错误:(其它几个函数也一样)// 1、BILL GATES就像你老婆,她的话“永远”都是对的
    // 2、CopyCreateFileW 是一个用于保存原来系统函数CreateFileW的函数指针变量,应该这样声明:
    HANDLE (WINAPI * CopyCreateFileW)(LPCWSTR lpFileName, 
                                  DWORD dwDesiredAccess, 
                                  DWORD dwShareMode, 
                                  LPSECURITY_ATTRIBUTES lpSecurityAttributes, 
                                  DWORD dwCreationDisposition, 
                                  DWORD dwFlagsAndAttributes, 
                                  HANDLE hTemplateFile )
                                   = CreateFileW; 
      

  6.   


    如果这样的话。
    我认为是APIHOOK hook冲突。
    这个可能性最大。找一个干净的开发环境测试把,
    把杀毒,监控什么的都关了。
      

  7.   

    我以前hook api也出现这种情况。应该是xp过分DEF数据保护的问题。
    你试试别人的电脑或在2000下运行试试
      

  8.   


    我按照你说的改了,挂上钩子后,这个函数不起作用了,也就是说没有拐到我的代码里来,也就是说,没HOOK到这个函数,我想可能是DllMain需要改一下吧,你帮我看看怎么改呢?谢谢
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {
        switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:

    DetourFunctionWithTrampoline((PBYTE)CopyCreateFileA, (PBYTE)MyCreateFileA);
    DetourFunctionWithTrampoline((PBYTE)CopyCreateFileW, (PBYTE)MyCreateFileW);
    break;
    case DLL_THREAD_ATTACH:
    break;
    case DLL_THREAD_DETACH:
    break;
    case DLL_PROCESS_DETACH:
    DetourRemove((PBYTE)CopyCreateFileA, (PBYTE)MyCreateFileA);
    DetourRemove((PBYTE)CopyCreateFileW, (PBYTE)MyCreateFileW);
    //DetourRemove((PBYTE)CopyCreateFile, (PBYTE)MyCreateFile);
    break;
        }
        return TRUE;
    }
      

  9.   

    另外,需要说明的是,不卸载没事,卸载后才会引起explorer崩溃我怀疑是DLL卸载了,但是对CreateFileW的HOOK,也就是CopyCreateFileW的控制权还没有交给系统此时点击“开始”或双击“我的电脑”的时候,由于系统要调用CreateFileW函数,它不知道DLL已经卸载了,又要去执行“我的”代码,但是此时这段代码已经没有了,所以系统读不到那块内存了,所以提示0x03381cd0内存不能为read关键是怎么解决呢?也就是说怎么让系统不再执行“我的”代码
      

  10.   

    MyCreateFileW 函数好像没有使用?
      

  11.   

    ///////////////////////////////////////////////////////////////////////////////
    // Dll 文件:#include "detours.h"#pragma comment(lib, "detours.lib")
    #pragma comment(lib, "detoured.lib")////////////////////////////////////////////////////////////////////////////////
    // CreateFileW:
    HANDLE (WINAPI* SysCreateFileW)(LPCWSTR lpFileName, // pointer to name of the file
    DWORD dwDesiredAccess, // access (read-write) mode
    DWORD dwShareMode, // share mode
    LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes
    DWORD dwCreationDisposition, // how to create
    DWORD dwFlagsAndAttributes, // file attributes
    HANDLE hTemplateFile // handle to file with attributes to copy
    ) = CreateFileW;HANDLE WINAPI HookCreateFileW(LPCWSTR lpFileName, // pointer to name of the file
    DWORD dwDesiredAccess, // access (read-write) mode
    DWORD dwShareMode, // share mode
    LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes
    DWORD dwCreationDisposition, // how to create
    DWORD dwFlagsAndAttributes, // file attributes
    HANDLE hTemplateFile // handle to file with attributes to copy
    )
    {
    // 这里放入你创建文件前的工作:
    HANDLE h = SysCreateFileW(lpFileName, // pointer to name of the file
    dwDesiredAccess, // access (read-write) mode
    dwShareMode, // share mode
    lpSecurityAttributes, // pointer to security attributes
    dwCreationDisposition, // how to create
    dwFlagsAndAttributes, // file attributes
    hTemplateFile // handle to file with attributes to copy
    ); // 这里放入你创建文件后的工作: return h;
    }
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {
    if (ul_reason_for_call == DLL_PROCESS_ATTACH)
    {
    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    DetourAttach(&(PVOID&)SysCreateFileW, HookCreateFileW);
    DetourTransactionCommit();
    }
    else if (ul_reason_for_call == DLL_PROCESS_DETACH)
    {
    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    DetourDetach(&(PVOID&)SysCreateFileW, HookCreateFileW);
    DetourTransactionCommit();
    } return true;
    }////////////////////////////////////////////////////////////////////////////////
    // Must at least ONE export function:
    __declspec(dllexport) void ExportFunc(void)
    {
    }
      

  12.   

    ///////////////////////////////////////////////////////////////////////////////
    // 注入程序关键代码:#include "detours.h"#pragma comment(lib, "detours.lib")
    #pragma comment(lib, "detoured.lib")void CInjectDlg::Inject(const TCHAR* pExe, 
    const TCHAR* pArgs,
    const TCHAR* pDetourDllFullPath,
    const TCHAR* pHookDllFullPath)
    {
    STARTUPINFO si;
    PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si));
    ZeroMemory(&pi, sizeof(pi));
    si.cb = sizeof(si); if( !DetourCreateProcessWithDll(pExe, pArgs, NULL, NULL, TRUE, 
    CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED, 
    NULL, NULL,
    &si, &pi, 
    pDetourDllFullPath, 
    pHookDllFullPath, 
    NULL) )
    {
    CString szTips;
    szTips.Format(_T("DetourCreateProcessWithDll failed: %d\n"), GetLastError());
    MessageBox(szTips);
    }
    else
    {
    ResumeThread(pi.hThread);
    }
    }仔细对照两段代码,看看你哪里没写对? 如果你是直接HOOK本进程的API的话,则不需要编写那个DLL了,把DLL中的代码移到你的进程中去即可。
      

  13.   

    DLL注入进去了,但是不管用啊。没执行我的代码!!别的进程和测试工程的进程都不管用。我用冰刃看了一下explorer中的模块,detoured.dll和我的DLL都注入进去了。
      

  14.   


    void CInjectDlg::Inject(const TCHAR* pExe, 
                const TCHAR* pArgs,
                const TCHAR* pDetourDllFullPath,
                const TCHAR* pHookDllFullPath)这个函数的四个参数怎么写啊?尤其是第二个,其他三个我大概能写出来,如下Inject("test.exe", 
                "",
                "detoured.dll",
                "fpublic.dll")不知道这么写对不对,尤其第二个参数不知道怎么写