【测试】Python反编译的两种方式

以前听说py编译的程序不安全,容易被反。这两天刮台风了,闲着也是闲着,自己也跟着捣鼓了一番。

为了不给别人带来不好的影响,我编译我自己写的代码来做测试,代码头部如下图,引用了几个常见库:

bef32bed7db57f59c3018feaeab1395d.png

用pyinstaller进行完整打包:

pyinstaller -F g.py

082c9c239d1d77325fca04d68420713c.png

打包结束,在dist目录得到目标程序g.exe:

18427149ec685bc964b01ae252be9e65.png

接下来用两种方式进行反编译:

一、pyinstxtractor+uncompyle6方式

  1. 将pyinstxtractor.py和目标exe放在同一个目录

    74427faa176d91e798618965b7613e4b.png

  2. 在目录进入命令行窗口,输入命令:

    python pyinstxtractor.py g.exe

    7420727f5bab2887128c4e38e7bba0aa.png

    会在当前目录生成一个目标_extracted 的文件夹,里面有一大堆文件,其中有一个与目标exe同名的pyc文件,我这边就是g.pyc。

  3. 安装uncompyle6库,按以下命令安装:

    pip install uncompyle6
  4. 将pyc文件反编译为py文件:在第2步的目标_extracted 文件夹进入命令行窗口,输入以下命令,后面的.py文件名随意:

    uncompyle6 g.pyc>g.py

    42d582db1a8ba5f00658578f1bf01b88.png

  5. 回车后在当前目录生成对应的py文件:

    c093cba4bcfc80bb8220aca1ee03a30d.jpeg

  6. 打开瞧一瞧,和源文件对比一下,头部多了一些uncompyle6的信息,其余的和源文件一毛一样。

    f1cfe7373492fc662f68178a1aef9377.png

二、pycdc方式

  1. 前面还是同上面的方式,得到pyc文件(步骤2);

  2. 将pycdc.exe和pyc文件放同一目录,进入命令行窗口,输入以下命令:

    pycdc.exe g.pyc > g.txt
  3. 反编译结果被输出到g.txt中,当然后缀也可以改成.py啥的。

294ef975d775af2b8e2e8423e9947780.png

对比结果,这种方式好像代码都变成纯文本了,除了一些换行会错乱,其他的还原度还是极好的。

6b5798c5258ac3b3eb110538247025ad.png

以上只是最基本的两种反编译Python打包的exe方式,也都顺利拿到我们想要的py源码。实际反编译的时候,可能会遇到很多情况,比如加密、magic头变化、依赖库、py版本等问题,只能相应的再去找解决办法,见招拆招了。

当然,网上还有很多方法,比如pyi-archive_viewer提取pyc文件,但大体思路都是exe > pyc > py。

以上的测试文件可公众号回复:py反

注:测试环境:Win7 64位,Python 3.8.7,简单测试,未做深入研究。

- End -

更多精彩文章

点击下方名片关注【偶尔敲代码】

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
反向传播神经网络可以用于DNA分类问题。下面是一个例子: 首先,我们需要准备数据。这里我们使用UCI Machine Learning Repository提供的氨基酸序列数据集,包含了三种不同类型的DNA序列。我们可以使用pandas库来读取数据: ```python import pandas as pd data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/molecular-biology/promoter-gene-sequences/promoters.data', header=None) ``` 数据集包含106个样本,每个样本包含57个特征(即57个碱基对的序列)。前48个特征是DNA核苷酸序列,后9个特征是DNA序列的类别标签。我们需要将类别标签转换为数字,以便于神经网络处理: ```python from sklearn.preprocessing import LabelEncoder le = LabelEncoder() data.iloc[:, -1] = le.fit_transform(data.iloc[:, -1]) ``` 接下来,我们需要将数据集分为输入和输出,然后将其拆分为训练集和测试集: ```python from sklearn.model_selection import train_test_split X = data.iloc[:, :-1].values y = data.iloc[:, -1].values X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) ``` 现在我们可以开始构建神经网络。这里我们使用Keras库来构建一个简单的多层感知机(MLP)模型: ```python from keras.models import Sequential from keras.layers import Dense model = Sequential() model.add(Dense(12, input_dim=48, activation='relu')) model.add(Dense(8, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) ``` 这个模型有两个隐藏层,分别包含12个和8个神经元。输出层只有一个神经元,使用sigmoid激活函数。我们使用二元交叉熵损失函数和Adam优化器来编译模型,并使用准确率作为性能指标。 现在我们可以使用拟合函数来训练模型: ```python model.fit(X_train[:, :48], y_train, epochs=100, batch_size=10) ``` 训练模型需要一些时间,但是一旦训练结束,我们就可以在测试集上进行预测: ```python y_pred = model.predict_classes(X_test[:, :48]) ``` 最后,我们可以使用混淆矩阵来评估模型的性能: ```python from sklearn.metrics import confusion_matrix cm = confusion_matrix(y_test, y_pred) print(cm) ``` 混淆矩阵显示了模型预测的结果和实际结果之间的差异。我们可以使用这些结果来调整模型的参数,以提高其性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值