CreateRemoteThread与Terminal Service
今天和项目组同事使用MS的终端服务,远程连接到某河南客户的服务器上调试程序。该功能使用了Hook API的技术,具体来说采用了修改IAT与CreateRemoteThread的方式来实现Hook API。
具
体方法不必多说,网上绝大多数Hook
API都是使用这样的技术来实现。但今天发现的问题却很奇怪,开始使用控制台方式运行,该功能一切正常,改为服务方式运行后,Hook
dll无法被注入到目标进程中。增加调试日志后发现,原来是CreateRemoteThread返回错误,错误信息为:
"CreateRemoteThread() failed: 存储空间不足,无法处理此命令"。开始怀疑是Hook
dll文件太大,目标进程内没有这么充足的空间。仔细考虑一下后排除了这种想法,因为在控制台模式下一切正常,而在服务模式下却不能进行注入。应该是和程
序运行的模式有关,但具体原因呢?放狗搜一下,发现小四哥的一篇文章提到CreateRemoteTread返回的这个错误,但当时他也没有找到解决方法。
MSDN也提到在远程终端服务上运行CreateRemoteThread会返回错误的说法:
Terminal Services isolates each terminal session by design. Therefore, CreateRemoteThread fails if the target process is in a different session than the calling process.
这下郁闷了,不知道如何才能在Terminal Services上成功调用CreateRemoteThread?