当前位置:   article > 正文

python编译的exe之反编译

python编译的exe之反编译

1、前言

python 可通过pyinstaller 以及py2exe 编译脚本为exe,下面主要针对这两种方式生成的exe进行反编译

2、反编译过程

2.1 pyinstaller 编译的exe

提取过程python版本要与实际脚本的python版本一致,python版本可用16进制工具查看exe文件。

2.1.1 exe 转成pyc文件

有个开源脚本pyinstxtractor 可以把exe 转成pyc文件,另外还有个pyi-archive_viewer 也可以用,不过每次只能处理一个文件,不如pyinstxtractor 好用。

2.1.2 pyc 转 py
  • 在线网站可转

    http://tools.bugscaner.com/decompyle/

    https://www.lddgo.net/string/pyc-compile-decompile

  • 第三方库 uncompyle6

    pip install uncompyle6

  • 第三方库 pycdc

    uncompyle 对python3.10 以上版本支持不太好,可换为pycdc

    # 安装过程
    git clone https://github.com/zrax/pycdc.git
    cmake .
    make 
    ./pycdc pycfile
    
    # 遇到错误:Unsupported opcode: JUMP_IF_NOT_EXC_MATCH 
    
    #查找资料,看雪上有人给出了解决办法 https://www.52pojie.cn/thread-1649244-1-1.html
    
    # 找到源码 ASTree.cpp  查找Unsupported opcode 
    
    #添加以下代码
    
    ```
    case` `Pyc::JUMP_IF_NOT_EXC_MATCH_A:
    case` `Pyc::RERAISE_A:
    case` `Pyc::WITH_EXCEPT_START:
      ``break``;
    ```
    
    #临时解决而已。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
2.2 py2exe 编译成的exe

2.2.1 工具直接反编译

github 有个比较老的工具了,python-exe-unpacker,集合了pyinstxtractor和py2exe,可以先试试。

2.2.2 手工解包

Py2exe打包的exe程序有三部分组成,分别是PYTHONxx.dll(xx是版本号,比如27), PYTHONSCRIPT, library.zip。PYTHON27.dll应该就是python的运行环境了。PYTHONSCRIPT是程序开始执行的入口,如main函数。libarary.zip中是程序用到的库文件,包括自带的库和用户自己写的库文件。 破解程序的时候需要处理的文件就是PYTHONSCRIPT和library.zip。

使用Py2exe Bynary Editor(以下简称pbe) 可以简单的将Py2exe打包的程序dump成原来的三个文件,也可以将修改后的文件再打包回去。使用界面如图。

image-20240109163321822

针对library.zip 中的文件可直接用uncompyle6反编译一般不会有什么问题。

针对 PYTHONSCRIPT,则需要先进行一些处理

  • 获取code bytes

    用二进制编辑软件去除文件头和最后的两个0字节去掉。

    //文件头结构
    struct Header 
    { int tag; // Size: 4 bytes 
    int optimize; // Size: 4 bytes 
    int unbuffered; // Size: 4 bytes 
    int data_bytes; // Size: 4 bytes
    char zippath[VARIABLE_SIZE] // Size: variable 
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    image-20240109163532791

  • 把code对象转换成pyo文件(Linux)

    import marshal
    mylist=marshal.load(open("xxx", "r"))
    print mylist
    marshal.dump(mylist[2], open("main.pyo","w"))
    
    • 1
    • 2
    • 3
    • 4
  • 修补文件头

    用 WinHex 加上 8 个字节的 file header。前 4 个字节代表 Python 版本号,后 4 个字节是 timestamp,可以打开另外一个pyo文件将前 8 个字节复制过去(图中阴影部分)。(必须与library.zip中pyo的前8个字节保持一致)。

    image-20240109163714228

  • 反编译pyo文件

    uncompyle6反编译

3、反混淆处理

3.1 pyinstxtractor提取失败

现象是 pyinstxtractor提取失败 ,显示

“Error : Unsupported pyinstaller version or not a pyinstaller archive”

来到pyinstxtractor代码的第50行,原来代码逻辑是这样的,一旦读取不到MAGIC,就会报错,提示不是pyinstaller打包程序。

image-20240109165506965

网上追溯,可以看到标识MAGIC为 ‘ MEI\xxxxxx ’,2.0版本的MAGIC位于 [end - 24] 处,2.1版本的MAGIC位于 [end - 88] 处。

image-20240109165520732

我们在 ‘MEI’ 后面发现了python27.dll,这个就是pylibname,看来这个是pyinstaller2.1打包的,所以我们就删除从’MEI’+88之后的所有垃圾数据。删除后的结果如下:

image-20240109165607188

修复后,可以正常转换了。

3.2 无pyc头部数据异常

有时候遇到pyinstxtractor 反编译出来的文件缺少pyc头,由4字节的magic和4字节的时间戳组成,其中magic会因为python版本的不同而不同,此时查找其他成功的文件,复制一个pyc头部。

image-20240109170126195

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/949813
推荐阅读
相关标签
  

闽ICP备14008679号