本帖最后由 hahanibc 于 2009-09-16 06:28:39 编辑

解决方案 »

  1.   

    我猜是可以的截获第一个messagebox, 创建线程后再返回
      

  2.   

    Inject your code to a Portable Executable filehttp://www.codeproject.com/KB/system/inject2exe.aspx
      

  3.   

    应该是可以的。在a启动之前加一个全局msghook就ok了。
      

  4.   

    可以的。楼主可以看一下动态补丁的原理。也可以用detours来实现。
      

  5.   

    可以,而且我实现过类似的。简单说分几步:就是SuspendThread挂起目标线程,GetThreadContext保存环境, VirtualAllocEx, WriteProcessMemory写入要执行的代码, 修改 ThreadContext中EIP指向新的入口, SetThreadContext->ResumeThread就可以让目标线程执行你刚插入的代码了. 然后继续监视目标线程执行, 等你插入的代码执行完成后再次SuspendThread, 再用SetThreadContext->ResumeThread恢复原始环境并让它从刚才被打断的地方继续执行. 
    需要注意的是在注入过程中要保护好堆栈. 另外注入代码中工作完成后的暂停等待是个麻烦, 因为你不能用任何系统的等待过程比如sleep, waitforxxx等函数(因为后续执行会被外面的注入者用SetThreadContext 强行转走,如果使用了内核对象的话会造成不可预计的错误). 我当初的做法是宿主程序作为调试器Attach到目标进程上, 然后注入代码执行完后执行一条int 3即可. 
      

  6.   

    说的很好,漏了一开始的DebugActiveProcess,(*^__^*) 嘻嘻……。以前我也这么搞过