65,201
社区成员




typedef struct _INITIAL_TEB
{
PVOID PreviousStackBase;
PVOID PreviousStackLimit;
PVOID StackBase;
PVOID StackLimit;
PVOID AllocatedStackBase;
} INITIAL_TEB, *PINITIAL_TEB;
typedef struct _INITIAL_TEB {
PVOID StackBase;
PVOID StackLimit;
PVOID StackCommit;
PVOID StackCommitMax;
PVOID StackReserved;
} INITIAL_TEB, *PINITIAL_TEB;
HANDLE APIENTRY CreateRemoteThread(HANDLE hProcess, LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId)
{
NTSTATUS Status;
OBJECT_ATTRIBUTES Obja;
POBJECT_ATTRIBUTES pObja;
HANDLE Handle;
CONTEXT ThreadContext;
INITIAL_TEB InitialTeb;
CLIENT_ID ClientId;
// Allocate a stack for this thread
Status = BaseCreateStack(hProcess, dwStackSize, 0L, &InitialTeb );
// Create an initial context
BaseInitializeContext( &ThreadContext, lpParameter, (PVOID)lpStartAddress, InitialTeb.StackBase, BaseContextTypeThread);
pObja = BaseFormatObjectAttributes(&Obja, lpThreadAttributes, NULL);
Status = NtCreateThread( &Handle, THREAD_ALL_ACCESS, pObja, hProcess, &ClientId, &ThreadContext, &InitialTeb, TRUE );
}
Function CreateUserProcess(ByRef FileName As String,ByRef CommandLine As String,ByVal InheritedProcessId As ULONG_PTR,ByVal Wait As Long) As ULONG_PTR
Dim ProcessHandle As ULONG_PTR,SectionHandle As ULONG_PTR,FileHandle As ULONG_PTR,Status As ULONG_PTR,ObjectAttributes As OBJECT_ATTRIBUTES,ObjectName As UNICODE_STRING,IoStatusBlock As IO_STATUS_BLOCK,sii As SECTION_IMAGE_INFORMATION,_
RegionSize As Dword,UserStack As USER_STACK,BaseAddress As Dword,ThreadContext As Context,ClientID As CLIENT_ID,ThreadHandle As ULONG_PTR,CmdLineDes As UNICODE_STRING,ProcessParameters As PROCESS_PARAMETERS Ptr,Environment As Word Ptr,Position As Word _
Ptr,_
pbi As PROCESS_BASIC_INFORMATION,r As Dword,ProtectSize As Dword,OldProtect As Dword,ApiMessage As CSR_API_MESSAGE,InheritedProcess As Dword
FileName=UCode$(FileName)
ObjectName.Length=Len(FileName)
ObjectName.MaximumLength=ObjectName.Length
ObjectName.Buffer=StrPtr(FileName)
ObjectAttributes.Length=Len(OBJECT_ATTRIBUTES)
If InheritedProcessId<>0 Then
ClientId.ProcessId=InheritedProcessId
ClientId.ThreadId=0
Status=NtOpenProcess(InheritedProcess,&H080,ObjectAttributes,ClientId)
Else
InheritedProcess=-1
End If
ObjectAttributes.ObjectName=VarPtr(ObjectName)
Status=NtOpenFile(FileHandle,1 Or 32 Or &H00100000,ObjectAttributes,IoStatusBlock,1,32)
If Status<>0 Then Function=Status:Exit Function
ObjectAttributes.ObjectName=0
Status=NtCreateSection(SectionHandle,&H0F001F,ObjectAttributes,ByVal 0,&H020,&H01000000,FileHandle)
If Status<>0 Then Function=Status:Exit Function
Status=NtQuerySection(SectionHandle,1,sii,Len(SECTION_IMAGE_INFORMATION),ByVal 0)
If Status<>0 Then Function=Status:Exit Function
Status=NtCreateProcessEx(ProcessHandle,2035711,ObjectAttributes,InheritedProcess,0,SectionHandle,0,0,0)
If Status<>0 Then Function=Status:Exit Function
Status=NtQueryInformationProcess(ProcessHandle,0,pbi,Len(PROCESS_BASIC_INFORMATION),ByVal 0)
If Status<>0 Then Function=Status:Exit Function
ObjectName.Buffer+=8
ObjectName.Length-=8
ObjectName.MaximumLength=ObjectName.Length
If Len(CommandLine)=0 Then
Status=RtlCreateProcessParameters(ProcessParameters,VarPtr(ObjectName),0,0,0,0,0,0,0,0)
If Status<>0 Then Function=Status:Exit Function
Else
CmdLineDes.Length=Len(CommandLine)*2
CmdLineDes.MaximumLength=Len(CommandLine)*2
CommandLine=UCode$(CommandLine)
CmdLineDes.Buffer=StrPtr(CommandLine)
Status=RtlCreateProcessParameters(ProcessParameters,VarPtr(ObjectName),0,0,ByVal VarPtr(CmdLineDes),0,0,0,0,0)
If Status<>0 Then Function=Status:Exit Function
End If
!mov eax,fs:[48]
!mov eax,[eax+16]
!mov eax,[eax+72]
!mov Environment,eax
!mov Position,eax
Do While @Position<>0 Or @Position[1]<>0
Incr Position
Loop
RegionSize=Position-Environment
@ProcessParameters.Environment=0
Status=NtAllocateVirtualMemory(ProcessHandle,@ProcessParameters.Environment,0,RegionSize,&H03000,4)
If Status<>0 Then Function=Status:Exit Function
Status=NtWriteVirtualMemory(ProcessHandle,@ProcessParameters.Environment,Environment,Position-Environment,ByVal 0)
If Status<>0 Then Function=Status:Exit Function
BaseAddress=0
RegionSize=@ProcessParameters.TheSize
Status=NtAllocateVirtualMemory(ProcessHandle,BaseAddress,0,RegionSize,&H03000,4)
If Status<>0 Then Function=Status:Exit Function
Status=NtWriteVirtualMemory(ProcessHandle,BaseAddress,ProcessParameters,@ProcessParameters.TheSize,ByVal 0)
If Status<>0 Then Function=Status:Exit Function
Status=NtWriteVirtualMemory(ProcessHandle,pbi.PebBaseAddress+16,VarPtr(BaseAddress),4,ByVal 0)
If Status<>0 Then Function=Status:Exit Function
RegionSize=sii.StackReserved
Status=NtAllocateVirtualMemory(ProcessHandle,UserStack.ExpandableStackBottom,0,RegionSize,&H02000,4)
If Status<>0 Then Function=Status:Exit Function
UserStack.ExpandableStackBase=UserStack.ExpandableStackBottom+sii.StackReserved
UserStack.ExpandableStackLimit=UserStack.ExpandableStackBase-sii.StackCommit
RegionSize=sii.StackCommit+4096
If RegionSize>sii.StackReserved Then RegionSize=sii.StackReserved
BaseAddress=UserStack.ExpandableStackBase-RegionSize
Status=NtAllocateVirtualMemory(ProcessHandle,BaseAddress,0,RegionSize,&H01000,4)
If Status<>0 Then Function=Status:Exit Function
If RegionSize<sii.StackReserved Then
ProtectSize=4096
Status=NtProtectVirtualMemory(ProcessHandle,BaseAddress,ProtectSize,4 Or &H0100,OldProtect)
End If
'If Status<>0 Then Function=Status:Exit Function
ThreadContext.ContextFlags=&H010007
ThreadContext.regGs=0
!xor eax,eax
!mov ax,fs
!mov r,eax
ThreadContext.regFs=r
!mov ax,es
!mov r,eax
ThreadContext.regEs=r
!mov ax,ds
!mov r,eax
ThreadContext.regDs=r
!mov ax,ss
!mov r,eax
ThreadContext.regSs=r
!mov ax,cs
!mov r,eax
ThreadContext.regCs=r
!pushfd
!pop r
ThreadContext.regFlag = r
ThreadContext.regEsp = UserStack.ExpandableStackBase-4
ThreadContext.regEip = sii.EntryPoint
Status=NtCreateThread(ThreadHandle,2032639,ObjectAttributes,ProcessHandle,ClientId,ThreadContext,UserStack,1)
If Status<>0 Then Function=Status:Exit Function
If sii.ImageSubsystem=2 Or sii.ImageSubsystem=3 Then
ApiMessage.CsrssMessage.ApiNumber=&H010000
ApiMessage.CreateProcess.ProcessHandle=ProcessHandle
ApiMessage.CreateProcess.ThreadHandle=ThreadHandle
ApiMessage.CreateProcess.ProcessId=ClientId.ProcessId
ApiMessage.CreateProcess.ThreadId=ClientId.ThreadId
Status=CsrClientCallServer(ApiMessage,ByVal 0,&H010000,Len(CSR_API_MESSAGE))
End If
NtResumeThread ThreadHandle,ByVal 0
If Wait Then
NtWaitForSingleObject ProcessHandle,0,ByVal 0
NtQueryInformationProcess ProcessHandle,0,pbi,Len(PROCESS_BASIC_INFORMATION),ByVal 0
Status=pbi.ExitStatus
End If
RtlDestroyProcessParameters ProcessParameters
NtClose InheritedProcess
NtClose FileHandle
NtClose SectionHandle
NtClose ThreadHandle
NtClose ProcessHandle
Function=Status
End Function