首页
社区
课程
招聘
[求助]XP 下 CreateRemoteThread 的奇怪问题
发表于: 2009-8-31 16:32 4111

[求助]XP 下 CreateRemoteThread 的奇怪问题

2009-8-31 16:32
4111
void Load()
{
        BOOL bSuccess = FALSE;       
        STARTUPINFO si = {0};
        PROCESS_INFORMATION pi = {0};
        si.cb = sizeof(si);

        DWORD dwCreateFlag = CREATE_SUSPENDED;

        TCHAR szFile1[] = TEXT("C:\\windows\\system32\\notepad.exe");
        bSuccess = ::CreateProcess( NULL, szFile1, NULL, NULL, FALSE, dwCreateFlag, NULL, NULL, &si, &pi );

        wchar_t szFilePath[MAX_PATH] = L"C:\\windows\\system32\\kernel32.dll";

        LPVOID lpFilePath = VirtualAllocEx( pi.hProcess,NULL,sizeof(szFilePath),MEM_COMMIT,PAGE_READWRITE );
        if( lpFilePath )
        {
                DWORD dwBytes = 0;
                WriteProcessMemory( pi.hProcess, lpFilePath, szFilePath, sizeof(szFilePath), &dwBytes );
                HMODULE hKernel = GetModuleHandleW(L"Kernel32.dll");
                LPVOID pLoadLibrary = GetProcAddress( hKernel,"LoadLibraryW" );

                DWORD dwThreadId = 0;
                HANDLE hThread = NULL;
                hThread = CreateRemoteThread( pi.hProcess,NULL,0,(LPTHREAD_START_ROUTINE)pLoadLibrary,lpFilePath,CREATE_SUSPENDED,&dwThreadId );
                ResumeThread(hThread);
        }
        Sleep(50);// 这里如果不 Sleep,记事本正常启动,否则 ResumeThread( pi.hThread ) 后记事本无声消失了
        ResumeThread( pi.hThread );
}
========================================
就以上一个简单的创建远程线程的例子,在 Windows7、Windows 2003 下正常运行,并且无论 Sleep 多长时间都可以看到记事本窗口,但 XP 下就不行了,Sleep 超过 5 ms Notepad 进程都是突然无影踪
这如何解析?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 251
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
可能是进程还没有进行必要的初始化就被注入的线程抢先了
莫非XP线程初始化的某些代码同步有问题??
我的理解,正常情况下其他线程应该会等待主线程的初始化(至少应该执行完初始化NtDll的APC)
2009-8-31 19:23
0
雪    币: 185
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢 leftup 的回复。
你看我上面注入的 DLL,只是 user32.dll,而且,只要 Sleep 时间不是很过分,也能正常启动
2009-8-31 21:15
0
雪    币: 185
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
最终还是用 Debug API 来解决
估计原因正是 leftup 说的,是注入线程抢在 NTDLL.dll(或其他DLL) 前初始化导致宿主初始化失败,具体原因还是不理解

采用 Debug API,在入口点设置断点,当进入入口点时,再注入自己的 DLL,这时再怎么 Sleep 都没问题了

以前直接注入不会遇到这样问题的,不知道是不是 WinXP SP3 才有这样的问题
2009-8-31 22:51
0
游客
登录 | 注册 方可回帖
返回
//