插件式子域名收集工具开发所遇到的问题


1.动态加载插件

本来是打算采用

__import__()

这种方式的,后来发现调用不成功,因为没办法进行字符串拼接

代码如下:

    for i in os.listdir('./plugin'):
        if 'plugin' in i:
            plugin_name = i.split('.py')[0]
            ex = __import__('plugin.{plugin_name}'.format(plugin_name=plugin_name))
            print(dir(ex))

输出

['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'bin_plugin']
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'bin_plugin', 'google_plugin']
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'bin_plugin', 'google_plugin', 'virustotal_plugin']

也就是说我需要这样去调用:

ex.模块.函数()

但是模块是不可控的,所以需要使用变量:

ex.plugin_name.print_()

但是python不像PHP那样可以解析变量。所以报错了:

File "C:/Users/google888/PycharmProjects/untitled/main.py", line 38, in <module>
    ex.plugin_name.print_()
AttributeError: module 'plugin' has no attribute 'plugin_name'

所以我使用了:exec这样的方式来进行包含和调用:

for i in os.listdir('./plugin'):
    if 'plugin' in i:
        plugin_name = i.split('.py')[0]
        plugin_list.add(plugin_name)
        import_str = 'import plugin.{name}'.format(name=plugin_name)
        exec(import_str)

调用:

for name in plugin_list:
    call_str = 'plugin.{name}.print_author()'.format(name=name)
    sys.stdout.write('Load:')
    exec(call_str)

2.判断线程是否执行完成:

threading模块中有一个方法为:active_count 这个方法返回了当前执行的线程数.

for i in range(10):
    threading.Thread(target=time.sleep,args=(int('10'),)).start()
print('当前执行线程共:'+str(threading.active_count()))

输出:

当前执行线程共:11

所以我在线程执行后,直接进行while循环来判断线程是否只有主线程一个:

while threading.active_count() != 1:
    pass
print("执行完毕")

3.保存文件:

考虑到所有的domain基本上都在模块下面的domain_list变量中,所以需要在这个变量里面取,但是之前说了模块名是我自己不可控的,需要动态获取。所有还是需要使用exec:

for name in plugin_list:
    value_str = 'value = plugin.{name}.domain_list'.format(name=name, filename=domain + '.txt')
    with open('baidu.com','a+') as w:
        for i in value_str:
            w.write(i)
    exec(value_str)

结果说明我还是太天真,exec和主程序变量作用域不一样!!!,所以想到了列表推导式:

for name in plugin_list:
    value_str = '[open("{filename}","a+").write(str(i)+"\\n") for i in set([a for a in plugin.{name}.domain_list])]'.format(name=name,filename=domain+'.txt')
    exec(value_str)

缺点就是没有关闭文件流导致过于占用内存。

github:

https://github.com/XiaoTouMingyo/subdomain_Ex

声明:小透明 | 渗透测试,代码审计,Web安全|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 插件式子域名收集工具开发所遇到的问题


emmmmmmmmmmm............