首先先介绍下windows 系统的令牌。
windows系统的令牌是指:"一个包含进程或者线程上下文环境的对象"。简单的说就是记录着一个进程被赋予的权限。
这里就有一个问题,windows开发者出于好意,会给一个安全产品内嵌一个系统托盘的程序,并且将seLoadDriver权限赋予了系统托盘程序。而这会让没有相应权限的用户,控制以驱动形式存在的windows系统服务。(方法是通过向系统托盘程序中插入代码)。
所有首先第一步,查询token中的权限,看看哪些进程含有seLoadDriver权限。
1.获取目标进程句柄
2.获取目标进程token
3.解析已经启用权限列表
4.迭代每个权限,并检查是否启用(i[1]==3表示启用,i[0]存储着相印的名字)
代码如下(基于之前编辑的进程监视器):
import os import wmi import win32api import win32con import win32security def get_privileges(pid): try: hd = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION,False,pid) htok = win32security.OpenProcessToken(hd,win32con.TOKEN_QUERY) privs = win32security.GetTokenInformation(htok,win32security.TokenPrivileges) priv_list="" for i in privs: if i[1]==3: priv_list+="%s|"%win32security.LookupPrivilegeName(None,i[0]) except: priv_list="N/A" return priv_list def log_message(message): f=open("message.csv","ab") f.write("%s\r\n"%message) f.close() log_message("Time,User,Executable,CommandLine,PID,Parent PID,Privileges") c=wmi.WMI() process_monitor=c.Win32_Process.watch_for("creation") while True: try: new_process=process_monitor() proc_owner=new_process.GetOwner() proc_owner="%s\\%s"%(proc_owner[0],proc_owner[2]) create_data=new_process.CreationDate executable=new_process.ExecutablePath cmdline = new_process.CommandLine pid = new_process.ProcessId parent_pid = new_process.ParentProcessId privileges = get_privileges(pid) process_log_message="%s,%s,%s,%s,%s,%s,%s\r\n"%(create_data,proc_owner,executable,cmdline,pid,parent_pid,privileges) print process_log_message log_message(process_log_message) except: pass