首页
社区
课程
招聘
[求助]关于LdrLoadDll在win10下无法注入wininit的问题
发表于: 2016-9-1 16:22 17371

[求助]关于LdrLoadDll在win10下无法注入wininit的问题

2016-9-1 16:22
17371
目标:在win10 x64系统的wininit.exe进程里远程注入test.dll
之前看大牛的源码(对不起大牛,帖子和名字忘了),用了LdrLoadDll的方法进行远程注入,自己也拿来用了,在64位的win10下注入了explorer.exe、winlogon.exe等进程,但是在注入wininit.exe时,注入失败了。当目标是wininit.exe时,openprocess就返回error 5,没有权限。用的是管理员权限执行,程序里也提权了,代码贴出来,请大家指点。

//操作系统版本判断
BOOL Cx64Inject::IsVistaOrLater()
{
        OSVERSIONINFO osvi;
        ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
        osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        GetVersionEx(&osvi);
        if( osvi.dwMajorVersion >= 6 )
                return TRUE;
        return FALSE;
}

BOOL Cx64Inject::EnableDebugPrivilege()
{
        HANDLE hToken;   
        TOKEN_PRIVILEGES tkp;
        if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))   
                return( FALSE );
        LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid);
        tkp.PrivilegeCount = 1;   
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
        if (GetLastError() != ERROR_SUCCESS)   
                return FALSE;   

        return TRUE;
}

//OD跟踪,发现最后调用的是NtCreateThreadEx,所以这里手动调用
HANDLE Cx64Inject::MyCreateRemoteThread(HANDLE hProcess, LPTHREAD_START_ROUTINE pThreadProc, LPVOID pRemoteBuf)
{
        HANDLE hThread = NULL;
        FARPROC pFunc = NULL;
        if( IsVistaOrLater())// Vista, 7, Server2008
        {
                pFunc = GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "NtCreateThreadEx");
                if( pFunc == NULL )
                {
                        MyOutputDebugStringA("MyCreateRemoteThread() : GetProcAddress(\"NtCreateThreadEx\") 调用失败!错误代码: [%d]", GetLastError());
                        return NULL;
                }
                ((_NtCreateThreadEx64)pFunc)(&hThread,0x1FFFFF,NULL,hProcess,pThreadProc,pRemoteBuf,FALSE,NULL,NULL,NULL,NULL);
                if( hThread == NULL )
                {
                        MyOutputDebugStringA("MyCreateRemoteThread() : NtCreateThreadEx() 调用失败!错误代码: [%d]", GetLastError());
                        return NULL;
                }
        }
        else// 2000, XP, Server2003
        {
                hThread = CreateRemoteThread(hProcess,NULL,0,pThreadProc,pRemoteBuf,0,NULL);
                if( hThread == NULL )
                {
                        MyOutputDebugStringA("MyCreateRemoteThread() : CreateRemoteThread() 调用失败!错误代码: [%d]", GetLastError());
                        return NULL;
                }
        }
        if( WAIT_FAILED == WaitForSingleObject(hThread, INFINITE) )
        {
                MyOutputDebugStringA("MyCreateRemoteThread() : WaitForSingleObject() 调用失败!错误代码: [%d]", GetLastError());
                return NULL;
        }
        return hThread;
}

//在目标进程中创建线程并注入dll
BOOL Cx64Inject::InjectDll(DWORD dwProcessId,LPCWSTR lpcwDllPath)
{
        BOOL bRet = FALSE;
        HANDLE hProcess = NULL, hThread = NULL;
        LPVOID pCode = NULL;
        LPVOID pThreadData = NULL;
        int i =0 ;
        __try
        {
                if(!EnableDebugPrivilege())
                {
                        MyOutputDebugStringA("InjectDll() : EnableDebugPrivilege() 调用失败!错误代码: [%d]", GetLastError());
                        return -1;
                }
                //打开目标进程;
                hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwProcessId);
                DWORD dwError = GetLastError();
                if (hProcess == NULL)
                        __leave;
                //申请空间,把我们的代码和数据写入目标进程空间里;
                //写入数据;
                THREAD_DATA data;
                HMODULE hNtdll = GetModuleHandleW(L"ntdll.dll");
                data.fnRtlInitUnicodeString = (pRtlInitUnicodeString)GetProcAddress(hNtdll,"RtlInitUnicodeString");
                data.fnLdrLoadDll = (pLdrLoadDll)GetProcAddress(hNtdll,"LdrLoadDll");
                memcpy(data.DllName, lpcwDllPath, (wcslen(lpcwDllPath) + 1)*sizeof(WCHAR));
                data.DllPath = NULL;
                data.Flags = 0;
                data.ModuleHandle = INVALID_HANDLE_VALUE;
                pThreadData = VirtualAllocEx(hProcess, NULL, 4096, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
                if (pThreadData == NULL)
                        __leave;
                BOOL bWriteOK = WriteProcessMemory(hProcess, pThreadData,&data,sizeof(data), NULL);
                if (!bWriteOK)
                        __leave;
                MyOutputDebugStringA("pThreadData = 0x%p", pThreadData);
                //写入代码;
                DWORD SizeOfCode = (DWORD)ThreadProcEnd - (DWORD)ThreadProc;
                pCode = VirtualAllocEx(hProcess, NULL, SizeOfCode, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
                if (pCode == NULL)
                {
                        i =GetLastError();
                        MyOutputDebugStringA("InjectDll() : pCode = VirtualAllocEx() 调用失败!错误代码: [%d]", GetLastError());
                        __leave;
                }               
                bWriteOK = WriteProcessMemory(hProcess, pCode, (PVOID)ThreadProc, SizeOfCode, NULL);
                if (!bWriteOK)
                {
                        i =GetLastError();
                        __leave;
                }
                MyOutputDebugStringA("pCode = 0x%p", pCode);
                //创建远程线程,把ThreadProc作为线程起始函数,pThreadData作为参数;
                hThread = MyCreateRemoteThread(hProcess, (LPTHREAD_START_ROUTINE)pCode, pThreadData);
                if (hThread == NULL)
                        __leave;
                //等待完成;
                WaitForSingleObject(hThread, INFINITE);
                bRet = TRUE;
        }
        __finally
        {
                if (pThreadData != NULL)
                        VirtualFreeEx(hProcess, pThreadData, 0, MEM_RELEASE);
                if (pCode != NULL)
                        VirtualFreeEx(hProcess, pCode, 0, MEM_RELEASE);
                if (hThread != NULL)
                        CloseHandle(hThread);
                if (hProcess != NULL)
                        CloseHandle(hProcess);
        }

        return bRet;
}

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 2
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
在InjectDll函数,OpenProcess()时,就返回错误码5了。是不是权限还不够,还是wininit.exe根本不让open?
2016-9-1 16:25
0
雪    币: 4937
活跃值: (1959)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
win10 CreateRemoteThread  基本废了
2016-9-1 16:28
0
雪    币: 5248
活跃值: (6058)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
CreateRemoteThread没废,只是win8开始,一些系统关键进程RING3下禁止访问
2016-9-1 16:40
0
雪    币: 2
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
explorer.exe和winlogon.exe还是能插的,就是wininit.exe不行,openprocess都不行,我在想是不是openprocess完了后能否远程线程插入。
2016-9-1 16:47
0
雪    币: 2
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
是不是wininit.exe这些进程在ring3连openprocess都不让干?
2016-9-1 17:07
0
雪    币: 12876
活跃值: (9342)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
7
win8开始在PspOpenProcess里对进程进行open行为时会调用PsIsProtectedProcess判断该进程是否受保护,如果是由不受保护的进程open受保护进程则直接拒绝访问
解决方法是把你自己的进程保护标志位设置成保护,具体方法可以IDA看一下ntoskrnl!PsIsProtectedProcess
2016-9-1 17:10
0
雪    币: 2
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
PsIsProtectedProcess应该是正确方向,不过请教有没有小白一点的例子可以参考?
2016-9-1 17:44
0
雪    币: 12876
活跃值: (9342)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
10
610K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6p5j5i4u0@1K9q4c8G2L8W2)9J5c8V1S2&6M7r3g2J5b7X3!0F1k6b7`.`.
不要谢我
2016-9-1 17:52
0
雪    币: 2
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我先学习学习,那就不谢了
2016-9-2 09:27
0
雪    币: 90
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
稳定劫持中
2016-9-2 10:01
0
雪    币: 2
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
求指教
能否只在ring3实现?
2016-9-2 10:10
0
雪    币: 8833
活跃值: (2419)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
14
在R3启动一个Protect的进程就能操所有protect的进程了
方法参见:
45dK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0M7$3c8F1i4K6u0W2L8h3W2U0M7X3!0K6L8$3k6@1i4K6u0W2j5$3!0E0i4K6u0r3P5X3S2Q4x3X3c8U0L8W2)9J5c8X3I4A6j5Y4u0S2M7Y4W2Q4x3V1k6%4K9h3&6V1L8%4N6K6i4K6u0r3k6r3g2K6K9%4c8G2M7q4)9J5c8X3c8F1x3K6p5K6x3e0t1@1i4K6t1^5N6W2)9K6c8s2k6K6i4K6u0W2z5o6g2Q4x3U0W2Q4x3X3g2S2M7%4m8^5
2016-9-6 22:38
0
雪    币: 1402
活跃值: (351)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
又见大神,大神经常在论坛帮助别人呀,么么哒。
2016-9-7 14:04
0
雪    币: 2
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
多谢大神知道,我去学习学习
2016-9-18 14:49
0
游客
登录 | 注册 方可回帖
返回