创建进程流程CreateProcess

//---------------------------------------创建进程流程---------------------------------------------
call kernel32!CreateProcessA
 BOOL WINAPI CreateProcess(
 LPCTSTR lpApplicationName,
 LPTSTR lpCommandLine,
 LPSECURITY_ATTRIBUTES lpProcessAttributes,
 LPSECURITY_ATTRIBUTES lpThreadAttributes,
 BOOL bInheritHandles,
 DWORD dwCreationFlags, 
 LPVOID lpEnvironment,
 LPCTSTR lpCurrentDirectory,
 LPSTARTUPINFO lpStartupInfo,
 LPPROCESS_INFORMATION lpProcessInformation)
{
/* 参数说明:第一个与最后一个为零,中间10个延接了上面传入的10个参数
   主要目的:是将ANSI字符转换成Unicode字符*/
 call kernel32!CreateProcessInternalA(...)
 {
  {
   call kernel32!CreateProcessInternalW(...)
   {
    call ntdll!ZwQueryInformationJobObject(HANDLE JobHandle
     JOBOBJECTINFOCLASS JobInformationClass
     PVOID JobInformation
     ULONG JobInformationLength
     PULONG ReturnLengthOPTIONAL);
    判断返回值是否为C0000022h (拒绝访问)
    call kernel32!SearchPathW(...); //进行路径搜索
    call kernel32!GetFileAttributesW(...);//获取文件属性
    call kernel32!BasepIsSetupInvokedByWinLogon(...);//判断是否WinLogon进程
    call ntdll!RtlDosPathNameToNtPathName_U(....);
    call ntdll!RtlIInitUnicodeString();
    call ntdll!RtlDetermineDosPathNameType_U(.); //路径转换
    call ntdll!NtOpenFile(); //打开文件
    //创建Section CreateFileMapping是对NtCreateSection的封装
    call ntdll!NtCreateSection( 
     PHANDLE SectionHandle,
     ACCESS_MASK DesiredAccess,
     POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
     PLARGE_INTEGER MaximumSize OPTIONAL,
     ULONG Protect,
     ULONG Attributes,
     HANDLE FileHandle OPTIONAL);  //程序被映射进了内存
    {
     call kernel32!BasepCheckWinSaferRestrictions
     {
      RtlEnterCriticalSection(...);
      NtOpenThreadToken();//判断返值是否等于0C000007Ch(试图引用不存在的令牌)否跳走
      NtOpenProcessToken();//判断返回值是否为0C0000022h(拒绝访问)
     }
    }
    call ntdll.NtQuerySection(...);
    call kernel32!LdrQueryImageFileExecutionOptions //获取调试信息,映像劫持
     LdrQueryImageFileExecutionOptions ( IN PUNICODE_STRING SubKey, == "\??\E:\AAAAA.exe"进程名
     PCWSTR ValueName, == "Debugger"
     ULONG Type,
     PVOID Buffer, 
     ULONG BufferSize, 
     PULONG ReturnedLength OPTIONAL) 
    call kernel32!BasepIsImageVersionOk
    LoadLibraryA(advapi32.dll);
    GetProcAddress("CreateProcessAsUserSecure");
    call kernel32!BasepCheckBadapp();//对进程行行兼容性检查
    call kernel32!BasepIsImageVersionOk
    call kernel32!FreeLibrary "advapi32.dll"
    call kernel32!BaseFormatObjectAttributes
    call ntdll!ZwCreateProcessEx
    mov eax,30h
    call ntdll!KiFastSystemCall
    call ntdll!ZwSetInformationProcess
    NtSetInformationProcess ( ProcessHandle, == ZwCreateProcessEx时得到的进程句柄
     PROCESSINFOCLASS ProcessInformationClass, == 12h == ProcessDefaultHardErrorMode 
     PVOID ProcessInformation, == 2 == SEM_NOGPFAULTERRORBOX 
     ULONG ProcessInformationLength == 2) 
    
    NtSetInformationProcess(...) 
    call kernel32!BasepSxsCreateProcessCsrMessage
    {
     BasepSxsGetProcessImageBaseAddress KERNEL32
     RtlMultiAppendUnicodeStringBuffer NTDLL
     BasepSxsCreateStreams KERNEL32
     BasepSxsIsStatusFileNotFoundEtc 
     BasepSxsIsStatusResourceNotFound 
    }
    call ntdll!NtQueryInformationProcess(
     HANDLE ProcessHandle, == 进程句柄
     PROCESSINFOCLASS ProcessInformationClass, == 0 == ProcessBasicInformation
     PVOID ProcessInformation,
     ULONG ProcessInformationLength,
     PULONG ReturnLength OPTIONAL);
    call kernel32!BasePushProcessParameters
    {
     __SEH_prolog 
     GetFullPathNameW KERNEL32
     BaseComputeProcessDllPath KERNEL32
     RtlInitUnicodeString 
     RtlCreateProcessParameters NTDLL
     NtAllocateVirtualMemory 
     NtWriteVirtualMemory 
     __security_check_cookie 
     __SEH_epilog
    }
    call kernel32!BaseCreateStack
    {
     NTDLL.RtlImageNtHeader 
     NtAllocateVirtualMemory 
     NtProtectVirtualMemory
    }
    call kernel32!BaseInitializeContext
    {
     BaseInitializeContext
      (PCONTEXT Context, // 0x200 bytes
       PPEB Peb,
       PVOID EntryPoint,
       DWORD StackTop,
       int Type ); 
    }
    call kernel32!BaseFormatObjectAttributes
    call ntdll!ZwCreateThread
    mov eax,35h
    call ntdll!KiFastSystemCall
    call kernel32!GetModuleHandleA "NULL"
    eax == 0400000h ;程序装入地址
    call ntdll!RtlImageNtHeader eax //验证NTHeader
    //下面是通知Cress.exe的几个函数
    call ntdll!CsrCaptureMessageMultiUnicodeStringsInPlace
    call ntdll!CsrClientCallServer
    call ntdll!CsrFreeCaptureBuffer
    call ntdll!ZwResumeThread ;启动线程移交控制权并返回
    ret //进程创建过程结束
   }
  } 
 }
}


文章标签: CreateProcess

本文链接: http://lmroot.com/blog/?id=26,尊重共享,欢迎转载,请自觉添加本文链接,谢谢!

版权声明: 本文除特别说明外均由原创

分享本文:
呃 本文暂时没人评论 来添加一个吧

分享:

支付宝

微信

歌曲 - 歌手
0:00