传送门

本系列原创博文传送门:

用Python做一个安全攻防工具:端口嗅探器(1)

用Python做一个安全攻防工具:端口嗅探器(2)

用Python做一个安全攻防工具:端口嗅探器(3)

用Python做一个安全攻防工具:端口嗅探器(4)

用Python做一个安全攻防工具:端口嗅探器(5)

用Python做一个安全攻防工具:端口嗅探器(6)

用Python做一个安全攻防工具:端口嗅探器(7)

用Python做一个安全攻防工具:端口嗅探器(8)

用Python做一个安全攻防工具:端口嗅探器(9)

本章目标

本章目标是将工具打包成可执行文件。

暂时选择py2exe模块。

步骤实施

找了一篇示范性的文章,《使用 py2exe 打包 Python 程序》。

第一步是安装py2exe模块:

pip install py2exe --user

这里需要加上 “--user” ,否则会出现权限问题。

第二步,在文件夹下,新建python文件 setup.py :

from distutils.core import setupsetup(console=["PortSearchGUI.py"])  # 入口文件

第三步,将命令行切换到python文件目录下:

C:\Users\admin\PycharmProjects\PortSearch>python setup.py py2exe

出现报错:

error: invalid command 'py2exe'

修改代码:

from distutils.core import setup
import py2exesetup(console=["PortSearchGUI.py"])  # 入口文件

第二行的代码 “import py2exe”,一开始提示没有被调用,实际上在命令行运行时,会使用到,加上之后,前面的报错没有了。

出现了新的报错:

running py2exe9 missing Modules------------------
? AppKit                              imported from pyperclip
? Foundation                          imported from pyperclip
? PyQt4                               imported from pyperclip
? _posixshmem                         imported from multiprocessing.resource_tracker, multiprocessing.shared_memory
? _testinternalcapi                   imported from test.support
? gtk                                 imported from pyperclip
? qtpy                                imported from pyperclip
? readline                            imported from cmd, code, pdb
? resource                            imported from test.support
Building 'dist\PortSearchGUI.exe'.
error: [Errno 2] No such file or directory: 'C:\\Users\\admin\\AppData\\Roaming\\Python\\Python39\\site-packages\\py2exe\\run-py3.9-win-amd64.exe'

先找找缺少 run-py3.9-win-amd64.exe 的原因,据说py2exe只支持 python 3.4及以下。

查了下,有人建议先从缺失的模块开始入手,这些missing Modules理论上讲在代码里是不会调到的,试着修改代码试试:

from distutils.core import setup
import py2exesetup(console=["PortSearchGUI.py"],  # 入口文件options={'py2exe': {'excludes': ['AppKit', 'Foundation', 'PyQt4', '_posixshmem', '_testinternalcapi', 'gtk','qtpy', 'readline', 'resource']}},)  # 入口文件

再次运行下看看,报错,提示少了,只剩下一个问题:

running py2exe
Building 'dist\PortSearchGUI.exe'.
error: [Errno 2] No such file or directory: 'C:\\Users\\admin\\AppData\\Roaming\\Python\\Python39\\site-packages\\py2exe\\run-py3.9-win-amd64.exe'

到 C:\Users\admin\AppData\Roaming\Python\Python39\site-packages\py2exe 目录下看一看,发现有个

run_w-py3.9-win-amd64.exe 文件:

复制一个文件出来,将其命名为: run-py3.9-win-amd64.exe

再次运行:

C:\Users\admin\PycharmProjects\PortSearch>python setup.py py2exe

运行成功:

running py2exe
Building 'dist\PortSearchGUI.exe'.
Building shared code archive 'dist\library.zip'.
Copy c:\python39\python39.dll to dist
Copy C:\Python39\DLLs\unicodedata.pyd to dist\unicodedata.pyd
Copy C:\Python39\DLLs\select.pyd to dist\select.pyd
Copy C:\Python39\DLLs\_bz2.pyd to dist\_bz2.pyd
Copy C:\Python39\DLLs\_lzma.pyd to dist\_lzma.pyd
Copy C:\Python39\DLLs\pyexpat.pyd to dist\pyexpat.pyd
Copy C:\Python39\DLLs\_socket.pyd to dist\_socket.pyd
Copy C:\Python39\DLLs\_hashlib.pyd to dist\_hashlib.pyd
Copy C:\Python39\DLLs\_decimal.pyd to dist\_decimal.pyd
Copy C:\Python39\DLLs\_ssl.pyd to dist\_ssl.pyd
Copy C:\Python39\DLLs\_queue.pyd to dist\_queue.pyd
Copy C:\Python39\DLLs\_elementtree.pyd to dist\_elementtree.pyd
Copy C:\Python39\DLLs\_ctypes.pyd to dist\_ctypes.pyd
Copy C:\Python39\DLLs\_tkinter.pyd to dist\_tkinter.pyd
Copy C:\Python39\DLLs\_testcapi.pyd to dist\_testcapi.pyd
Copy C:\Python39\DLLs\_asyncio.pyd to dist\_asyncio.pyd
Copy C:\Python39\DLLs\_multiprocessing.pyd to dist\_multiprocessing.pyd
Copy C:\Python39\DLLs\_overlapped.pyd to dist\_overlapped.pyd
Copy C:\Python39\lib\site-packages\shiboken2\shiboken2.pyd to dist\shiboken2.shiboken2.pyd
Copy C:\Python39\lib\site-packages\PySide2\QtNetwork.pyd to dist\PySide2.QtNetwork.pyd
Copy C:\Python39\lib\site-packages\PySide2\QtWidgets.pyd to dist\PySide2.QtWidgets.pyd
Copy C:\Python39\lib\site-packages\PySide2\QtCore.pyd to dist\PySide2.QtCore.pyd
Copy C:\Users\admin\AppData\Roaming\Python\Python39\site-packages\PyQt5\QtWidgets.pyd to dist\PyQt5.QtWidgets.pyd
Copy DLL C:\Python39\lib\site-packages\PySide2\Qt5Qml.dll to dist\
Copy DLL C:\Python39\DLLs\tcl86t.dll to dist\
Copy DLL C:\Python39\DLLs\libssl-1_1.dll to dist\
Copy DLL C:\Python39\DLLs\libcrypto-1_1.dll to dist\
Copy DLL C:\Python39\lib\site-packages\PySide2\Qt5Core.dll to dist\
Copy DLL C:\Python39\lib\site-packages\PySide2\pyside2.abi3.dll to dist\
Copy DLL C:\Python39\DLLs\tk86t.dll to dist\
Copy DLL C:\Python39\lib\site-packages\PySide2\Qt5Widgets.dll to dist\
Copy DLL C:\Python39\lib\site-packages\PySide2\Qt5Gui.dll to dist\
Copy DLL C:\Python39\DLLs\libffi-7.dll to dist\
Copy DLL C:\Python39\lib\site-packages\PySide2\Qt5Network.dll to dist\
Copy DLL C:\Python39\lib\site-packages\shiboken2\shiboken2.abi3.dll to dist\
Copy ExtensionDLL C:\Python39\python3.dll to dist\

在项目目录下看到新增一个文件夹:

找到入口文件 PortSearchGUI.exe

到项目目录下看一下,双击运行入口文件,出现报错:

打开log文件,发现报错:

Traceback (most recent call last):File "PortSearchGUI.py", line 3, in <module>File "<frozen zipimport>", line 259, in load_moduleFile "<loader>", line 10, in <module>File "<loader>", line 8, in __load
ImportError: (could not import module 'PySide2.QtGui') 'C:\\Users\\admin\\PycharmProjects\\PortSearch\\dist\\PySide2.QtWidgets.pyd'

在命令行里输入:python

输入:import PySide2.QtGui

C:\Users\admin\PycharmProjects\PortSearch>python
Python 3.9.0 (tags/v3.9.0:9cf6752, Oct  5 2020, 15:34:40) [MSC v.1927 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import PySide2.QtGui

发现不报错,试着在 PortSearchGUI.py 中加入一行引入 import PySide2.QtGui,删除dist目录,再试着打包一次。

报错:

This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

查一下问题,根据 信息 ,先进入 C:\Python39\Lib\site-packages\PySide2 ,将 plugins 文件夹下的 platforms 文件夹复制到 PySide2目录下,与 designer.exe 同目录。

再次打包,还是报一样的错误,再将 PySide2文件夹复制到  C:\Users\admin\AppData\Roaming\Python\Python39\site-packages 目录下,再次打包,再次试图运行,报了另外一个错:

查看日志文件,看到报错:

Traceback (most recent call last):File "PortSearchGUI.py", line 3, in <module>
ModuleNotFoundError: No module named 'PySide2.QtWidgets'

在PortSearchGUI.py中加入引用

import PySide2.QtWidgets

再次打包并运行,在日志里又看到:

Traceback (most recent call last):File "PortSearchGUI.py", line 3, in <module>
ModuleNotFoundError: No module named 'PySide2.QtWidgets'

修改:

from PySide2 import *

再次打包并运行,在日志里又看到:

Traceback (most recent call last):File "PortSearchGUI.py", line 3, in <module>
AttributeError: module 'PySide2' has no attribute 'QtCore'

找不到问题,试着运行了下 PortSearchGUI.py,发现报错:

Traceback (most recent call last):File "C:\Users\admin\PycharmProjects\PortSearch\PortSearchGUI.py", line 3, in <module>from PySide2.QtWidgets import QApplication, QLineEdit, QLabel, QPlainTextEdit, QPushButton, QWidget  # 引入模块File "C:\Users\admin\AppData\Roaming\Python\Python39\site-packages\PySide2\__init__.py", line 107, in <module>_setupQtDirectories()File "C:\Users\admin\AppData\Roaming\Python\Python39\site-packages\PySide2\__init__.py", line 54, in _setupQtDirectoriesfor dir in _additional_dll_directories(pyside_package_dir):File "C:\Users\admin\AppData\Roaming\Python\Python39\site-packages\PySide2\__init__.py", line 26, in _additional_dll_directoriesraise ImportError(shiboken2 + ' does not exist')
ImportError: C:\Users\admin\AppData\Roaming\Python\Python39\shiboken2\libshiboken does not exist

安装 shiboken2,发现安装在c盘根目录下,跟之前的操作一样,复制一份到 C:\Users\admin\AppData\Roaming\Python\Python39\site-packages

再运行试试,能跑起来了,再打包试试,又报这个错:

在个人环境变量里新建:

QT_PLUGINS_PATH    C:\Users\admin\AppData\Roaming\Python\Python39\site-packages\PySide2\plugins

QT_PLATFORMS_PATH    C:\Users\admin\AppData\Roaming\Python\Python39\site-packages\PySide2\plugins\platforms

再次打包,运行,终于出来了:

泪流满面……

精简不必要的代码,最后PortSearchGUI.py代码如下:

# coding=utf-8from PySide2 import QtGui
from PySide2.QtWidgets import QApplication, QLineEdit, QLabel, QPlainTextEdit, QPushButton, QWidget  # 引入模块
from PySide2.QtWidgets import QMessageBox
from PySide2.QtWidgets import QGroupBox, QVBoxLayout, QHBoxLayout  # 布局容器
from PySide2.QtCore import Slot  # 插槽模块
from PortSearch import PortSearch
import PortText
import threading
import pyperclip
import time
import sysclass PortSearchGUI(QWidget):def __init__(self):QWidget.__init__(self)self.resize(600, 480)    # 主窗体尺寸self.setWindowTitle('端口嗅探器 v1.0')  # 窗体名称self.ip_line_edit = QLineEdit()  # 修改父类self.ip_line_edit.setPlaceholderText('输入ip或者网址')self.ip_line_edit.setMinimumSize(180, 22)self.thread_label = QLabel('并发数:')self.thread_line_edit = QLineEdit()  # 修改父类self.thread_line_edit.setText('300')self.thread_line_edit.setMinimumSize(40, 22)self.port_label = QLabel('端口范围:')self.port_line_edit1 = QLineEdit()  # 修改父类self.port_line_edit1.setText('0')self.port_label2 = QLabel('~')self.port_line_edit2 = QLineEdit()  # 修改父类self.port_line_edit2.setText('65535')self.report_box_edit = QPlainTextEdit()  # 修改父类self.report_box_edit.setReadOnly(True)self.start_btn = QPushButton()  # 修改父类self.start_btn.setText('启动')self.start_btn.clicked.connect(self.collect_data)  # 建立连接self.copy_all_btn = QPushButton()  # 修改父类self.copy_all_btn.setText('复制全文')self.copy_all_btn.clicked.connect(self.copy_all)  # 建立连接self.copy_ori_btn = QPushButton()  # 修改父类self.copy_ori_btn.setText('复制原文')self.copy_ori_btn.clicked.connect(self.copy)  # 建立连接self.clear_btn = QPushButton()  # 修改父类self.clear_btn.setText('清空')self.clear_btn.clicked.connect(self.clear)  # 建立连接self.first_group_box = QGroupBox()  # 第一个分组框组控件self.first_group_box.setTitle('参数设置')self.second_group_box = QGroupBox()  # 第二个分组框组控件self.second_group_box.setTitle('端口开放情况')self.first_h_layout = QHBoxLayout()  # 第一个横向布局容器,属于第一个分组框控件self.second_h_layout = QHBoxLayout()  # 第二个横向布局容器,属于第一个分组框控件self.third_h_layout = QHBoxLayout()  # 第三个横向布局容器,属于第一个分组框控件self.first_v_layout = QVBoxLayout()  # 第一个纵向布局容器,属于第二个横向布局容器self.second_v_layout = QVBoxLayout()  # 第二个纵向布局容器,属于第二个横向布局容器self.first_h_layout.addWidget(self.ip_line_edit)self.first_h_layout.addWidget(self.thread_label)self.first_h_layout.addWidget(self.thread_line_edit)self.first_h_layout.addWidget(self.port_label)self.first_h_layout.addWidget(self.port_line_edit1)self.first_h_layout.addWidget(self.port_label2)self.first_h_layout.addWidget(self.port_line_edit2)self.first_h_layout.addWidget(self.start_btn)self.first_group_box.setLayout(self.first_h_layout)self.first_v_layout.addWidget(self.report_box_edit)self.second_v_layout.addWidget(self.copy_all_btn)self.second_v_layout.addWidget(self.copy_ori_btn)self.second_v_layout.addWidget(self.clear_btn)self.second_h_layout.addItem(self.first_v_layout)self.second_h_layout.addItem(self.second_v_layout)self.second_group_box.setLayout(self.second_h_layout)self.layout = QVBoxLayout()self.layout.addWidget(self.first_group_box)self.layout.addWidget(self.second_group_box)self.setLayout(self.layout)self.MESSAGE = ('ip或者网址不得为空','并发数不得小于1','开始端口号不得小于0','结束端口号需要大于开始端口号','原文复制成功','全文复制成功')self.G_LIST = ['', '']self.ip = ''self.thread_line = 0self.port_start = 0self.port_end = 0def show_tip(self, message):  # 遇到问题,则丢到这里,抛到界面上tip = QMessageBox(self)tip.setWindowTitle('提示')tip.setText(message)tip.show()# 函数B 负责调用逻辑def logic(self):search = PortSearch(ip=self.ip, thread_line=self.thread_line, port_start=self.port_start, port_end=self.port_end)result = search.run()string = ''string1 = ''str_len = len(result)self.report_box_edit.setPlainText('')if str_len > 0:  # 处理返回数据,输出到编辑框内for ele in result:string = string + '端口:' + str(ele[1]) + '  ,状态:开启,  输出信息:' + str(ele[3]) + "\n"time.sleep(1)if ele[3] == b'':  # 如果没有端口说明,则输出参考端口服务说明string1 = string1 + '端口:' + str(ele[1]) + ',状态:开启,输出信息:无' + ',参考端口服务说明:' + \PortText.port_text(ele[1]) + "\n"else:string1 = string1 + '端口:' + str(ele[1]) + ',状态:开启,输出信息:' + str(ele[3]) + "\n"else:string1 = '所有端口均未开启'self.G_LIST[0] = string  # 保存原文结果self.G_LIST[1] = string1  # 保存全文结果self.report_box_edit.setPlainText(string1)self.start_btn.setEnabled(True)self.setWindowTitle('端口嗅探器 v1.0')@Slot()def collect_data(self):self.ip = self.ip_line_edit.text()self.thread_line = int(self.thread_line_edit.text())self.port_start = int(self.port_line_edit1.text())self.port_end = int(self.port_line_edit2.text())if not self.ip:self.show_tip(self.MESSAGE[0])returnif self.thread_line < 1:self.show_tip(self.MESSAGE[1])returnif self.port_start < 0:self.show_tip(self.MESSAGE[2])returnif self.port_end <= self.port_start:self.show_tip(self.MESSAGE[3])returnthread = threading.Thread(target=self.logic)thread.start()  # 异步调用,避免工具卡死self.start_btn.setEnabled(False)  # 限制按钮,避免重复调用self.setWindowTitle('端口嗅探器 v1.0  ----  执行中')@Slot()def copy(self):pyperclip.copy(self.G_LIST[0])self.show_tip(self.MESSAGE[4])@Slot()def copy_all(self):pyperclip.copy(self.G_LIST[1])self.show_tip(self.MESSAGE[5])@Slot()def clear(self):self.report_box_edit.setPlainText('')app = QApplication(sys.argv)     # 创建appwindow = PortSearchGUI()    # 创建主窗体
window.show()    # 显示窗体app.exec_()    # 启动app
sys.exit()

结语

这个系列就写到这里了。

ps: 20210220 今天在其他同事的电脑上试了下,报 计算机中丢失 api-ms-win-core-path-l1-1-0.dll 的报错,查了下原因,需要在该电脑上安装 Visual C++ Redistributable for Visual Studio 2015。

用Python做一个安全攻防工具:端口嗅探器(9)相关推荐

  1. python实战扫码下载_实例:用 Python 做一个扫码工具

    原标题:实例:用 Python 做一个扫码工具 来自公众号: 新建文件夹X 链接:https://blog.csdn.net/ZackSock/article/details/108610957Pyt ...

  2. 如何用python做二维码识别软件_Python什么都能做(一)用 Python 做一个扫码工具...

    Python实现扫码工具 二维码作为一种信息传递的工具,在当今社会发挥了重要作用.从手机用户登录到手机支付,生活的各个角落都能看到二维码的存在.那你知道二维码是怎么解析的吗?有想过自己实现一个扫码工具 ...

  3. Python什么都能做(一)用 Python 做一个扫码工具

    Python实现扫码工具 二维码作为一种信息传递的工具,在当今社会发挥了重要作用.从手机用户登录到手机支付,生活的各个角落都能看到二维码的存在.那你知道二维码是怎么解析的吗?有想过自己实现一个扫码工具 ...

  4. 怎么用python做一个解压缩小工具,以后再也不用下载各种格式的解压缩软件了...

    经常由于各种压缩格式的不一样用到文件的解压缩时就需要下载不同的解压缩工具去处理不同的文件,以至于桌面上的压缩工具就有三四种,于是使用python做了一个包含各种常见格式的文件解压缩的小工具. 阅读全文 ...

  5. python屏幕录制与回放_使用Python来做一个屏幕录制工具的操作代码

    本文给大家分享使用Python来做一个屏幕录制工具,通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 一.写在前面 作为一名测试,有时候经常会遇到需要录屏记录自己操作,方 ...

  6. 用python制作二维码_用python做一个可视化生成二维码的工具

    用python做一个可视化生成二维码的工具 环境 pip install gooey pip install MyQR 源代码 from gooey import GooeyParser,Gooey ...

  7. 脚本录制软件python 按键精灵 tc_使用Python来做一个屏幕录制工具的操作代码

    一.写在前面 作为一名测试,有时候经常会遇到需要录屏记录自己操作,方便后续开发同学定位.以前都是用ScreenToGif来录屏制作成动态图,偶尔的机会看到python也能实现.那就赶紧学习下. 二.效 ...

  8. 用Python做一个房价预测小工具!

    哈喽,大家好. 今天给大家介绍一个非常适合新手入门的机器学习实战案例. 这是一个房价预测的案例,来源于 Kaggle 网站,是很多算法初学者的第一道竞赛题目. 该案例有着解机器学习问题的完整流程,包含 ...

  9. 【Python】如何用python做一个简单的输入输出交互界面?

    看到知乎上有人在问,如何使用Python做一个简单的输入输出交互界面? 交互界面就涉及到GUI编程. Python有很多GUI框架,功能大同小异. 其中比较出名的有「PyQT」.**wxPython. ...

最新文章

  1. Stylus插件开发教程
  2. 机器学习的乐趣与辛劳
  3. svn 设置post-commit后 报错svn: Can't convert string from 'UTF-8' to native encoding
  4. c语言中的数字菱形,打印数字菱形,急啊,帮帮小女子啊。。。
  5. 学习笔记----周志华《机器学习》第五章(神经网络)(二)
  6. android object数组赋值_Java对象数组定义与用法详解
  7. linux里工作目录的字体变蓝,netterm访问Linux时字体和背景颜色随目录发生改变的问题解决...
  8. 机器人最新天赋符文天赋加点图_常德2020中小学机器人竞赛开赛 286名选手现场比拼技能...
  9. JS进阶Date format(日期格式化)
  10. “双态IT”架构下的自动化运维
  11. cpu天梯图2021 cpu性能排行榜2021最新版
  12. bitcoin全节点搭建
  13. unity渲染篇:画面亮度、饱和度、对比度调整
  14. C#基础知识(停止更新、移步博客园)
  15. pixel 刷入自己编译的Android 8.0 安装Xposed 显示 Verified Boot (dm-verity) prevents the device from booting
  16. 对话翁志:京东大数据如何让技术真正落地
  17. 小菊花宝宝课堂开课了,教你认识各种形状——用脚本绘图
  18. 华为关于LINUX的认证,华为认证:华为TA128在LINUX下的简单设置
  19. java微信公众号服务器配置
  20. TensorRT:NvInfer.h-上篇

热门文章

  1. 分布式共识的工作原理,Part-1:分布式系统的定义及属性
  2. 数学公式中出现的s.t.是什么意思?
  3. Is620伺服驱动电机 伺服控制器开发设计方案成熟量产伺服控制器方案
  4. python人名查电话(字典)_python检索用人名查电话_创建一个将人名用作键的字典后,输入姓名查找值,返回错误......
  5. C语言循环语句之for循环
  6. 理解STP及端口角色状态
  7. 文本检测 OpenCV EAST 文本检测器 源代码
  8. serverless knative实战
  9. Java代码实现解压文件包和压缩文件的工具类
  10. ✔G【OPA847】【单运放 】高速 宽带 放大模块 3.9G带宽 高压摆率