关于某ewt刷课软件的逆向解包反编译
起因
- 该软件分为多个版本,在Github声称完全开源,实际上并非如此,开源的版本已经停止维护,而正在维护的版本却未开源,有人发Issue问其源码,而开发者却不予理会
- 维护中的软件编写实在是过于”奇特”,ui为PyQt5编写,界面几乎全英文/历史某个版本非常好用且简洁,后来作者使用PyQt5重构时,体积膨胀到近50mb)
- 旧版本简洁软件甚至有作者写的版本检测导致无法继续使用
关于软件
Python3.10 + PyQt5 + Pyinstaller打包
解包&解密
既然已经知道他是用Pyinstaller
打包成exe,那么可以使用对应工具对其解包
这里我采用pyinstxtractor对其解包
打开cmd 输入命令 python pyinstxtractor.py xxxx.exe
运行过程中发现部分文件解包报错 是加密了,这时我们来到解包后的目录中
在其中找到文件pyimod00_crypto_key
并且加上后缀.pyc
这个是存储加解密的Key所在文件,对其进行反编译
这里我使用的是 在线Python pyc文件编译与反编译 进行在线反编译
key已经出来了 接下来我们需要编写脚本对目录PYZ-00.pyz_extracted
中的文件进行解密
1 | import glob |
注意,在outf.write
中,我们需要替换为对应python版本的头文件
对于不同pyton版本头文件(header)也不相同,2.7~3.10如下所示:
Python 2.7: \x03\xf3\x0d\x0a\0\0\0\0
Python 3.0: \x3b\x0c\x0d\x0a\0\0\0\0
Python 3.1: \x4f\x0c\x0d\x0a\0\0\0\0
Python 3.2: \x6c\x0c\x0d\x0a\0\0\0\0
Python 3.3: \x9e\x0c\x0d\x0a\0\0\0\0\0\0\0\0
Python 3.4: \xee\x0c\x0d\x0a\0\0\0\0\0\0\0\0
Python 3.5: \x17\x0d\x0d\x0a\0\0\0\0\0\0\0\0
Python 3.6: \x33\x0d\x0d\x0a\0\0\0\0\0\0\0\0
Python 3.7: \x42\x0d\x0d\x0a\0\0\0\0\0\0\0\0\0\0\0\0
Python 3.8: \x55\x0d\x0d\x0a\0\0\0\0\0\0\0\0\0\0\0\0
Python 3.9: \x61\x0d\x0d\x0a\0\0\0\0\0\0\0\0\0\0\0\0
Python 3.10: \x6f\x0d\x0d\x0a\0\0\0\0\0\0\0\0\0\0\0\0
其他版本的也可以通过查看对应python版本的.py的头文件获取
在上一步的反编译中,会显示该pyc的python版本(# Version : Python 3.10)
选对应的头文件替换即可
然后我们运行脚本
现目录中加密后的文件都变成*.pyc
了 这个时候我们反编译即可
反编译
寻找了一会,发现了部分关键pyc文件 并且将其反编译成了py文件ui.py``start_ui.py
是该软件的UI界面代码functions.py
ewt_core.py
则为关于某网课的部分Api实现以及刷课的核心代码
附属软件的逆向
起因:
该刷课软件如果想使用高倍数刷课,需要使用他的一个获取license的程序获取license,该获取license的程序获取前需要答对20题,过于麻烦于是便将他逆向。
逆向
同上方逆向刷课软件过程一样,将其解包+解密,具体过程省略
在extracted
目录中发现了get_license
文件,改名为pyc
后缀,并且将其反编译
却发现无法正常反编译 内容为空
这是因为他缺少了头文件,我们需要在同目录下的struct
文件中复制它的头文件过去
这里使用工具winhex
打开struct文件和get_license.pyc文件
对比一下可以看出get_license.pyc
文件缺少了Offset:00000000
中的字节
制一下struct
中的过去即可
这时我们就可以正常反编译了
把代码稍微处理一下,删除答题等多余代码
1 | import hashlib |
ok,直接跑起来输入账号获取license,经过测试 可以正常使用