在现代操作系统中,了解和监控系统中的进程和线程是非常重要的。本文将介绍一个名为EzProcess的工具,它能够展示所有正在运行的进程信息,包括进程名称、进程ID、父进程ID和优先级。此外,它还能显示选定进程的所有线程(包括其基础优先级)以及加载的模块(DLLs)。
EzProcess基于七个API函数构建,分别是:
首先,通过调用CreateToolhelp32Snapshot API函数并使用TH32CS_SNAPPROCESS或TH32CS_SNAPTHREAD标志来创建快照。然后,通过调用Process32First API函数获取系统快照中遇到的第一个进程的信息。最后,通过反复调用Process32Next API函数,可以获取快照中记录的所有进程的信息。代码如下:
ASM
Invoke CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS OR TH32CS_SNAPTHREAD, NULL
MOV hSnapShot, EAX
; Get first process
MOV ProcEntry32.dwSize, SizeOf PROCESSENTRY32
Invoke Process32First, hSnapShot, ADDR ProcEntry32
@@:
.If EAX
; Display Process Information
; Get Next process
Invoke Process32Next, hSnapShot, ADDR ProcEntry32
JMP @B
.EndIf
通过调用Thread32First API函数获取快照中遇到的任何进程的第一个线程的信息。如果线程的创建者进程ID(ThreadEntry32.th32OwnerProcessID)与选定进程的ID相同,则显示该线程。通过反复调用Thread32Next并比较ID,可以获取选定进程的所有线程的信息。代码如下:
ASM
; Get first thread
MOV ThreadEntry32.dwSize, SizeOf THREADENTRY32
Invoke Thread32First, hSnapShot, ADDR ThreadEntry32
@@:
.If EAX
.If ThreadEntry32.th32OwnerProcessID == EDI
; Display Thread Information
; Get Next Thread
Invoke Thread32Next, hSnapShot, ADDR ThreadEntry32
JMP @B
.EndIf
.EndIf
为了获取与选定进程关联的模块,需要创建一个新的快照,该快照包括指定进程的模块列表。使用新创建的快照,通过使用API函数Module32First和Module32Next迭代所有与指定进程关联的模块。代码如下:
ASM
; Let's create a new snapshot that includes the module list of the specified process
Invoke CreateToolhelp32Snapshot, TH32CS_SNAPMODULE, EDI
MOV EBX, EAX
; Get first Module
MOV ModuleEntry32.dwSize, SizeOf MODULEENTRY32
Invoke Module32First, EBX, ADDR ModuleEntry32
@@:
.If EAX
; Display Module Information
; Get Next Module
Invoke Module32Next, EBX, ADDR ModuleEntry32
JMP @B
.EndIf
Invoke CloseHandle, EBX
此外,EzProcess进程/线程管理器还能够终止选定的进程。这是通过以下方式完成的:
ASM
Invoke OpenProcess, PROCESS_TERMINATE, FALSE, lvi.lParam
; where lvi.lParam is the process ID
.If EAX
MOV EBX, EAX
; hProcess
Invoke TerminateProcess, EBX, 0
.If !EAX
Invoke ErrorMessage
.EndIf
Invoke CloseHandle, EBX
; hProcess
.Else
Invoke ErrorMessage
.EndIf