站在巨人的肩膀上
通过CreateRemoteThread,我们能实现把dll或者代码注入到目标进程中,从而实现一些特殊功能。
网上关于远程线程注入的文章汗牛充栋,这里就不再重复劳动了。
其中这篇文章《远程线程注入引出的问题》把实现远程线程注入中会遇到的问题都一一罗列出来了,更给力的是,不单单是注入dll的方式,还把更高阶的注入代码来执行的方法也详细列了出来,非常值得一读。
进一步的补充
这里在补充一些,上面的文章中所没提到,但是在真正的实践中遇到的情况。
首先就是CreateRemoteThread这个API的问题,无论执行调用该API的进程是否有管理员权限,这个API在2000、XP 、XP SP1这几个版本上都可以正常运作,但是在XP SP2及以上的系统,由于安全改进,再执行这个API,会得到ERROR_NOT_ENOUGH_MEMORY的错误。
怎么解决这个问题呢? 这篇文章《Injecting Code Into Privileged Win32 Processes》的作者进行了深入探索,并给出了解决方案,解答如下:
- 在2000、XP、XP SP1上使用CreateRemoteThread
- 在XP SP2、SP3上使用从nt.dll导出的RtlCreateUserThread,这是个Undocumented API
- 在Vista以上使用从nt.dll导出的NtCreateThreadEx,这也是个Undocumented API,还有32位和64位版本的区别,且这个API是从Vista才开始引入的
按上面的方案是能解决问题,但是有没有更好的解决方案呢,毕竟上面的方案要根据系统版本作不同的处理,还得调用Undocumented API。
好了,终极解决方案就是使用服务,运行在system权限下的service,可以在当前的所有windows版本中正常的调用CreateRemoteThread来进行工作!
遗憾
用service的方案看似完美,但是还是有它的局限性,这就是从Win 8开始,微软引入了保护进程的概念,关键的系统进程(csrss、servies、lsass等等)全部输入保护进程,不允许注入。
网友评论