找到要解析源码的exe,用7zip解压出来,可以看到打包前的目录(这里并不是所有的exe都可以)。
如下图所示,由于这个是一个前后端打包的exe,这里的server是后端的服务,resources是前端,这里可以通过使用这个软件发现是一个前后端都在本地,通过网络鉴权的方式登录的。这里我是要绕过这个软件的登录
前端
asar是前端框架打包的,参考这里进行解压,解压后就得到前端的代码,当然打包后的一些文件名是经过重命名的。前期一直在尝试修改前端进行绕过,但是最终没成功。
app目录
后端
上面是部分后端目录的文件,后端是python写的,这些文件都是一些开源的东西,我要修改的地方不在这里面,在这个最大的exe文件里面
通过这个进行解压python打包exe文件注意要用同一版本的python才行,不同版本的话,PYZ-00.pyz_extracted文件夹会为空,如果不知道使用什么版本的话,可以先用其他的版本解包,解完之后,在里面找到struct.pyc文件,用winhex打开,查看头部找到对应的版本,然后再用对应版本进行解开
PYZ-00.pyz_extracted目录是重点,但是上面这个图出现了probably encrypted ,说明并没有解压成功,说明是通过加密的。
但是我发现这个crypto_key.pyc文件,把这个pyc转成py,参考这里
得到key,然后参考、参考2
通过下面这个脚本进行解密,修改对应的路径和秘钥,就可以解出对应的pyc文件
import glob
import zlib
import tinyaes
from pathlib import Path
CRYPT_BLOCK_SIZE = 16
# key obtained from pyimod00_crypto_key
key = bytes('CYNLlJe5RycAPXED', 'utf-8')
for p in Path("path").glob("**/*.pyc.encrypted"):
inf = open(p, 'rb') # encrypted file input
outf = open(p.with_name(p.stem), 'wb') # output file
# Initialization vector
iv = inf.read(CRYPT_BLOCK_SIZE)
cipher = tinyaes.AES(key, iv)
# Decrypt and decompress
plaintext = zlib.decompress(cipher.CTR_xcrypt_buffer(inf.read()))
# Write pyc header
# The header below is for Python 3.8
outf.write(b'\x55\x0d\x0d\x0a\0\0\0\0\0\0\0\0\0\0\0\0')
# Write decrypted data
outf.write(plaintext)
inf.close()
outf.close()
# Delete .pyc.encrypted file
p.unlink()
然后再用decompile3、pycdc、uncompyle6将pyc转成py文件,就可以得到对应的源码,进行修改了。