python进程提权与检测进程调用所有模块

前段时间闲着没事,做查进程的,ring0层面的方法太多代码也太多,头脑发热写了个python的扫进程,调用的主要是win32api。

木有这个库的可以去网上下下来装一装,挺强大。

主要用了:

ctypes.windll.kernel32.CreateToolhelp32Snapshot

ctypes.windll.kernel32.Process32First

ctypes.windll.kernel32.Process32Next

win32api.OpenProcess

win32process.EnumProcessModules

不知道的可以查一查。

但是光是这些是不够的,直接扫进程的话会因为权限不够导致很多进程访问不能,不能利用win32process.EnumProcessModules扫描进程调用的所有模块。所以要对进程本身进行提权,赋予进程本身访问其他进程的权限。

请大家看一看没有提权的枚举进程调用模块的情况:

python进程提权与检测进程调用所有模块_第1张图片

可以看到虽然能枚举到进程但是无法枚举进程调用的模块。


这个请参考:http://blog.sina.com.cn/s/blog_77fbf10501017hoe.html

利用

OpenProcessToken

赋予进程扫其他进程的令牌权限。


问题又来了,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;  
}  

不想自己编译的朋友我把这个dll给你,里面就一个
enableDebugPriv()
看最后的附件吧。


提权完成后,再调用枚举模块的函数,然后就可以了:

提权那块的用法:

    #调用procup.dll的enableDebugPriv函数对本进程提权
    procupdll=ctypes.cdll.LoadLibrary("procup.dll")
    if procupdll.enableDebugPriv()==0:
        print "提权失败"


部分结果:

0号和4号进程还是can't read

先是进程名,后面是存有地址和调用模块的list:

python进程提权与检测进程调用所有模块_第2张图片


全部代码:

#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)

py文件和dll——迅雷快传

我可能忘续期,留言提醒我。


你可能感兴趣的:(编程)