有效跟踪Windows进程(加载和卸载)

时间:2018-05-23 20:14:19

标签: python windows python-3.x performance process

我正在努力找到一种方法来动态跟踪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。

CPU and memory usage(图片)

我已经尝试过管道到cmd任务列表并解析输出但是没有更好。

我不知道是否有办法让Windows在加载新进程时通知程序,或者我是否需要求助于驱动程序。

为了给出一些上下文,这个解决方案将成为程序的一部分,该程序将在加载恶意软件时扫描进程,并且将在没有太多处理能力或可用内存的旧系统上运行。

0 个答案:

没有答案