前段时间闲着没事,做查进程的,ring0层面的方法太多代码也太多,头脑发热写了个python的扫进程,调用的主要是win32api。
木有这个库的可以去网上下下来装一装,挺强大。
主要用了:
ctypes.windll.kernel32.CreateToolhelp32Snapshot
ctypes.windll.kernel32.Process32First
ctypes.windll.kernel32.Process32Next
win32api.OpenProcess
win32process.EnumProcessModules
不知道的可以查一查。
但是光是这些是不够的,直接扫进程的话会因为权限不够导致很多进程访问不能,不能利用win32process.EnumProcessModules扫描进程调用的所有模块。所以要对进程本身进行提权,赋予进程本身访问其他进程的权限。
请大家看一看没有提权的枚举进程调用模块的情况:
可以看到虽然能枚举到进程但是无法枚举进程调用的模块。
这个请参考:http://blog.sina.com.cn/s/blog_77fbf10501017hoe.html
利用
赋予进程扫其他进程的令牌权限。
问题又来了,python貌似掉不到这个函数。或者能够调用但是我不会到方法。
所以我用c写了个dll,然后用python来调用这个函数:
procup.h:
extern "C" _declspec(dllexport) bool enableDebugPriv();
procup.cpp:
#include "procup.h"
#include
extern "C" _declspec(dllexport)bool enableDebugPriv()
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
return false;
}
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue)) {
CloseHandle(hToken);
return false;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL)) {
CloseHandle(hToken);
return false;
}
return true;
}
enableDebugPriv()
看最后的附件吧。
提权完成后,再调用枚举模块的函数,然后就可以了:
提权那块的用法:
#调用procup.dll的enableDebugPriv函数对本进程提权
procupdll=ctypes.cdll.LoadLibrary("procup.dll")
if procupdll.enableDebugPriv()==0:
print "提权失败"
部分结果:
0号和4号进程还是can't read
先是进程名,后面是存有地址和调用模块的list:
全部代码:
#coding:utf-8
import win32process
import win32api
import win32con
import ctypes
import os, sys, string
TH32CS_SNAPPROCESS = 0x00000002
class PROCESSENTRY32(ctypes.Structure):
_fields_ = [("dwSize", ctypes.c_ulong),
("cntUsage", ctypes.c_ulong),
("th32ProcessID", ctypes.c_ulong),
("th32DefaultHeapID", ctypes.c_ulong),
("th32ModuleID", ctypes.c_ulong),
("cntThreads", ctypes.c_ulong),
("th32ParentProcessID", ctypes.c_ulong),
("pcPriClassBase", ctypes.c_ulong),
("dwFlags", ctypes.c_ulong),
("szExeFile", ctypes.c_char * 260)]
def getProcList():
CreateToolhelp32Snapshot = ctypes.windll.kernel32.CreateToolhelp32Snapshot
Process32First = ctypes.windll.kernel32.Process32First
Process32Next = ctypes.windll.kernel32.Process32Next
CloseHandle = ctypes.windll.kernel32.CloseHandle
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
pe32 = PROCESSENTRY32()
pe32.dwSize = ctypes.sizeof(PROCESSENTRY32)
if Process32First(hProcessSnap,ctypes.byref(pe32)) == False:
return
while True:
yield pe32
if Process32Next(hProcessSnap,ctypes.byref(pe32)) == False:
break
CloseHandle(hProcessSnap)
def GetProcessModules( pid ):
handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, False, pid )
hModule = win32process.EnumProcessModules(handle)
temp=[]
for i in hModule:
temp.append([hex(i),debugfile(win32process.GetModuleFileNameEx(handle,i))])
win32api.CloseHandle(handle)
return temp
def CloseProcess( pid ):
handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, False, pid )
exitcode = win32process.GetExitCodeProcess( handle )
win32api.TerminateProcess(handle, exitcode)
win32api.CloseHandle(handle)
def debugfile(file):
if (file.split("\\")[-1]=="smss.exe"):
file = "C:\\WINDOWS\\system32\\smss.exe"
return file
elif (file.split("\\")[-1]=="csrss.exe"):
file = "C:\\WINDOWS\\system32\\csrss.exe"
return file
elif (file.split("\\")[-1]=="winlogon.exe"):
file = "C:\\WINDOWS\\system32\\winlogon.exe"
return file
else:
return file
if __name__ =='__main__':
#调用procup.dll的enableDebugPriv函数对本进程提权
procupdll=ctypes.cdll.LoadLibrary("procup.dll")
if procupdll.enableDebugPriv()==0:
print "提权失败"
count = 0
procList = getProcList()
for proc in procList:
count+=1
print("name=%s\tfather=%d\tid=%d" % (proc.szExeFile, proc.th32ParentProcessID, proc.th32ProcessID))
try:
TempGet=GetProcessModules(proc.th32ProcessID)
except Exception, e:
print "pid:%d can't read"%(proc.th32ProcessID)
continue
#TempGet[0][1].split("\\")[-1] 路径的最后一部分
#'''
#枚举进程调用所有模块
for tempnum in range(0,len(TempGet)):
try:
print TempGet
except Exception,e:
print e
#'''
print "进程数:%d"%(count)
我可能忘续期,留言提醒我。