Python检测PE所启用保护方式详解
作者:lyshark 时间:2022-03-11 12:36:08
Python 通过pywin32模块调用WindowsAPI接口,实现对特定进程加载模块的枚举输出并检测该PE程序模块所启用的保护方式,此处枚举输出的是当前正在运行进程所加载模块的DLL模块信息,需要用户传入进程PID才可实现输出。
首先需要安装两个依赖包:
pip install pywin32
pip install pefile
然后再命令行模式下执行命令启动枚举功能。
# By: LyShark
import win32process
import win32api,win32con,win32gui
import os,pefile,argparse
def Banner():
print(" _ ____ _ _ ")
print(" | | _ _/ ___|| |__ __ _ _ __| | __")
print(" | | | | | \___ \| '_ \ / _` | '__| |/ /")
print(" | |__| |_| |___) | | | | (_| | | | < ")
print(" |_____\__, |____/|_| |_|\__,_|_| |_|\_\\")
print(" |___/ \n")
print("E-Mail: me@lyshark.com")
def GetProcessModules(pid):
ModuleList = []
handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, False, pid )
hModule = win32process.EnumProcessModules(handle)
for item in hModule:
Module_Addr = hex(item)
Module_Path = win32process.GetModuleFileNameEx(handle,item)
Module_Name = os.path.basename(str(Module_Path))
ModuleList.append([Module_Addr,Module_Name,Module_Path])
win32api.CloseHandle(handle)
return ModuleList
def CheckModulesProtect(ClassName):
UNProtoModule = []
if type(ClassName) is str:
handle = win32gui.FindWindow(0,ClassName)
threadpid, procpid = win32process.GetWindowThreadProcessId(handle)
ProcessModule = GetProcessModules(int(procpid))
else:
ProcessModule = GetProcessModules(int(ClassName))
print("-" * 100)
print("映像基址\t\t模块名称\t基址随机化\tDEP保护兼容\t强制完整性\tSEH异常保护")
# By: LyShark.com
print("-" * 100)
for item in ProcessModule:
pe = pefile.PE(item[2])
DllFlage = pe.OPTIONAL_HEADER.DllCharacteristics
print("%10s"%(item[0]),end="\t")
print("%21s"%(item[1]),end="\t")
# 随机基址 => hex(pe.OPTIONAL_HEADER.DllCharacteristics) & 0x40 == 0x40
if( (DllFlage & 64)==64 ):
print(" True",end="\t\t")
else:
print(" False",end="\t\t")
UNProtoModule.append(item[2])
if( (DllFlage & 256)==256 ):
print("True",end="\t\t")
else:
print("False",end="\t\t")
if ( (DllFlage & 128)==128 ):
print("True",end="\t\t")
else:
print("False",end="\t\t")
if ( (DllFlage & 1024)==1024 ):
print("False",end="\t\t\n")
else:
print("True",end="\t\t\n")
print("-" * 100)
print("\n[+] 总模块数: {} 可利用模块: {}".format(len(ProcessModule),len(UNProtoModule)),end="\n\n")
for item in UNProtoModule:
print("[-] {}".format(item))
print("-" * 100)
if __name__ == "__main__":
Banner()
parser = argparse.ArgumentParser()
parser.add_argument("-H","--handle",dest="handle",help="指定一个正在运行的进程Handle")
parser.add_argument("-P","--pid",dest="pid",help="指定一个正在运行的进程PID")
args = parser.parse_args()
if args.handle or args.pid:
if args.handle:
CheckModulesProtect(str(args.handle))
elif args.pid:
CheckModulesProtect(int(args.pid))
else:
parser.print_help()
输出枚举效果如下:
来源:https://www.cnblogs.com/LyShark/p/16125498.html
标签:Python,检测,PE,保护方式
0
投稿
猜你喜欢
一篇文章带你轻松了解MySQL之事务的简介
2024-01-20 15:57:33
python 绘制国旗的示例
2023-01-05 19:29:32
python编译pyc文件的过程解析
2022-08-13 20:48:19
Extjs显示从数据库取出时间转换JSON后的出现问题
2024-01-18 12:52:13
WinHttp.WinHttpRequest--XmlHttp获取跳转页面的功能
2010-03-22 14:34:00
Runnable.com 在线测试代码片分享网站
2023-02-04 09:25:54
在CentOS上MySQL数据库服务器配置方法
2024-01-19 07:01:21
Python快速生成随机密码超简单实现
2022-08-07 19:26:09
YOLOV5代码详解之损失函数的计算
2022-06-09 02:01:58
Python编程实现双链表,栈,队列及二叉树的方法示例
2021-11-10 12:35:17
使用:after清除浮动
2008-10-30 12:10:00
python中添加模块导入路径的方法
2021-12-17 14:35:30
对Golang import 导入包语法详解
2024-02-20 19:10:28
pycharm无法安装cv2模块问题及解决方案
2023-02-14 21:20:49
磁盘缓存专题之一 缓存命中和缓存未命中&缓存与缓冲间的差异
2012-10-07 11:02:46
ASP中生成文件的两种方式
2007-08-30 09:49:00
使用带批注的 XDR 架构创建 XML 视图
2008-09-04 14:24:00
golang redigo发布订阅使用的方法
2024-04-29 13:05:23
python assert断言的实例用法
2023-06-24 22:15:42
Python类和实例的属性机制原理详解
2022-12-12 19:47:27