我正在努力找到一种方法来动态跟踪Windows进程,因为它们使用尽可能少的CPU来生成(加载)和死(卸载)。
我当前的解决方案使用K32EnumProcesses
来获取所有正在运行的pid(Process Ids)和基本的set操作来推断死亡和生成的pid。
class Procs:
def __init__(self):
pass
def get_all_processes(self):
pProcessIds = (c_ulong * 4096)()
pBytesReturned = c_ulong()
hModule = c_ulong()
count = c_ulong()
kernel32.K32EnumProcesses(byref(pProcessIds), sizeof(pProcessIds), byref(pBytesReturned))
nReturned = pBytesReturned.value/sizeof(c_ulong())
for pid in [i for i in pProcessIds][:int(nReturned)]:
yield int(pid)
def find_dead(self, prev_pids, curr_pids):
return prev_pids - curr_pids
def find_live(self, prev_pids, curr_pids):
return curr_pids - prev_pids
if __name__ == '__main__':
proc_obj = Procs()
prev_procs = set()
while True:
curr_procs = set(proc_obj.get_all_processes())
dead = proc_obj.find_dead(prev_procs, curr_procs)
live = proc_obj.find_live(prev_procs, curr_procs)
[print(f'died: {d}') for d in dead]
[print(f'live: {l}') for l in live]
dead = None
live = None
prev_procs = curr_procs
此解决方案的问题在于它占用了大约50%的CPU。
我已经尝试过管道到cmd任务列表并解析输出但是没有更好。
我不知道是否有办法让Windows在加载新进程时通知程序,或者我是否需要求助于驱动程序。
为了给出一些上下文,这个解决方案将成为程序的一部分,该程序将在加载恶意软件时扫描进程,并且将在没有太多处理能力或可用内存的旧系统上运行。