进程Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
PspCreateProcessÞ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
这个进程创建和初始化一个进程对象Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
如何获取当前线程?Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
TEB(线程环境块)位于用户模式下的一个线程信息结构Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
如下:Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
1 Id: 84.fb4 Suspend: 1 Teb: 7ffdd000 UnfrozenÞ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
打开一个记事本Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
用windbg 附上,查看所有线程,可以发现Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
0 Id: 84.b28 Suspend: 1 Teb: 7ffde000 UnfrozenÞ¿½|1club.cqvip.comBâeª_ã
.
ChildEBP RetAddr Args to Child Þ¿½|1club.cqvip.comBâeª_ã
.
0007feb8 77d191be 77d191f1 0007fefc 00000000 ntdll!KiFastSystemCallRetÞ¿½|1club.cqvip.comBâeª_ã
.
0007fed8 01002a1b 0007fefc 00000000 00000000 USER32!NtUserGetMessage+0xcÞ¿½|1club.cqvip.comBâeª_ã
.
0007ff1c 01007511 01000000 00000000 000aefc1 notepad!WinMain+0xe5Þ¿½|1club.cqvip.comBâeª_ã
.
0007ffc0 7c817077 00091378 7c93005d 7ffdf000 notepad!WinMainCRTStartup+0x174Þ¿½|1club.cqvip.comBâeª_ã
.
WARNING: Stack unwind information not available. Following frames may be wrong.Þ¿½|1club.cqvip.comBâeª_ã
.
0007fff0 00000000 0100739d 00000000 78746341 kernel32!RegisterWaitForInputIdle+0x49Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
1 Id: 84.fb4 Suspend: 1 Teb: 7ffdd000 UnfrozenÞ¿½|1club.cqvip.comBâeª_ã
.
ChildEBP RetAddr Args to Child Þ¿½|1club.cqvip.comBâeª_ã
.
025efea4 7c92df4a 7c809590 00000002 025efed0 ntdll!KiFastSystemCallRetÞ¿½|1club.cqvip.comBâeª_ã
.
025efea8 7c809590 00000002 025efed0 00000001 ntdll!ZwWaitForMultiple***s+0xcÞ¿½|1club.cqvip.comBâeª_ã
.
WARNING: Stack unwind information not available. Following frames may be wrong.Þ¿½|1club.cqvip.comBâeª_ã
.
025eff44 77dc8631 00000002 025eff6c 00000000 kernel32!CreateFileMappingA+0x86Þ¿½|1club.cqvip.comBâeª_ã
.
025effb4 7c80b729 00000000 7c8109cb 77dc8bc1 ADVAPI32!WmiFreeBuffer+0x24eÞ¿½|1club.cqvip.comBâeª_ã
.
025effec 00000000 77dc848a 00000000 00000000 kernel32!GetModuleFileNameA+0x1baÞ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
2 Id: 84.8a0 Suspend: 1 Teb: 7ffdc000 UnfrozenÞ¿½|1club.cqvip.comBâeª_ã
.
ChildEBP RetAddr Args to Child Þ¿½|1club.cqvip.comBâeª_ã
.
04e8fc9c 7c92d21a 7c8023f1 00000000 04e8fcd0 ntdll!KiFastSystemCallRetÞ¿½|1club.cqvip.comBâeª_ã
.
04e8fca0 7c8023f1 00000000 04e8fcd0 7c986cf9 ntdll!NtDelayExecution+0xcÞ¿½|1club.cqvip.comBâeª_ã
.
WARNING: Stack unwind information not available. Following frames may be wrong.Þ¿½|1club.cqvip.comBâeª_ã
.
04e8fcf8 7c802455 00002af8 00000000 04e8ff78 kernel32!SleepEx+0x51Þ¿½|1club.cqvip.comBâeª_ã
.
04e8fd08 02f3711f 00002af8 c1f6c47a 00000006 kernel32!Sleep+0xfÞ¿½|1club.cqvip.comBâeª_ã
.
04e8ff78 02ffdd27 00000000 c1f6c6d2 7c986cf9 SOGOUPY!ImeDestroy+0x435afÞ¿½|1club.cqvip.comBâeª_ã
.
04e8ffb0 02ffddc0 7c80b729 03338de8 7c986cf9 SOGOUPY!ImeDestroy+0x10a1b7Þ¿½|1club.cqvip.comBâeª_ã
.
04e8ffec 00000000 02ffdd4d 03338de8 00000000 SOGOUPY!ImeDestroy+0x10a250Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
# 3 Id: 84.aa4 Suspend: 1 Teb: 7ffdb000 UnfrozenÞ¿½|1club.cqvip.comBâeª_ã
.
ChildEBP RetAddr Args to Child Þ¿½|1club.cqvip.comBâeª_ã
.
05baffc8 7c971e90 00000005 00000004 00000001 ntdll!DbgBreakPointÞ¿½|1club.cqvip.comBâeª_ã
.
05bafff4 00000000 00000000 00000008 000060c0 ntdll!DbgUiRemoteBreakin+0x2dÞ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
每个线程的FS:[18] 就是本线程的TIB结构Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
我们可以通过如下来获取线程的IDÞ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
mov eax, fs:[18h] ;因为 18h 偏移处是 TIB 结构的线性偏移地址Þ¿½|1club.cqvip.comBâeª_ã
.
mov eax, [eax + 24h] ;因为 24h 偏移处是 threadID 的地址Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
可以通过下面的方式来获取对应的进程的ID Þ¿½|1club.cqvip.comBâeª_ã
.
mov eax, fs:[18h] ;因为 18h 偏移处是 TIB 结构的线性偏移地址Þ¿½|1club.cqvip.comBâeª_ã
.
mov eax, [eax + 20h] ;因为 24h 偏移处是 threadID 的地址Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
在内核条件下FS指向的是KPCRÞ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
CurrentThread = PsGetCurrentThread 「」;Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
PreviousMode = KeGetPreviousModeByThread「&CurrentThread->Tcb」;Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
CurrentProcess = PsGetCurrentProcessByThread 「CurrentThread」;Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
以上操作获取当前线程的ETHREAD ,当前线程的模式 当前线程对应进程的KPROCESSÞ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
这些东西之间的联系时什么呢?Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
ETHREAD 是一个非常庞大的结构体Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
他的第一个成员就是KTHREAD,也就是TCB,线程控制块Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
TCB 中有一个成员就是previous mode ,就是当前模式。Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
也就是说,我们要想获取当前线程的模式只要在TCB中取就可以了Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
那么如何根据ETHREAD 来获取RPROCESS 结构呢?Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
注意在TCB 的apcstate 成员中有个指针指向了KPROCESS,这样就将线程和进程连接起来了Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
if 「ARGUMENT_PRESENT 「ParentProcess」」 {Þ¿½|1club.cqvip.comBâeª_ã
.
Status = ObReference***ByHandle 「ParentProcess,Þ¿½|1club.cqvip.comBâeª_ã
.
PROCESS_CREATE_PROCESS,Þ¿½|1club.cqvip.comBâeª_ã
.
PsProcessType,Þ¿½|1club.cqvip.comBâeª_ã
.
PreviousMode,Þ¿½|1club.cqvip.comBâeª_ã
.
&Parent,Þ¿½|1club.cqvip.comBâeª_ã
.
NULL」;Þ¿½|1club.cqvip.comBâeª_ã
.
if 「!NT_SUCCESS 「Status」」 {Þ¿½|1club.cqvip.comBâeª_ã
.
return Status;Þ¿½|1club.cqvip.comBâeª_ã
.
}Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
如果父进程存在 Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
就在内核对象句柄表中通过父进程的句柄来把父进程的EPROCESS结构找出来Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.
Þ¿½|1club.cqvip.comBâeª_ã
.