最近在研究Anki,想自己编写插件但苦于能力有限,所以投机取巧,借鉴一下前人的轮子,遂作此笔记,仅供研究使用。
1. 环境
- Anki: 版本 2.1.15 (442df9d6)
- Python: Python 3.6.5
- 系统环境:macOS Mojave 10.14.4
2. 工具
Anki插件
任意
pyinstxtractor.py
解压pyinstaller打包后的可执行文件。
下载官网
uncompyle
反编译pyc文件。
安装:
pip install uncompyle
010 Editor
十六进制编辑器,用于修复打包文件。
参考下载
3. 操作步骤
3.1 解压缩可执行文件
存放目录
将pyinstxtractor.py和待解压的文件放在同一目录,执行命令:
python pyinstxtractor.py ARPC.exe
执行结果
解压结果
3.2 反编译主程序
image.png
经过pyinstaller打包后的入口文件,会缺少magic number 和修改时间,需要我们自行补齐。
.pyc 文件包含三个主要内容:magic number,修改时间,和一个 PyCodeObject 对象。
magic number 和 Python 版本有关,magic number 不同能够防止低版本误执行高版本编译后的字节码。修改时间能让编译器决定是否重新编译源文件。
3.2.1 修复pyc文件
网上有文章说,可以参考struct文件的前8个字节,但是在我测试的版本中,需要将前12个字节,都拷贝过去才可以。大家灵活掌握。
import time
import struct
f = open('ARPC.exe_extracted/PYZ-00.pyz_extracted/__future__.pyc', 'rb')
magic = f.read(4)
moddate = f.read(4)
modtime = time.asctime(time.localtime(struct.unpack('I', moddate)[0]))
print('magic number: %s' % (magic.hex()))
print('moddate %s (%s)' % (moddate.hex(), modtime))
拷贝
插入字节
插入大小
粘贴字节
3.2.2 反编译pyc文件
将ARPC文件添加.pyc后缀,执行命令:
# 将反编译后的文件写入ARPC.py
uncompyle6 ARPC.pyc > ARPC.py
反编译结果