我在加载自己写的dll时候,修改了CreateFileW的前8个字节,把他改成了自己的Hook函数,在函数中有个处理过程(写了个MessageBox),然后后面把API的前8个字节改回去了,再执行CreateFileW这个函数,写了个测试对话框(单击按钮创建文件将)问题现如下:
   1、若是没有加处理语句,单击按钮能够创建出文件,一旦加入处理语句(即使是简单的一个语句),文件就无法创建出来。
  请各位大大帮帮小弟。
  hook函数如下:
  int _stdcall hook_CreateFileW( 
  LPCTSTR lpFileName,          
  DWORD dwDesiredAccess,       
  DWORD dwShareMode,           
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
   
  DWORD dwCreationDisposition,  
  DWORD dwFlagsAndAttributes,  
  HANDLE hTemplateFile)
{
     
    WaitForSingleObject( g_hSendEvent, INFINITE );
    //恢复API头8个字节
    WriteProcessMemory( INVALID_HANDLE_VALUE, ( void* )g_pNtCreate, 
      ( void* )g_dwOldBytes[0], sizeof( DWORD )*2, NULL );     //处理过程
    //MessageBox(NULL,"处理过程",NULL,0);
    //真正执行API函数

HANDLE hFile=CreateFileW((unsigned short*)lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes,
dwCreationDisposition,  dwFlagsAndAttributes,  hTemplateFile); 
if (hFile==INVALID_HANDLE_VALUE)
{
MessageBox(NULL,"文件创建失败",NULL,0);
}
    
    //写入跳转语句,继续Hook
    WriteProcessMemory( INVALID_HANDLE_VALUE, ( void* )g_pNtCreate, 
       ( void* )g_btNewBytes, sizeof( DWORD )*2, NULL ); 
    SetEvent(g_hSendEvent);    
    return 0;
}

解决方案 »

  1.   

    重点检查一下堆栈。为什么需要8个字节,5个字节不就可以了么?这8个字节是什么?
    建议楼主不要这样写hook函数,在多线程环境下不安全。使用detours就没有这些问题了,微软都帮你做好了。
      

  2.   

    使用微软提供的Detoure SDK之前我回复了相类似的问题,你可以参考一下
    http://topic.csdn.net/u/20110429/16/83adff9c-a8b3-4058-adfc-65e60f0058b4.html
      

  3.   


    那位楼主就是用了DETOUR方式HOOK API
    然后用CreateRemoteThread方式注入这是最好的做法了,兼容性比较好
      

  4.   

    非常感谢 我去研究下Detoure SDK 晚上来结贴