免責宣告:這個問題似乎被否決了,因為我應該使用普通的 Win32 API(CreateProcess、ShellExecute)。我知道這些 API 并且我知道RtlCreateUserProcess不應該直接呼叫它們。但是,本機 API 是一個與安全性非常相關的主題,這就是我正在研究它的原因。
我正在嘗試使用RtlCreateUserProcess從 ntdll.dll 匯出的函式在 Windows 上運行程式。我的代碼可以運行 calc.exe,但是,在嘗試運行 notepad.exe 后,我收到一條錯誤訊息,內容為The ordinal 345 could not be located in dinamyc link library "C:\Windows\SysWOW64\notepad.exe". 當嘗試運行其他程式時,它會顯示各種類似的訊息,總是與某些序號或 DLL 丟失有關。
我的示例代碼如下所示:
#include <windows.h>
#include <iostream>
#include <winternl.h>
typedef struct _SECTION_IMAGE_INFORMATION {
PVOID EntryPoint;
ULONG StackZeroBits;
ULONG StackReserved;
ULONG StackCommit;
ULONG ImageSubsystem;
WORD SubSystemVersionLow;
WORD SubSystemVersionHigh;
ULONG Unknown1;
ULONG ImageCharacteristics;
ULONG ImageMachineType;
ULONG Unknown2[3];
} SECTION_IMAGE_INFORMATION, * PSECTION_IMAGE_INFORMATION;
typedef struct _RTL_USER_PROCESS_INFORMATION {
ULONG Size;
HANDLE ProcessHandle;
HANDLE ThreadHandle;
CLIENT_ID ClientId;
SECTION_IMAGE_INFORMATION ImageInformation;
} RTL_USER_PROCESS_INFORMATION, * PRTL_USER_PROCESS_INFORMATION;
typedef VOID(NTAPI* Func1)(PUNICODE_STRING DestinationString, __drv_aliasesMem PCWSTR SourceString);
typedef NTSTATUS(NTAPI* Func2)(OUT PRTL_USER_PROCESS_PARAMETERS* pProcessParameters, IN PUNICODE_STRING ImagePathName, IN PUNICODE_STRING DllPath OPTIONAL, IN PUNICODE_STRING CurrentDirectory OPTIONAL, IN PUNICODE_STRING CommandLine OPTIONAL, IN PVOID Environment OPTIONAL, IN PUNICODE_STRING WindowTitle OPTIONAL, IN PUNICODE_STRING DesktopInfo OPTIONAL, IN PUNICODE_STRING ShellInfo OPTIONAL, IN PUNICODE_STRING RuntimeData OPTIONAL);
typedef NTSTATUS(NTAPI* Func3)(PUNICODE_STRING NtImagePathName, ULONG Attributes, PRTL_USER_PROCESS_PARAMETERS ProcessParameters, PSECURITY_DESCRIPTOR ProcessSecurityDescriptor, PSECURITY_DESCRIPTOR ThreadSecurityDescriptor, HANDLE ParentProcess, BOOLEAN InheritHandles, HANDLE DebugPort, HANDLE ExceptionPort, PRTL_USER_PROCESS_INFORMATION ProcessInformation);
int main()
{
UNICODE_STRING str;
PRTL_USER_PROCESS_PARAMETERS processparameters;
RTL_USER_PROCESS_INFORMATION processinformation = { 0 };
Func1 RtlInitUnicodeString = (Func1)GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "RtlInitUnicodeString");
Func2 RtlCreateProcessParameters = (Func2)GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "RtlCreateProcessParameters");
Func3 RtlCreateUserProcess = (Func3)GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "RtlCreateUserProcess");
RtlInitUnicodeString(&str, L"\\??\\C:\\Windows\\SysWOW64\\notepad.exe"); //Starting calc.exe works, notepad.exe does not.
RtlCreateProcessParameters(&processparameters, &str, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
NTSTATUS works = RtlCreateUserProcess(&str, OBJ_CASE_INSENSITIVE, processparameters, NULL, NULL, NULL, FALSE, NULL, NULL, &processinformation);
if (NT_SUCCESS(works)) {
ResumeThread(processinformation.ThreadHandle);
//Started application crashes at this point the error message gets shown
}
else {
std::cout << "Failed" << std::endl;
}
return 0;
}
不幸的是,關于使用此功能的資訊并不多,因此如果您能提供有關如何正確使用此功能的任何答案,我將不勝感激。
uj5u.com熱心網友回復:
CreateProcess在創建新行程后做更多的作業,特別是它基于 exe 清單(BasepConstructSxsCreateProcessMessage CsrClientCallServer)為新行程創建激活背景關系,結果新行程具有初始激活背景關系,存盤在PEB(SystemDefaultActivationContextData和ActivationContextData)中,但在行程中創建純呼叫RtlCreateUserProcessthis欄位為空 (0)。因此,您的行程從system32(版本5.82)和帶有激活背景關系的記事本加載了ComCtl32.dll - 6 版本。
在 dinamyc 鏈接庫中找不到序號 345
真正在ComCtl32.DLL pre 6版本 ( 5.82 ) 中。345- 這是TaskDialogIndirect僅存在于ComCtl32.DLL版本6 中的api 。但是您的行程負載5.82 .. -呼叫 TaskDialogIndirect 加載程式說找不到序號 345
所以CreateProcess不是在RtlCreateUserProcessor 上的薄殼NtCreateUserProcess,而是大而復雜的 api。如果可能的話,它的功能非常困難,直接實作
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/328723.html
標籤:C C 视窗 登录 nt-native-api
