远程线程注入时遇到的问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
远程线程注入时遇到的问题
这是我在研究程序自我删除(关于程序自我删除相关的技术我会在之后的文章中详细介绍)技术中碰到的问题, 暂时没有找到原因及解决办法. 暂且记录下来方便日后查阅、分析.
CreateRemoteThread经常在木马病毒中使用, 最常见的做法就是把LoadLibrary当作线程函数在目标进程中动态加载自己的Dll, 这种方法比通过HOOK加载Dll的优点在于不需要目标进程依赖于User32.dll. 但是在实际使用过程中确会遇到不少问题.
除了使用LoadLibrary作为线程函数我们可以使用自定义的线程函数, 当然前提是这个线程函数的二进制代码已经正确无误地插入到目标进程. 具体方法这里不便展开.
AdjustTokenPrivileges:
首先碰到的问题是关于进程权限问题, 确切的来说也不是问题, 只是在开发过程中遇到的比较奇怪的现象, 仅仅记录下来方便日后研究. 在此之前一直没有搞清楚提高进程权限是什么意思, 难道是提高系统级?
当然不可能, 微软不傻. 经过一些测试我有了一些发现. 代码如下:
[c-sharp]view plaincopy
1.BOOL EnableDebugPrivilege()
2.{
3. HANDLE hToken;
4.if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToke
n) != TRUE)
5. {
6.return FALSE;
7. }
8.
9. LUID Luid;
10.if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &Luid) != TRUE)
11. {
12.return FALSE;
13. }
14.
15. TOKEN_PRIVILEGES tp;
16. tp.PrivilegeCount = 1;
17. tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
18. tp.Privileges[0].Luid = Luid;
19.
20.if(AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), N
ULL, NULL) != TRUE)
21. {
22.return FALSE;
23. }
24.
25.return TRUE;
26.}
测试结果如下:
1. 使用该函数->枚举进程. 结果显示枚举到进程67个, 但是任务管理器显示当前进程73个. 未解.
2. 不使用该函数->OpenProcess打开系统进程失败.
这里有两个例外:
1. 在我电脑上(win7 x86)有一个进程名为SearchFilterHost.exe在任务管理器中显示为系统进程, 但是OpenProcess还是能成功.
2. 如果从vs启动, 结果同1.
在win7 x64上再次测试, 暂时没有发现SearchFilterHost这样的例外. 这里我说的系统进程暂时理解为任务管理器显示用户名为SYSTEM的进程. 不知是否正确.
枚举进程使用了CreateToolhelp32Snapshot/EnumProcesses两种方法, 情况相同.
CreateRemoteThread:
接下来遇到的问题是CreateRemoteThread时遇到的问题, 测试环境:win7 x86 + win7 x64. 首先我把CreateRemoteThread成功的例子整理一下(我们自己的进程名字暂时叫self.exe):
1. 平台:x86. self.exe:x86. 目标进程:非系统进程.
2. 平台:x64. self.exe:x86. 目标进程:32位非系统进程.
3. 平台:x6
4. self.exe:x64. 目标进程:64位非系统进程.
接下来是CreateRemoteThread调用失败的一些情况:
1. 平台:x86. self.exe:x86. 目标进程:系统进程.
GetLastError()==8. 描述: Not enough storage is available to process this command.
2. 平台:x64. self.exe:x86. 目标进程:64位进程. (包括用户进程和系统进程)
GetLastError()==5. 描述: Access Denied.
3. 平台:x6
4. self.exe:x86. 目标进程:32位系统进程.
GetLastError()==8. 描述: Not enough storage is available to process this command.
4. 平台:x64. self.exe:x64. 目标进程:64位系统进程.
GetLastError()==8. 描述: Not enough storage is available to process this command.
5. 平台:x64. self.exe:x64. 目标进程:32位系统进程.
GetLastError()==8. 描述: Not enough storage is available to process this command.
6. 平台:x64. self.exe:x64. 目标进程:32位非系统进程.