现在的位置: 首页 > 综合 > 正文

进程及线程创建流程

2013年04月20日 ⁄ 综合 ⁄ 共 27004字 ⁄ 字号 评论关闭

今天在MuseHero的博客看到的资料,先收藏下来,以后慢慢学习,顺便了解一下WINDOWS的进程机制。

;进程创建过程开始 CreateProcessA
call   kernel32!CreateProcessA
 ;10个参数
; BOOL WINAPI CreateProcess(
;   __in_opt     LPCTSTR lpApplicationName,
;   __inout_opt  LPTSTR lpCommandLine,
;   __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,
;   __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,
;   __in         BOOL bInheritHandles,
;   __in         DWORD dwCreationFlags, NORMAL_PRIORITY_CLASS
;   __in_opt     LPVOID lpEnvironment,
;   __in_opt     LPCTSTR lpCurrentDirectory,
;   __in         LPSTARTUPINFO lpStartupInfo,
;   __out        LPPROCESS_INFORMATION lpProcessInformation
; );
; 直接调用kernel32!CreateProcessInternalA
call   kernel32!CreateProcessInternalA
; 12个参数,第一个与最后一个为零,中间10个延接了上面传入的10个参数
; 主要任务是将ANSI字符转换成Unicode字符,很多代码用于了转换与检查,所以,直接用Unicode编程将大大增加执行效率  
call   kernel32!CreateProcessInternalW
;  12个参数
;  基本延续上面的
;  第6个参数 and 0F7FFFFFFh

 

以下为kernel32!CreateProcessInternalW中的流程:

 

 call ntdll!ZwQueryInformationJobObject
;  ZwQueryInformationJobObjectretrieves information about a job object.
;  NTSYSAPI
;  NTSTATUS
;  NTAPI
;  ZwQueryInformationJobObject(
;  IN HANDLE JobHandle,           == 0
;  IN JOBOBJECTINFOCLASS JobInformationClass,   == 4
;  OUT PVOID JobInformation,         == Address
;  IN ULONG JobInformationLength,       == 4
;  OUT PULONG ReturnLengthOPTIONAL       == 0
;  );
;  判断返回值是否为C0000022h (拒绝访问)
 call kernel32!SearchPathW
;  进行路径搜索
 call kernel32!GetFileAttributesW
;  获取文件属性
 call kernel32!BasepIsSetupInvokedByWinLogon
;  判断是否WinLogon进程
 call ntdll!RtlDosPathNameToNtPathName_U
 call ntdll!RtlDetermineDosPathNameType_U
;  路径转换
 call ntdll!NtOpenFile
;  打开文件
 call ntdll!NtCreateSection
;  NtCreateSection(
;       OUT PHANDLE SectionHandle,
;       IN ACCESS_MASK DesiredAccess,
;       IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
;       IN PLARGE_INTEGER MaximumSize OPTIONAL,
;       IN ULONG Protect,
;       IN ULONG Attributes,
;       IN HANDLE FileHandle OPTIONAL
;       );
;  创建Section CreateFileMapping是对NtCreateSection的封装,所以在这一步,程序被映射进了内存
 call kernel32!BasepIsProcessAllowed
;  就一个参数为Unicode进程名字
;  其内部调用了RtlEnterCriticalSection进入临界区
;  再调用NtOpenKey打开:
;  "/Registry/MACHINE/System/CurrentControlSet/Control/Session Manager/AppCertDlls"
;  解释:
;    AppCertDlls details.
;    Create in the "//Registry//MACHINE//System//CurrentControlSet//Control//Session Manager//AppCertDlls"
;    
;    The Key with name "AppSecDll" type REG_EXPAND_SZ, and put there, something like that "%SystemRoot%/system32/.Dll" ... In fact, they may be there a lot, so keep this in mind.
;    
;    This yours DLL must have mandatory entry point with name CreateProcessNotify, and prototype as specified below.
;  结束
;  最后调用RtlLeaveCriticalSection
  
 call kernel32!BasepCheckBadapp
;  对进程行行兼容性检查
;  1. IsShimInfrastructureDisabled
;  2. RtlAllocateHeap    NTDLL
;  3. __imp__memmove    
;  4. BaseCheckAppcompatCache    KERNEL32
;    1. __SEH_prolog    
;    2. BasepShimCacheCheckBypass    KERNEL32
;    3. BasepShimCacheLock    KERNEL32
;    4. BasepShimCacheLookup    KERNEL32
;    5. BasepShimCacheUnlock    KERNEL32
;    6. __SEH_epilog
;  5. RtlFreeHeap    NTDLL
;  其中会加载:
;  call    kernel32!LdrLoadDllC:/WINDOWS/system32/Apphelp.dll
;  调用其中的“ApphelpCheckRunApp”
 call kernel32!BasepCheckWinSaferRestrictions
;  1. RtlEnterCriticalSection    NTDLL
;  2. NtOpenThreadToken
;   NtOpenThreadToken  (  IN HANDLE  ThreadHandle,  == 0FFFFFFFEh(-2 当前线程)
;     IN ACCESS_MASK  DesiredAccess,       == 2000000h
;     IN BOOLEAN  OpenAsSelf,         == 1
;     OUT PHANDLE  TokenHandle
;    )  
;   判断返值是否等于0C000007Ch(试图引用不存在的令牌)否跳走(跳走后的没跟,估计是跳向了NtSetInformationThread)
;   是则继续向下Call
;  3. NtOpenProcessToken
;   NtOpenProcessTokenEx  (  IN HANDLE  ProcessHandle,  == -1 当前进程
;     IN ACCESS_MASK  DesiredAccess,         == 0ah
;     IN ULONG  HandleAttributes, 
;     OUT PHANDLE  TokenHandle
;    ) 
;   判断返回值是否为0C0000022h(拒绝访问),
;   是跳走,否继续
;  4. NtQueryInformationToken
;   NtQueryInformationToken  (  IN HANDLE  TokenHandle,   == 上面得到的句柄
;     IN TOKEN_INFORMATION_CLASS  TokenInformationClass,  == 1
;     OUT PVOID  TokenInformation, 
;     IN ULONG  TokenInformationLength, 
;     OUT PULONG  ReturnLength
;    ) 
;  5. RtlInitializeSid 
;   RtlInitializeSid(    IN PSID  Sid,
;      IN PSID_IDENTIFIER_AUTHORITY  IdentifierAuthority,
;      IN UCHAR  SubAuthorityCount    );
;  6. RtlSubAuthoritySid
;  7. RtlEqualSid
;  8. NtOpenKey "/Registry/MACHINE/System/CurrentControlSet/Control/SafeBoot/Option"
;   打开失败,继续打开下面的:
;   "/Registry/Machine/Software/Policies/Microsoft/Windows/Safer/CodeIdentifiers"
;   打开成功:
;   Call NtQueryValueKey 取"TransparentEnabled"项的值
;   判断得到的值是否为零,不为零为设某变量为1
;   Call NtQueryValueKey 取"AuthenticodeEnabled"项的值
;   判断得到的值是否为零,不为零则跳转,我这里是零
;  9. NtClose 
;  10. call kernel32!LdrLoadDll "ADVAPI32.DLL" ; 装入DLL
;  11. call kernel32!LdrGetProcedureAddress   ;获取下列API地址
;   "SaferIdentifyLevel"
;   "SaferComputeTokenFromLevel"
;   "SaferCloseLevel"
;   "SaferRecordEventLogEntry"
;  12. NtClose 
;  13. call    kernel32!__security_check_cookie
 call ntdll!ZwQuerySection
;  ZwQuerySection  (  IN HANDLE  SectionHandle,        == Section句柄
;    IN SECTION_INFORMATION_CLASS  SectionInformationClass,    == 1
;    OUT PVOID  SectionInformation, 
;    IN SIZE_T  Length, 
;    OUT PSIZE_T  ResultLength
;   )
 call kernel32!LdrQueryImageFileExecutionOptions     
;  获取调试信息,映像劫持~
;  LdrQueryImageFileExecutionOptions  (  IN PUNICODE_STRING  SubKey,   == "/??/E:/AAAAA.exe"进程名
;    IN PCWSTR  ValueName,                  == "Debugger"
;    IN ULONG  Type,                    == 1
;    OUT PVOID  Buffer, 
;    IN ULONG  BufferSize, 
;    OUT PULONG ReturnedLength  OPTIONAL
;   ) 
 call kernel32!BasepIsImageVersionOk
 call kernel32!LoadLibraryA  "advapi32.dll"
 call kernel32!GetProcAddress "CreateProcessAsUserSecure"
 call ntdll!ZwQuerySystemInformation 
;  ZwQuerySystemInformation(
;  IN SYSTEM_INFORMATION_CLASSSystemInformationClass,   == 47H == "SystemCreateSession"
;  INOUT PVOIDSystemInformation,
;  IN ULONGSystemInformationLength,
;  OUT PULONGReturnLength OPTIONAL
;  ); 
 call kernel32!FreeLibrary  "advapi32.dll"
 call kernel32!BaseFormatObjectAttributes
 call ntdll!ZwCreateProcessEx

  mov eax,30h
  call ntdll!KiFastSystemCall
 call ntdll!ZwSetInformationProcess
;  NtSetInformationProcess  (  IN HANDLE  ProcessHandle,  == ZwCreateProcessEx时得到的进程句柄
;    IN PROCESSINFOCLASS  ProcessInformationClass,        == 12h == ProcessDefaultHardErrorMode            
;    IN PVOID  ProcessInformation,          == 2 == SEM_NOGPFAULTERRORBOX 
;    IN ULONG  ProcessInformationLength        == 2
;   ) 
 call kernel32!BasepSxsCreateProcessCsrMessage
;  1. BasepSxsGetProcessImageBaseAddress    KERNEL32
;  2. RtlMultiAppendUnicodeStringBuffer    NTDLL
;  3. BasepSxsCreateStreams    KERNEL32
;  4. BasepSxsIsStatusFileNotFoundEtc    
;  5. BasepSxsIsStatusResourceNotFound    
 call ntdll!NtQueryInformationProcess
;  ZwQueryInformationProcess(
;  IN HANDLE ProcessHandle,         == 进程句柄
;  IN PROCESSINFOCLASS ProcessInformationClass,   == 0 == ProcessBasicInformation
;  OUT PVOID ProcessInformation,
;  IN ULONG ProcessInformationLength,
;  OUT PULONG ReturnLength OPTIONAL
;  ); 
 call kernel32!BasePushProcessParameters
;  1. __SEH_prolog    
;  2. GetFullPathNameW    KERNEL32
;  3. BaseComputeProcessDllPath    KERNEL32
;  4. RtlInitUnicodeString    
;  5. RtlCreateProcessParameters    NTDLL
;  6. NtAllocateVirtualMemory    
;  7. NtWriteVirtualMemory    
;  8. __security_check_cookie    
;  9. __SEH_epilog
 call kernel32!BaseCreateStack
;  1. RtlImageNtHeader    NTDLL
;  2. NtAllocateVirtualMemory    
;  3. NtProtectVirtualMemory
 call kernel32!BaseInitializeContext
;  BaseInitializeContext(PCONTEXT Context, // 0x200 bytes
;  PPEB Peb,
;  PVOID EntryPoint,
;  DWORD StackTop,
;  int Type // union (Process, Thread, Fiber)
;  ); 
 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
;;进程创建过程结束 CreateProcessA 

 

;创建线程
Call NtCreateThread

;NtCreateThread(
;      OUT PHANDLE ThreadHandle,     +8h
;      IN ACCESS_MASK DesiredAccess, +Ch
;      IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, +10h
;      IN HANDLE ProcessHandle, +14h
;      OUT PCLIENT_ID ClientID, +18h
;      IN PCONTEXT Context, /* see _BaseInitializeContext */  +1ch
;      IN StackInformation* StackInfo, /* see _BaseCreateStack */ +20h
;      IN BOOLEAN CreateSuspended  /* ==1 */ +24h
;  );  

 

805c6ae0 64a124010000    mov     eax,dword ptr fs:[00000124h]    ;取KTHREAD结构地址
805c6ae6 8945e0          mov     dword ptr [ebp-20h],eax    ;保存在变量中
805c6ae9 80b84001000000  cmp     byte ptr [eax+140h],0    ;比较KTHREAD.PreviousMode 是否为0
805c6af6 a1b48b5580      mov     eax,dword ptr [nt!MmUserProbeAddress (80558bb4)]  ;取用户地址 eax == 7fff0000h
805c6afb 8b4d08          mov     ecx,dword ptr [ebp+8]         ;取第一个参数 也就是句柄输出的地址
805c6afe 3bc8            cmp     ecx,eax        ;进行地址比较
805c6b00 7206            jb      nt!NtCreateThread+0x38 (805c6b08) ;低于跳转
805c6b08 8b01            mov     eax,dword ptr [ecx]     ; -_-!
805c6b0a 8901            mov     dword ptr [ecx],eax     ; -_-!
805c6b0c 8b5d18          mov     ebx,dword ptr [ebp+18h]    ;取参数PCLIENT_ID到ebx
         ;以下为对 PCLIENT_ID的输入地址进行验证
805c6b0f 85db            test    ebx,ebx
805c6b11 7423            je      nt!NtCreateThread+0x66 (805c6b36)
805c6b13 895ddc          mov     dword ptr [ebp-24h],ebx
805c6b16 a1b48b5580      mov     eax,dword ptr [nt!MmUserProbeAddress (80558bb4)]
805c6b1b 3bd8            cmp     ebx,eax
805c6b1d 7203            jb      nt!NtCreateThread+0x52 (805c6b22)
805c6b22 f6c303          test    bl,3
805c6b25 7405            je      nt!NtCreateThread+0x5c (805c6b2c)
805c6b2c 8a03            mov     al,byte ptr [ebx]
805c6b2e 8803            mov     byte ptr [ebx],al
805c6b30 8a4304          mov     al,byte ptr [ebx+4]
805c6b33 884304          mov     byte ptr [ebx+4],al
         ;测试PCONTEXT Context参数
805c6b36 837d1c00        cmp     dword ptr [ebp+1Ch],0 
805c6b3a 743e            je      nt!NtCreateThread+0xaa (805c6b7a)
805c6b3c f6451c03        test    byte ptr [ebp+1Ch],3
805c6b40 7405            je      nt!NtCreateThread+0x77 (805c6b47)
805c6b47 a1b48b5580      mov     eax,dword ptr [nt!MmUserProbeAddress (80558bb4)]
805c6b4c 39451c          cmp     dword ptr [ebp+1Ch],eax
805c6b4f 720b            jb      nt!NtCreateThread+0x8c (805c6b5c)
         ;测试StackInformation参数
;         Typedef struct _StackInformation
;         {
;              DWORD Reserved0;
;              DWORD Reserved1;
;              DWORD AddressOfTop;
;              DWORD CommitAddress;
;              DWORD ReservedAddress;
;         } StackInformation;
805c6b5c 8b5d20        mov     ebx,dword ptr [ebp+20h]
805c6b5f f6c303          test    bl,3
805c6b62 740a            je      nt!NtCreateThread+0x9e (805c6b6e)
805c6b6e 3bd8            cmp     ebx,eax            ;eax==7fff0000h 地址测试
805c6b70 7216            jb      nt!NtCreateThread+0xb8 (805c6b88)
        ;以下为测试Reserved0与Reserved1两个参数是否为0,同时赋值两个变量为0
805c6b88 8b03            mov     eax,dword ptr [ebx]          
805c6b8a 8945c8          mov     dword ptr [ebp-38h],eax
eax=00000000
805c6b8d 8b4b04          mov     ecx,dword ptr [ebx+4]
805c6b90 894dcc          mov     dword ptr [ebp-34h],ecx
ecx=00000000
805c6b93 33d2            xor     edx,edx
805c6b95 3bc2            cmp     eax,edx
805c6b97 750e            jne     nt!NtCreateThread+0xd7 (805c6ba7)
805c6b99 3bca            cmp     ecx,edx
805c6b9b 750a            jne     nt!NtCreateThread+0xd7 (805c6ba7)
        ; 将StackInformation参数中的内容移动到变量[ebp-38h]中
805c6b9d 6a05            push    5
805c6b9f 59              pop     ecx
805c6ba0 8bf3            mov     esi,ebx
805c6ba2 8d7dc8          lea     edi,[ebp-38h]
805c6ba5 f3a5            rep movs dword ptr es:[edi],dword ptr [esi] 

 

805c6ba7 834dfcff        or      dword ptr [ebp-4],0FFFFFFFFh ;将第一个变量赋值为 -1
;调用PspCreateThread
;PspCreateThread(
;    OUT PHANDLE ThreadHandle, 
;    IN ACCESS_MASK DesiredAccess,
;    IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
;    IN HANDLE ProcessHandle,
;    IN PEPROCESS ProcessPointer,
;    OUT PCLIENT_ID ClientId OPTIONAL,
;    IN PCONTEXT ThreadContext OPTIONAL,
;    IN PINITIAL_TEB InitialTeb OPTIONAL,
;    IN BOOLEAN CreateSuspended,
;    IN PKSTART_ROUTINE StartRoutine OPTIONAL,
;    IN PVOID StartContext
;    )
805c6bab 52              push    edx      ;StartContext == 0   30
805c6bac 52              push    edx      ;StartRoutine== 0    2c
805c6bad ff7524          push    dword ptr [ebp+24h]  ;CreateSuspended    28
805c6bb0 8d45c8          lea     eax,[ebp-38h]   ;         
805c6bb3 50              push    eax        ;InitialTeb      24
805c6bb4 ff751c          push    dword ptr [ebp+1Ch]  ;ThreadContext     20
805c6bb7 ff7518          push    dword ptr [ebp+18h]  ;PCLIENT_ID参数    1c
805c6bba 52              push    edx                  ;  ProcessPointer == 0  18
805c6bbb ff7514          push    dword ptr [ebp+14h]  ;ProcessHandle     14
805c6bbe ff7510          push    dword ptr [ebp+10h]  ;ObjectAttributes    10
805c6bc1 ff750c          push    dword ptr [ebp+0Ch] ;DesiredAccess     c
805c6bc4 ff7508          push    dword ptr [ebp+8]  ;ThreadHandle          8
805c6bc7 e8c4efffff      call    nt!PspCreateThread (805c5b90)
       805c5b9f 64a124010000    mov     eax,dword ptr fs:[00000124h]
   805c5ba5 8945c4          mov     dword ptr [ebp-3Ch],eax    ;取KTHREAD保存到变量中
   805c5ba8 33f6            xor     esi,esi
   805c5baa 39752c          cmp     dword ptr [ebp+2Ch],esi    ;测试CreateSuspended标志是否为零
   805c5bad 7406            je      nt!PspCreateThread+0x25 (805c5bb5) ;为零跳转
   805c5bb5 8a8040010000    mov     al,byte ptr [eax+140h]     ;存KTHREAD.PreviousMode 到变量
   805c5bbb 8845d0          mov     byte ptr [ebp-30h],al
   805c5bbe 8975e4          mov     dword ptr [ebp-1Ch],esi             ;变量清零
   805c5bc1 33db            xor     ebx,ebx
   805c5bc3 895da4          mov     dword ptr [ebp-5Ch],ebx     ;变量清零
   805c5bc6 397514          cmp     dword ptr [ebp+14h],esi         ;判断ProcessHandle是否为零
   805c5bc9 7426            je      nt!PspCreateThread+0x61 (805c5bf1)  ;为零则跳转
   ;call    nt!ObReferenceObjectByHandle
;   ObReferenceObjectByHandle(
;       IN HANDLE  Handle,
;       IN ACCESS_MASK  DesiredAccess,
;       IN POBJECT_TYPE  ObjectType  OPTIONAL,
;       IN KPROCESSOR_MODE  AccessMode,
;       OUT PVOID  *Object,
;       OUT POBJECT_HANDLE_INFORMATION  HandleInformation  OPTIONAL
;       );   
   805c5bcb 56              push    esi       ;HandleInformation == 0   
   805c5bcc 8d856cffffff    lea     eax,[ebp-94h]
   805c5bd2 50              push    eax       ;*Object == 返回的对像指针
   805c5bd3 ff75d0          push    dword ptr [ebp-30h]     ;AccessMode == KTHREAD.PreviousMode == 1
   805c5bd6 ff3558a35580    push    dword ptr [nt!PsProcessType (8055a358)]  ;ObjectType
   805c5bdc 6a02            push    2        ;DesiredAccess == 2
   805c5bde ff7514          push    dword ptr [ebp+14h]     ;Handle == 进程句柄 == 110h
   805c5be1 e8aaa9feff      call    nt!ObReferenceObjectByHandle (805b0590)
   805c5be6 8b9d6cffffff    mov     ebx,dword ptr [ebp-94h]  ;保存进程对像指针到EBX
   805c5bec 895da4          mov     dword ptr [ebp-5Ch],ebx  ;保存进程对像指针到变量
   805c5bef eb1b            jmp     nt!PspCreateThread+0x7c (805c5c0c)
   805c5c0c 3bc6            cmp     eax,esi                  ;测试是否上一调用是否完成
   805c5c0e 0f8c33070000    jl      nt!PspCreateThread+0x7b7 (805c6347)
   805c5c14 807dd000        cmp     byte ptr [ebp-30h],0     ;比较KTHREAD.PreviousMode是否为0
   805c5c18 740f            je      nt!PspCreateThread+0x99 (805c5c29)
   805c5c1a 3b1d54a35580    cmp     ebx,dword ptr [nt!PsInitialSystemProcess (8055a354)] ;比较是否为系统进程 PsInitialSystemProcess返回系统进程的EPROCESS
   805c5c20 7507            jne     nt!PspCreateThread+0x99 (805c5c29) ;不等跳转

 

   ;call    nt!ObCreateObject (805b66b0)
;   ObCreateObject  (  IN KPROCESSOR_MODE ObjectAttributesAccessMode  OPTIONAL, 
;          IN POBJECT_TYPE  Type, 
;          IN POBJECT_ATTRIBUTES ObjectAttributes  OPTIONAL, 
;          IN KPROCESSOR_MODE  AccessMode, 
;          IN OUT PVOID ParseContext  OPTIONAL, 
;          IN ULONG  ObjectSize, 
;          IN ULONG PagedPoolCharge  OPTIONAL, 
;          IN ULONG NonPagedPoolCharge  OPTIONAL, 
;          OUT PVOID *  Object
;         )  
   805c5c29 8d45b0          lea     eax,[ebp-50h]     ;*  Object 保存对像指针
   805c5c2c 50              push    eax     ;
   805c5c2d 56              push    esi     ; NonPagedPoolCharge == 0
   805c5c2e 56              push    esi     ; PagedPoolCharge  == 0
   805c5c2f 6858020000      push    258h     ; ObjectSize == 258h
   805c5c34 56              push    esi      ;ParseContext == 0
   805c5c35 ff75d0          push    dword ptr [ebp-30h]   ;KPROCESSOR_MODE == KTHREAD.PreviousMode == 1
   805c5c38 ff7510          push    dword ptr [ebp+10h]   ;继承而来的ObjectAttributes参数
   805c5c3b ff355ca35580    push    dword ptr [nt!PsThreadType (8055a35c)] ;线程类型
   805c5c41 ff75d0          push    dword ptr [ebp-30h]   ;ObjectAttributesAccessMode == KTHREAD.PreviousMode == 1
   805c5c44 e8670affff      call    nt!ObCreateObject (805b66b0)
   805c5c49 3bc6            cmp     eax,esi    ;判断调用是否成功
   805c5c4b 7d10            jge     nt!PspCreateThread+0xcd (805c5c5d)
   805c5c5d b996000000      mov     ecx,96h
   805c5c62 33c0            xor     eax,eax
   805c5c64 8b75b0          mov     esi,dword ptr [ebp-50h]   ;移动对像指针
   805c5c67 8bfe            mov     edi,esi
   805c5c69 f3ab            rep stos dword ptr es:[edi]    ;移动到ES?
   805c5c6b 218634020000    and     dword ptr [esi+234h],eax ;ETHREAD.RundownProtect 清零
   805c5c71 899e20020000    mov     dword ptr [esi+220h],ebx ;移动进程的EPROCESS指针到ETHREAD.ThreadsProcess
   805c5c77 8dbeec010000    lea     edi,[esi+1ECh]     ;取ETHREAD.ActiveTimerListHead到EDI
   805c5c7d 8b8384000000    mov     eax,dword ptr [ebx+84h] ds:0023:817bd844=00000004 ;取当前进程ID到eax 4==系统进程
   805c5c83 8907            mov     dword ptr [edi],eax  ds:0023:8164e75c=00000000
   805c5c85 8975b4          mov     dword ptr [ebp-4Ch],esi ss:0010:f9e2fd00=00000630 ;保存ESI到变量
   805c5c88 8365b800        and     dword ptr [ebp-48h],0 ss:0010:f9e2fd04=8164e558  
   ;   ;ExCreateHandle ,PspCidTable,&CidEntry
   805c5c8c 8d45b4          lea     eax,[ebp-4Ch]
   805c5c8f 50              push    eax
   805c5c90 ff3560a35580    push    dword ptr [nt!PspCidTable (8055a360)] ds:0023:8055a360=e1001850
   805c5c96 e8f5e20300      call    nt!ExCreateHandle (80603f90)
   805c5c9b 8986f0010000    mov     dword ptr [esi+1F0h],eax ds:0023:8164e760=00000000 ;移动返回的线程句柄到ETHREAD._CLIENT_ID.UniqueThread eax=00000230
   805c5ca1 85c0            test    eax,eax      ;测试返回值
   805c5ca3 750a            jne     nt!PspCreateThread+0x11f (805c5caf)     [br=1]
   805c5caf a1bca35480      mov     eax,dword ptr [nt!MmReadClusterSize (8054a3bc)] ds:0023:8054a3bc=00000007
   805c5cb4 898640020000    mov     dword ptr [esi+240h],eax ds:0023:8164e7b0=00000000 ;填充ETHTREAD.ReadClusterSize
   805c5cba 6a01            push    1
   805c5cbc 6a00            push    0
   805c5cbe 8d86f4010000    lea     eax,[esi+1F4h]
   805c5cc4 50              push    eax
   805c5cc5 e87c64f3ff      call    nt!KeInitializeSemaphore (804fc146) ;初始化信号灯
   805c5cca 8d86c8010000    lea     eax,[esi+1C8h]  ;初始化ETHREAD.ExitTime
   805c5cd0 894004          mov     dword ptr [eax+4],eax ds:0023:8164e73c=00000000
   805c5cd3 8900            mov     dword ptr [eax],eax  ds:0023:8164e738=00000000
   
   805c5cd5 8d8610020000    lea     eax,[esi+210h]  ;初始化ETHREAD.IrpList
   805c5cdb 894004          mov     dword ptr [eax+4],eax ds:0023:8164e784=00000000
   805c5cde 8900            mov     dword ptr [eax],eax  ds:0023:8164e780=00000000
   
   805c5ce0 8d86d4010000    lea     eax,[esi+1D4h]  ;初始化ETHREAD.PostBlockList
   805c5ce6 894004          mov     dword ptr [eax+4],eax ds:0023:8164e748=00000000
   805c5ce9 8900            mov     dword ptr [eax],eax  ds:0023:8164e744=00000000
   805c5ceb 83a63802000000  and     dword ptr [esi+238h],0 ds:0023:8164e7a8=00000000
   
   805c5cf2 8d86e0010000    lea     eax,[esi+1E0h]   ;初始化ETHREAD.ActiveTimerListLock
   805c5cf8 50              push    eax
   805c5cf9 e8626ff7ff      call    nt!KeInitializeSpinLock (8053cc60)
   
   805c5cfe 8d86e4010000    lea     eax,[esi+1E4h]  ;初始化ETHREAD.ActiveTimerListHead
   805c5d04 894004          mov     dword ptr [eax+4],eax ds:0023:8164e758=00000000
   805c5d07 8900            mov     dword ptr [eax],eax  ds:0023:8164e754=00000000
   
   805c5d09 8d8b80000000    lea     ecx,[ebx+80h]  ;EPROCESS.RundownProtect
   805c5d0f 898d68ffffff    mov     dword ptr [ebp-98h],ecx ss:0010:f9e2fcb4=817bd840
   
   805c5d15 e874c60300      call    nt!ExAcquireRundownProtection (8060238e)
   805c5d1a 84c0            test    al,al
   805c5d1c 750a            jne     nt!PspCreateThread+0x198 (805c5d28)     [br=1]
   
   805c5d28 837d2000        cmp     dword ptr [ebp+20h],0 ss:0010:f9e2fd6c=00000000
   805c5d2c 0f8484000000    je      nt!PspCreateThread+0x226 (805c5db6)     [br=1]
   805c5db6 33c9            xor     ecx,ecx
   805c5db8 894de4          mov     dword ptr [ebp-1Ch],ecx ss:0010:f9e2fd30=00000000
   
   805c5dbb 6a10            push    10h
   805c5dbd 58              pop     eax
   805c5dbe 8d9648020000    lea     edx,[esi+248h]  ;移动10h到ETHREAD.CrossThreadFlags
   805c5dc4 f00902          lock or dword ptr [edx],eax  ds:0023:8164e7b8=00000000 

 

   805c5dc7 8b452c          mov     eax,dword ptr [ebp+2Ch] ss:0010:f9e2fd78={NDIS!ndisWorkerThread (f96fdb85)}
   805c5dca 898624020000    mov     dword ptr [esi+224h],eax ds:0023:8164e794=00000000 ;移动开始地址到 ETHREAD.StartAddress (PspCreateThread的第10个参数StartRoutine)
   
   805c5dd0 53              push    ebx ;EPROCESS
   805c5dd1 51              push    ecx ;==0
   805c5dd2 51              push    ecx ;==0
   805c5dd3 ff7530          push    dword ptr [ebp+30h]  ss:0010:f9e2fd7c=81591f50  ;StartContext
   805c5dd6 50              push    eax               ;ETHREAD.StartAddress
   805c5dd7 68f4595c80      push    offset nt!PspSystemThreadStartup (805c59f4)    
   805c5ddc 51              push    ecx               ;NULL
   805c5ddd 56              push    esi               ;ETHREAD
   805c5dde e8c10bfdff      call    nt!KeInitThread (805969a4)  ;初始化线程(在网上没找到C原型)
   805c5de3 8bf8            mov     edi,eax
   805c5de5 85ff            test    edi,edi     ;测试是否调用成功
   805c5de7 7d1c            jge     nt!PspCreateThread+0x275 (805c5e05)     [br=1]
   
   805c5e05 8b7dc4          mov     edi,dword ptr [ebp-3Ch] ss:0010:f9e2fd10=81781bd8
   805c5e08 ff8fd4000000    dec     dword ptr [edi+0D4h] ds:0023:81781cac=00000000
   805c5e0e 8d436c          lea     eax,[ebx+6Ch]   ;EPROCESS.ProcessLock
   805c5e11 89458c          mov     dword ptr [ebp-74h],eax ss:0010:f9e2fcd8=817bd82c
   805c5e14 b800000000      mov     eax,0
   805c5e19 8b4d8c          mov     ecx,dword ptr [ebp-74h] ss:0010:f9e2fcd8=817bd82c
   805c5e1c ba02000000      mov     edx,2
   805c5e21 0fb111          cmpxchg dword ptr [ecx],edx  ds:0023:817bd82c=00000000 ;设置EPROCESS.ProcessLock.Value==2
   805c5e24 85c0            test    eax,eax
   805c5e26 7408            je      nt!PspCreateThread+0x2a0 (805c5e30)     [br=1]
   805c5e30 f6834802000008  test    byte ptr [ebx+248h],8      ds:0023:817bda08=00
   805c5e37 746f            je      nt!PspCreateThread+0x318 (805c5ea8)     [br=1]
   
   805c5ea8 8d83a0010000    lea     eax,[ebx+1A0h]
   805c5eae 8b38            mov     edi,dword ptr [eax]  ds:0023:817bd960=00000034
   805c5eb0 8d4f01          lea     ecx,[edi+1]
   805c5eb3 8908            mov     dword ptr [eax],ecx  ds:0023:817bd960=00000034
   805c5eb5 8d862c020000    lea     eax,[esi+22Ch]   ;ETHREAD.ThreadListEntry
   805c5ebb 8d8b90010000    lea     ecx,[ebx+190h]   ;EPROCESS.ThreadListHead
   805c5ec1 8b5104          mov     edx,dword ptr [ecx+4] ds:0023:817bd954=816ad86c
   805c5ec4 8908            mov     dword ptr [eax],ecx  ds:0023:8164e79c=00000000
   805c5ec6 895004          mov     dword ptr [eax+4],edx ds:0023:8164e7a0=00000000
   805c5ec9 8902            mov     dword ptr [edx],eax  ds:0023:816ad86c=817bd950
   805c5ecb 894104          mov     dword ptr [ecx+4],eax ds:0023:817bd954=816ad86c
   805c5ece 56              push    esi   
   805c5ecf e8dc6af3ff      call    nt!KeStartThread (804fc9b0)
   call    nt!ExReleaseRundownProtection
   call    nt!WmiTraceThread
   call    nt!ObReferenceObjectEx
   call    nt!SeCreateAccessStateEx
   call    nt!ObInsertObject
   call    nt!SeDeleteAccessState
   call    nt!KeQuerySystemTime
   call    nt!ObGetObjectSecurity
   call    nt!PsReferencePrimaryToken
   call    nt!SeAccessCheck
   call    nt!ObFastDereferenceObject
   call    nt!ObReleaseObjectSecurity
   call    nt!KeReadyThread
   call    nt!ObfDereferenceObject  

 

;附ETHREAD结构数据:
   +0x000 Tcb              : _KTHREAD
      +0x000 Header           : _DISPATCHER_HEADER
      +0x010 MutantListHead   : _LIST_ENTRY [ 0x8164e580 - 0x8164e580 ]
      +0x018 InitialStack     : 0xf7d7e000
      +0x01c StackLimit       : 0xf7d7b000
      +0x020 Teb              : (null)
      +0x024 TlsArray         : (null)
      +0x028 KernelStack      : 0xf7d7ddd4
      +0x02c DebugActive      : 0 ''
      +0x02d State            : 0 ''
      +0x02e Alerted          : [2]  ""
      +0x030 Iopl             : 0 ''
      +0x031 NpxState         : 0xa ''
      +0x032 Saturation       : 0 ''
      +0x033 Priority         : 0 ''
      +0x034 ApcState         : _KAPC_STATE
      +0x04c ContextSwitches  : 0
      +0x050 IdleSwapBlock    : 0 ''
      +0x051 Spare0           : [3]  ""
      +0x054 WaitStatus       : 0
      +0x058 WaitIrql         : 0 ''
      +0x059 WaitMode         : 0 ''
      +0x05a WaitNext         : 0 ''
      +0x05b WaitReason       : 0 ''
      +0x05c WaitBlockList    : (null)
      +0x060 WaitListEntry    : _LIST_ENTRY [ 0x0 - 0x0 ]
      +0x060 SwapListEntry    : _SINGLE_LIST_ENTRY
      +0x068 WaitTime         : 0
      +0x06c BasePriority     : 0 ''
      +0x06d DecrementCount   : 0 ''
      +0x06e PriorityDecrement : 0 ''
      +0x06f Quantum          : 0 ''
      +0x070 WaitBlock        : [4] _KWAIT_BLOCK
      +0x0d0 LegoData         : (null)
      +0x0d4 KernelApcDisable : 0
      +0x0d8 UserAffinity     : 0
      +0x0dc SystemAffinityActive : 0 ''
      +0x0dd PowerState       : 0 ''
      +0x0de NpxIrql          : 0 ''
      +0x0df InitialNode      : 0 ''
      +0x0e0 ServiceTable     : 0x80553180
      +0x0e4 Queue            : (null)
      +0x0e8 ApcQueueLock     : 0
      +0x0f0 Timer            : _KTIMER
      +0x118 QueueListEntry   : _LIST_ENTRY [ 0x0 - 0x0 ]
      +0x120 SoftAffinity     : 1
      +0x124 Affinity         : 0
      +0x128 Preempted        : 0 ''
      +0x129 ProcessReadyQueue : 0 ''
      +0x12a KernelStackResident : 0x1 ''
      +0x12b NextProcessor    : 0 ''
      +0x12c CallbackStack    : (null)
      +0x130 Win32Thread      : (null)
      +0x134 TrapFrame        : (null)
      +0x138 ApcStatePointer  : [2] 0x8164e5a4 _KAPC_STATE
      +0x140 PreviousMode     : 0 ''
      +0x141 EnableStackSwap  : 0x1 ''
      +0x142 LargeStack       : 0 ''
      +0x143 ResourceIndex    : 0 ''
      +0x144 KernelTime       : 0
      +0x148 UserTime         : 0
      +0x14c SavedApcState    : _KAPC_STATE
      +0x164 Alertable        : 0 ''
      +0x165 ApcStateIndex    : 0 ''
      +0x166 ApcQueueable     : 0x1 ''
      +0x167 AutoAlignment    : 0 ''
      +0x168 StackBase        : 0xf7d7e000
      +0x16c SuspendApc       : _KAPC
      +0x19c SuspendSemaphore : _KSEMAPHORE
      +0x1b0 ThreadListEntry  : _LIST_ENTRY [ 0x0 - 0x0 ]
      +0x1b8 FreezeCount      : 0 ''
      +0x1b9 SuspendCount     : 0 ''
      +0x1ba IdealProcessor   : 0 ''
      +0x1bb DisableBoost     : 0 ''
   +0x1c0 CreateTime       : _LARGE_INTEGER 0x0
      +0x000 LowPart          : 0
      +0x004 HighPart         : 0
      +0x000 u                : __unnamed
      +0x000 QuadPart         : 0
   +0x1c0 NestedFaultCount : 0y00
   +0x1c0 ApcNeeded        : 0y0
   +0x1c8 ExitTime         : _LARGE_INTEGER 0x8164e738`8164e738
      +0x000 LowPart          : 0x8164e738
      +0x004 HighPart         : -2124093640
      +0x000 u                : __unnamed
      +0x000 QuadPart         : -9122912715270723784
   +0x1c8 LpcReplyChain    : _LIST_ENTRY [ 0x8164e738 - 0x8164e738 ]
      +0x000 Flink            : 0x8164e738 _LIST_ENTRY [ 0x8164e738 - 0x8164e738 ]
      +0x004 Blink            : 0x8164e738 _LIST_ENTRY [ 0x8164e738 - 0x8164e738 ]
   +0x1c8 KeyedWaitChain   : _LIST_ENTRY [ 0x8164e738 - 0x8164e738 ]
      +0x000 Flink            : 0x8164e738 _LIST_ENTRY [ 0x8164e738 - 0x8164e738 ]
      +0x004 Blink            : 0x8164e738 _LIST_ENTRY [ 0x8164e738 - 0x8164e738 ]
   +0x1d0 ExitStatus       : 0
   +0x1d0 OfsChain         : (null)
   +0x1d4 PostBlockList    : _LIST_ENTRY [ 0x8164e744 - 0x8164e744 ]
      +0x000 Flink            : 0x8164e744 _LIST_ENTRY [ 0x8164e744 - 0x8164e744 ]
      +0x004 Blink            : 0x8164e744 _LIST_ENTRY [ 0x8164e744 - 0x8164e744 ]
   +0x1dc TerminationPort  : (null)
   +0x1dc ReaperLink       : (null)
   +0x1dc KeyedWaitValue   : (null)
   +0x1e0 ActiveTimerListLock : 0
   +0x1e4 ActiveTimerListHead : _LIST_ENTRY [ 0x8164e754 - 0x8164e754 ]
    单篇博客显示不下,评论继续

抱歉!评论已关闭.