看了很多文章,使用Jmp的办法HOOK API的时候都使用了WriteProcessMemory来改写函数的入口地址.我想既然DLL既然已经被注入了目标进程,那地址空间应该是一样的,所以把WriteProcessMemory用memcpy替换掉,这个时候执行就失败了,是为什么呢? 我是HOOK的MessageBoxA,这个函数是在user32.dll里面,是不是因为在其他模块里面所以不能用memcpy呢?

解决方案 »

  1.   

    注入DLL,然后再改地址的这种方法我没有试过,也还真是不知道。
    我的做法是,先创建目标进程,然后在开始执行进程前开始用writeProcessMemory进行修改,修改完再让它进行
      

  2.   

    不一定,你可以直接赋值(你已经在目标空间中,可以用远线程入口为loadlibrary实现),但是有时候直接赋值会异常,那是因为有保护,你可能要用virtualquery调整属性。
      

  3.   

    Jmp的办法HOOK API不一定要用 WriteProcessMemory
    WriteProcessMemory是为了创造远程jmp的入口,所以如果是本地的话,就不需要,方法自己想~ -v-
      

  4.   

    inline hook,硬编码将jmp address写入进程空间。
      

  5.   


    那也就是说WriteProcessMemory在读写内存的时候会自动处理内存有保护的情况 ? 
      

  6.   

    不用,因为修改时一般代码已经注入目标进程了,你只要用VirtualProtect修改一下页属性为可写、可执行的就可以直接用赋值语句或者memcpy操作。
    WriteProcessMemory在写的时候也不会该页属性,仍然需要用VirtualProtect,它唯一的好处是可以直接向其他进程写入数据
      

  7.   

    建议使用WriteProcessMemory,用memcpy的话,有时候会碰到内存保护的情况“*****不能为read”
      

  8.   

    WriteProcessMemory不会处理内存有保护的情况。也只能改写“可写”属性的内存。
    MSDN的解释:
    The WriteProcessMemory function writes data to an area of memory in a specified process. The entire area to be written to must be accessible or the operation fails.WriteProcessMemory与memcpy的区别,仅在于能否跨进程,即能否写到其他进程的地址空间中去
      

  9.   

    搞定了.
    看来WriteProcessMemory可以自动处理一部分内存保护的情况,只要是整个进程是可以读写的就可以使用.而不用关心某个页面的保护属性.
    所以使用memcpy的使用,先使用VirtualProtect改变页面的保护属性,然后就可以顺利的读写了.
    谢谢大家!