python一个批量载入插件的类
发布于 6 个月前 阅读权限 无需登录 作者 ver007 1990 次浏览 来自 开源项目

Python

图片.png

代码

#main.py
from load import LoadPlugin
def main():
	"""
	主启动函数
	:return:
	"""
	loadObj = LoadPlugin("plugin")
	plugins = loadObj.search()
	for plugin in plugins:
		Exploit = plugin.Exploit("New Obj scanPort Class")
		Exploit.run("Run Scan Work")
if __name__ == '__main__':
	main()
	
	
 # load.py
 class LoadPlugin:
	def __init__(self, path="."):
		"""
		插件获取类
		:param path: 插件目录
		"""
		self.models = []
		self.path = path
	def search(self):
		"""
		搜索插件并载入
		:return list: 插件列表
		"""
		for dir_str in os.listdir(self.path):
			if dir_str not in ['.', '__init__.py'] and not dir_str.endswith('.pyc'):
				try:
					plugin = __import__("plugin." + dir_str.replace('.py', ''), fromlist=[dir_str])
					self.models.append(plugin)
				except ImportError, e:
					continue
		if self.models:
			return self.models
		else:
			return []
			
# scanPort.py
class Exploit(object):
	"""
	端口扫描类
	"""
	def __init__(self, args):
		print args
	def run(self, target):
		print target

目录结构如下 ├── plugin # 插件目录 各种扫描模块 ├ └── __init__.py ├ └── scanPort.py └── load.py └── main.py

返回的是一个List ,里面是所有plugin目录的插件

load = LoadPlugin("目录所在目录")
plugins = load.search()

剩下的循环取出来执行就可以了

9 回复

楼主配上一些图就好了,图文并茂更好理解些,原谅我这么笨!

tangscan插件我之前是把插件名字存在db里面,然后使用的时候从db里面读取。上面提到这种方式灵活啊。

发一个可以让模块以字符串的形式导入:

def new_import(name, code_path): module_code = “” with open(code_path, ‘rb’) as f: module_code = f.read() if not module_code: return None module = imp.new_module(name) exec module_code in module.dict return module

可以看下pluginbase 这个包, 或者 用importlib 中import_module

批量载入在调用POC插件时用的到,收藏。

学习了学习了,我本来也是将名字都存在db里,感觉四楼提到的pluginbase特挺不错的

本来我是把插件以subprocess的形式来运行的.发现这个方式很不错。

我7哥威武,话说以前还自己造轮子查了半天资料,做出来跟这个类似。

@axe …我一直这样调的

回到顶部