一、登录器结构分析

解压查看内部结构:
python .\pyinst-repacker.py extract .\main.exe


解出来的格式是这样的,我们需要查看的就是在 FILES 里面。

注意:用 pyinstxtractor 解 exe 可以看到用的是 python3.11,这就限制了很多工具使用。因为 Python 3.11 打包的 exe 比早期版本更难逆向,是因为 3.11 重构了字节码和虚拟机,引入了自适应指令和运行期缓存,导致 pyc 不再是稳定的静态结构,传统的反编译工具几乎失效,只能通过运行时 Hook 才能还原逻辑;而 3.10 及以前的版本字节码结构稳定,pyc 可以较完整地反编译成源码。

不过可以使用 https://pylingual.io/,它支持 Python 3.6 至 3.12 版本,其他试了好多工具都不得行。
二、源码与通信逻辑分析
翻找了一下解出来的 py,有一个引起了我们的注意是与服务器通信的,里面还有这个函数:
def 登录 (card_pwd):
"""调用 API 接口并代入数据"""
url = urls['登录']
cshi = get_location_by_ip()
lg_city = cshi
mac = 硬盘序列号和 MAC 地址 ()
payload = {'CardPwd': card_pwd, 'Mac': mac, 'LgCity': lg_city}
response = requests.post(url, data=payload)
content = response.content
response_data = response.text
data_parts = response_data.split()
(data_parts)
(data_parts) == :
到期时间 = data_parts[]
Token = data_parts[]
stringmd5 = data_parts[] + data_parts[] + data_parts[] + data_parts[] + sign_pwd
md5_hash = hashlib.md5()
md5_hash.update(stringmd5.encode())
md5_value = md5_hash.hexdigest()
md5_value == data_parts[]:
()
(, Token, 到期时间,data_parts[])
:
加入黑名单 ()
(, )
:
失败原因 = content.decode(, errors=)
(失败原因)
(, 失败原因)





