【Windows】远程线程注入

站在巨人的肩膀上

通过CreateRemoteThread,我们能实现把dll或者代码注入到目标进程中,从而实现一些特殊功能。
网上关于远程线程注入的文章汗牛充栋,这里就不再重复劳动了。
其中这篇文章《远程线程注入引出的问题》把实现远程线程注入中会遇到的问题都一一罗列出来了,更给力的是,不单单是注入dll的方式,还把更高阶的注入代码来执行的方法也详细列了出来,非常值得一读。

进一步的补充

这里在补充一些,上面的文章中所没提到,但是在真正的实践中遇到的情况。
首先就是CreateRemoteThread这个API的问题,无论执行调用该API的进程是否有管理员权限,这个API在2000、XP 、XP SP1这几个版本上都可以正常运作,但是在XP SP2及以上的系统,由于安全改进,再执行这个API,会得到ERROR_NOT_ENOUGH_MEMORY的错误。
怎么解决这个问题呢? 这篇文章《Injecting Code Into Privileged Win32 Processes》的作者进行了深入探索,并给出了解决方案,解答如下:

  1. 在2000、XP、XP SP1上使用CreateRemoteThread
  2. 在XP SP2、SP3上使用从nt.dll导出的RtlCreateUserThread,这是个Undocumented API
  3. 在Vista以上使用从nt.dll导出的NtCreateThreadEx,这也是个Undocumented API,还有32位和64位版本的区别,且这个API是从Vista才开始引入的

按上面的方案是能解决问题,但是有没有更好的解决方案呢,毕竟上面的方案要根据系统版本作不同的处理,还得调用Undocumented API。
好了,终极解决方案就是使用服务,运行在system权限下的service,可以在当前的所有windows版本中正常的调用CreateRemoteThread来进行工作!

遗憾

用service的方案看似完美,但是还是有它的局限性,这就是从Win 8开始,微软引入了保护进程的概念,关键的系统进程(csrss、servies、lsass等等)全部输入保护进程,不允许注入。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,908评论 25 708
  • 一 青阳 “你好,我是苏洛。” “沈青阳。” 沈青阳忘记了第一次见到苏洛是在大一下学期,还是大二上学期。第一眼看...
    苏雒阅读 686评论 0 1
  • 咖啡粉简单分级的话 现磨优于咖啡粉优于速溶 ... 速溶在制作过程中的蒸发工序使得咖啡本身的香气流失大半,后期不得...
    笑笑山顶洞人阅读 259评论 0 0