在win7 32bit上hook一个系统函数,在恢复时,采用了memcpy,但是却发现函数第一个字节始终无法恢复,调试发现:mov [首地址],eax,时,首地址第一个字节始终不会改变回原来的样子。我又做了如下测试。1.ZeroMemory,结果也是一样,首地址第一个字节不会清零,其余清零。2.载入调试器当发现不能清零后,用windbg的eb指令设置这个第一字节是可以改变的。郁闷啊,调试了一下午了。5555555

解决方案 »

  1.   

    先调用:VirtualProtectEx
    The VirtualProtectEx function changes the access protection on a region of committed pages in the virtual address space of a specified process. BOOL VirtualProtectEx(
      HANDLE hProcess,        // handle to process
      LPVOID lpAddress,       // region of committed pages
      SIZE_T dwSize,          // size of region
      DWORD flNewProtect,     // desired access protection
      PDWORD lpflOldProtect   // old protection
    );
    试试?
      

  2.   

    是的,这种原因自然考虑到了。如果说是对齐的原因,也不太好理解。我将原定的函数地址减一,(那么不变的地方就不再是首地址了),但是memcpy后仍旧无法改变原先那个“第一字节”
      

  3.   


    哈哈,我想到了,因为我对那个字节用了 ba r 1的断点,肯定是因为这个!!!明天我就去试试,我觉得就是这个原因!!!!
      

  4.   

    换WriteProcessMemory()做inline hook时也遇到过用memcpy()失败,用WriteProcessMemory()却成功