-
-
[求助]如何调用NtCreateUserProcess
-
发表于: 2015-12-20 00:37 6644
-
先附上一些资料
typedef struct _NT_PROC_THREAD_ATTRIBUTE_ENTRY {
ULONG Attribute; // PROC_THREAD_ATTRIBUTE_XXX,参见MSDN中UpdateProcThreadAttribute的说明
SIZE_T Size; // Value的大小
ULONG_PTR Value; // 保存4字节数据(比如一个Handle)或数据指针
ULONG Unknown; // 总是0,可能是用来返回数据给调用者
} PROC_THREAD_ATTRIBUTE_ENTRY, *PPROC_THREAD_ATTRIBUTE_ENTRY;
typedef struct _NT_PROC_THREAD_ATTRIBUTE_LIST {
ULONG Length; // 结构总大小
PROC_THREAD_ATTRIBUTE_ENTRY Entry[1];
} NT_PROC_THREAD_ATTRIBUTE_LIST, *PNT_PROC_THREAD_ATTRIBUTE_LIST;
NTSTATUS NtCreateUserProcess(
OUT PHANDLE ProcessHandle,
OUT PHANDLE ThreadHandle,
IN ACCESS_MASK ProcessDesiredAccess,
IN ACCESS_MASK ThreadDesiredAccess,
IN POBJECT_ATTRIBUTES ProcessObjectAttributes OPTIONAL,
IN POBJECT_ATTRIBUTES ThreadObjectAttributes OPTIONAL,
IN ULONG CreateProcessFlags,
IN ULONG CreateThreadFlags,
IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters,
IN PVOID Parameter9,
IN PNT_PROC_THREAD_ATTRIBUTE_LIST AttributeList
);
然後是我自己的代码纯c语言控制台
#include <stdio.h>
#include <windows.h>
#include <tchar.h>
#include <Ntsecapi.h>
int result = -1;
typedef struct _NT_PROC_THREAD_ATTRIBUTE_ENTRY {
ULONG Attribute; // PROC_THREAD_ATTRIBUTE_XXX,参见MSDN中UpdateProcThreadAttribute的说明
SIZE_T Size; // Value的大小
ULONG_PTR Value; // 保存4字节数据(比如一个Handle)或数据指针
ULONG Unknown; // 总是0,可能是用来返回数据给调用者
} PROC_THREAD_ATTRIBUTE_ENTRY, *PPROC_THREAD_ATTRIBUTE_ENTRY;
typedef struct _NT_PROC_THREAD_ATTRIBUTE_LIST {
ULONG Length; // 结构总大小
PROC_THREAD_ATTRIBUTE_ENTRY Entry[1];
} NT_PROC_THREAD_ATTRIBUTE_LIST, *PNT_PROC_THREAD_ATTRIBUTE_LIST;
typedef NTSTATUS(__stdcall *TFNNtTestAlert)();
// NTSTATUS is LONG, in case that isn't defined in the above headers
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
int main(void)
{
int ret = 0;
HMODULE hModule = GetModuleHandle(TEXT("ntdll.dll"));
if (hModule != 0)
{
TFNNtTestAlert pfnNtCreateUserProcess = (TFNNtTestAlert)GetProcAddress(hModule, "NtCreateUserProcess");
if (pfnNtCreateUserProcess != 0)
{
printf("%x\n", pfnNtCreateUserProcess);
}
else
{
printf("no\n");
getchar(0);
return 1;
}
}
getchar(0);
return 0;
}
这是我逆向的代码
67842DA 8908 mov dword ptr ds:[eax],ecx
767842DC 50 push eax 这个不了解
767842DD 8D85 48FBFFFF lea eax,dword ptr ss:[ebp-0x4B8]
767842E3 50 push eax 这个不了解
767842E4 56 push esi 这个不了解
767842E5 6A 01 push 0x1
767842E7 FFB5 B4FCFFFF push dword ptr ss:[ebp-0x34C] 这里是0
767842ED FFB5 30FBFFFF push dword ptr ss:[ebp-0x4D0] 这里是0
767842F3 FFB5 28FBFFFF push dword ptr ss:[ebp-0x4D8] 这里是0
767842F9 B8 00000002 mov eax,0x2000000
767842FE 50 push eax
767842FF 50 push eax
76784300 8D85 ACFCFFFF lea eax,dword ptr ss:[ebp-0x354]
76784306 50 push eax 这个不了解
76784307 8D85 D0FCFFFF lea eax,dword ptr ss:[ebp-0x330]
7678430D 50 push eax ; 这个不了解
7678430E FF15 68067776 call dword ptr ds:[<&ntdll.NtCreateUserP>; ntdll_12.ZwCreateUserProcess
有5个参数不知怎麽填 求助阿
另外程序员要运动,避免跟某大大一样在小区晕倒
typedef struct _NT_PROC_THREAD_ATTRIBUTE_ENTRY {
ULONG Attribute; // PROC_THREAD_ATTRIBUTE_XXX,参见MSDN中UpdateProcThreadAttribute的说明
SIZE_T Size; // Value的大小
ULONG_PTR Value; // 保存4字节数据(比如一个Handle)或数据指针
ULONG Unknown; // 总是0,可能是用来返回数据给调用者
} PROC_THREAD_ATTRIBUTE_ENTRY, *PPROC_THREAD_ATTRIBUTE_ENTRY;
typedef struct _NT_PROC_THREAD_ATTRIBUTE_LIST {
ULONG Length; // 结构总大小
PROC_THREAD_ATTRIBUTE_ENTRY Entry[1];
} NT_PROC_THREAD_ATTRIBUTE_LIST, *PNT_PROC_THREAD_ATTRIBUTE_LIST;
NTSTATUS NtCreateUserProcess(
OUT PHANDLE ProcessHandle,
OUT PHANDLE ThreadHandle,
IN ACCESS_MASK ProcessDesiredAccess,
IN ACCESS_MASK ThreadDesiredAccess,
IN POBJECT_ATTRIBUTES ProcessObjectAttributes OPTIONAL,
IN POBJECT_ATTRIBUTES ThreadObjectAttributes OPTIONAL,
IN ULONG CreateProcessFlags,
IN ULONG CreateThreadFlags,
IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters,
IN PVOID Parameter9,
IN PNT_PROC_THREAD_ATTRIBUTE_LIST AttributeList
);
然後是我自己的代码纯c语言控制台
#include <stdio.h>
#include <windows.h>
#include <tchar.h>
#include <Ntsecapi.h>
int result = -1;
typedef struct _NT_PROC_THREAD_ATTRIBUTE_ENTRY {
ULONG Attribute; // PROC_THREAD_ATTRIBUTE_XXX,参见MSDN中UpdateProcThreadAttribute的说明
SIZE_T Size; // Value的大小
ULONG_PTR Value; // 保存4字节数据(比如一个Handle)或数据指针
ULONG Unknown; // 总是0,可能是用来返回数据给调用者
} PROC_THREAD_ATTRIBUTE_ENTRY, *PPROC_THREAD_ATTRIBUTE_ENTRY;
typedef struct _NT_PROC_THREAD_ATTRIBUTE_LIST {
ULONG Length; // 结构总大小
PROC_THREAD_ATTRIBUTE_ENTRY Entry[1];
} NT_PROC_THREAD_ATTRIBUTE_LIST, *PNT_PROC_THREAD_ATTRIBUTE_LIST;
typedef NTSTATUS(__stdcall *TFNNtTestAlert)();
// NTSTATUS is LONG, in case that isn't defined in the above headers
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
int main(void)
{
int ret = 0;
HMODULE hModule = GetModuleHandle(TEXT("ntdll.dll"));
if (hModule != 0)
{
TFNNtTestAlert pfnNtCreateUserProcess = (TFNNtTestAlert)GetProcAddress(hModule, "NtCreateUserProcess");
if (pfnNtCreateUserProcess != 0)
{
printf("%x\n", pfnNtCreateUserProcess);
}
else
{
printf("no\n");
getchar(0);
return 1;
}
}
getchar(0);
return 0;
}
这是我逆向的代码
67842DA 8908 mov dword ptr ds:[eax],ecx
767842DC 50 push eax 这个不了解
767842DD 8D85 48FBFFFF lea eax,dword ptr ss:[ebp-0x4B8]
767842E3 50 push eax 这个不了解
767842E4 56 push esi 这个不了解
767842E5 6A 01 push 0x1
767842E7 FFB5 B4FCFFFF push dword ptr ss:[ebp-0x34C] 这里是0
767842ED FFB5 30FBFFFF push dword ptr ss:[ebp-0x4D0] 这里是0
767842F3 FFB5 28FBFFFF push dword ptr ss:[ebp-0x4D8] 这里是0
767842F9 B8 00000002 mov eax,0x2000000
767842FE 50 push eax
767842FF 50 push eax
76784300 8D85 ACFCFFFF lea eax,dword ptr ss:[ebp-0x354]
76784306 50 push eax 这个不了解
76784307 8D85 D0FCFFFF lea eax,dword ptr ss:[ebp-0x330]
7678430D 50 push eax ; 这个不了解
7678430E FF15 68067776 call dword ptr ds:[<&ntdll.NtCreateUserP>; ntdll_12.ZwCreateUserProcess
有5个参数不知怎麽填 求助阿
另外程序员要运动,避免跟某大大一样在小区晕倒
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
看原图
赞赏
雪币:
留言: