尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

PyArmor-Unpacker 实战笔记:免运行解密 PyArmor 加密脚本(3.9.7+ 静态解包)

PyArmor-Unpacker 实战笔记:免运行解密 PyArmor 加密脚本(3.9.7+ 静态解包) PyArmor-Unpacker 实战笔记免运行解密 PyArmor 加密脚本3.9.7 静态解包【免费下载链接】PyArmor-UnpackerA deobfuscator for PyArmor.项目地址: https://gitcode.com/gh_mirrors/py/PyArmor-Unpacker拿到一份 PyArmor 加密的.pyc源码看不见程序又不敢直接跑——PyArmor-Unpacker 就是针对这类 PyArmor 解密场景的开源工具注入解密、完全解密、静态解包三条路线覆盖大部分实际场景。这篇笔记只讲怎么选型、怎么跑通以及排障时最容易踩的坑。它解决什么问题先看懂 PyArmor 的字节码包装PyArmor 对每个代码对象做的核心动作是套壳头部调__armor_enter__在内存里解密尾部调__armor_exit__重新加密保证内存里不残留明文。结构大致如下包装头部 LOAD_GLOBALS N (__armor_enter__) N co_consts 长度 CALL_FUNCTION 0 POP_TOP SETUP_FINALLY X跳转到包装尾部 X 原始字节码大小 被修改的原始字节码 所有绝对跳转的 oparg 加头部大小 字节码被混淆 ... 包装尾部 LOAD_GLOBALS N 1 (__armor_exit__) CALL_FUNCTION 0 POP_TOP END_FINALLYPyArmor-Unpacker 做的事就是剥掉这层壳拿到解密后的代码对象移除头尾包装、校正跳转偏移递归处理所有嵌套代码对象最终输出一个像从没加过密的.pyc。选型三条路线一张表路线适用场景是否需要运行程序Python 版本要求产物方法 1注入解密只想快速看部分代码结构需要运行 PyInjector 注入与目标一致即可低版本可用部分解密代码经run.py运行方法 2完全解密需要彻底剥离保护、还原结构需要运行 PyInjector 注入与目标一致反编译建议 3.9.7dumps/下完整.pyc方法 3静态解包不能运行程序疑似恶意、有反调试不需要3.9.7 及以上dumps/下完整.pyc一句话选型目标是 Python 3.9.7 且不想执行程序直接走方法 3老版本或必须动态观察时才用注入路线。推荐路径实操静态解包三步走方法 3先把目标程序编译所用的 Python 版本对齐到你的解密环境——三条方法的第一守则版本不一致会引发各种难以归因的报错。把仓库里的methods/method 3/整个目录复制到目标文件所在目录核心是bypass.py。终端执行python3 bypass.py filename.pyc把文件名换成你的实际文件.py与.pyc均支持。钩子触发后脚本自动创建dumps/目录把解密后的.pyc写入其中随后主动杀死自身进程防止受保护程序真正运行起来。可选拿dumps/里的.pyc喂给 pycdc 这类反编译器还原出 Python 源码。如果同目录还有其他受保护文件bypass.py在首个文件解完后会扫描当前目录逐个询问是否继续解包——见下文排障清单。方法 1注入解密三点带过将methods/method 1/复制进目标目录运行受保护程序。用注入器如 Process Hacker 2把 PyInjector 注入进程执行其中的code.py拿到主代码对象。运行method_1.py导出解密结果再用run.py运行——它内部会先加载restrict_bypass.py处理限制模式再执行dumped.marshal。方法 2注入完全解密三点带过将methods/method 2/复制进目标目录运行受保护程序。同样注入 PyInjector与注入解密不同它会把代码对象修复干净再导出。在dumps/目录得到完全解密的.pyc需要源码时再用反编译器处理。原理速览审计钩子、内存补丁、EXTENDED_ARG审计钩子。Python 的审计日志audit logs是解释器内置的事件回调机制某些内部 C 函数被调用时会触发事件。marshal.loads从 3.9.7 起有对应事件所以bypass.py用sys.addaudithook装了一个钩子——PyArmor 调用内建 marshalC 实现的代码对象序列化模块读取加密数据时钩子直接截获拿到加密代码对象后离线解密全程不跑主程序逻辑。内存补丁。限制模式 1 是 PyArmor 的默认设置在 REPL 里调pyarmor_runtime()会直接报Check bootstrap restrict mode failed。restrict_bypass.py位于methods/method 1/的思路是把_pytransform.dll加载进内存后定位做检查的代码段用 NOP空操作指令整段覆盖再恢复原内存权限。只动内存、不改磁盘文件同一进程内持续生效。EXTENDED_ARG 处理。Python 3.6 每条指令固定 2 字节1 字节操作码 1 字节参数参数超过 255 时需要前置EXTENDED_ARG指令把高位左移 8 位叠加上去。剥掉包装头部后所有绝对跳转的目标地址整体前移头部大小必须逐条减回去——减完的偏移可能越过 255 的边界bypass.py里的calculate_extended_args负责重算该插入几条 EXTENDED_ARG 以及新参数值否则跳转全部错位。排障清单症状 → 原因 → 解法症状原因解法调pyarmor_runtime()报Check bootstrap restrict mode failed限制模式 1默认禁止在 REPL 中加载运行时先import restrict_bypass完成内存补丁再调用运行时方法 1 的run.py已自动包含该步骤版本不一致产物异常、反编译失败或运行时崩溃解密环境与目标程序编译时的 Python 版本不同先确认目标是什么版本编译的全链路解释器、反编译器对齐该版本bypass.py钩子不触发、dumps/无产物Python 低于 3.9.7marshal.loads的审计日志事件尚不存在换方法 1 或方法 2 的注入路线3.9.7 是静态解包的硬分界线含协程的程序如 discord 机器人解包失败代码对象上的协程标志干扰了解密调用bypass.py已内置remove_async处理用仓库最新代码即可目录有多个受保护文件却只解了一个bypass.py处理完入口文件后扫描当前目录遇到其他含__pyarmor__标记的文件会交互询问看到More PyArmor protected files found提示时回答y即可逐个批量解包3.10 目标解包后跳转错乱Python 3.10 起绝对跳转索引被除以 2 存储省空间新版bypass.py已做double_jump校正旧代码需升级边界与展望当前限制和可贡献方向已知限制尚不支持 PyArmor v8遇到 v8 加壳的产物需另想办法。静态解包止步于 3.9.7更低版本只能走注入路线。没有单元测试套件日志输出也比较粗糙。欢迎贡献的方向为 3.9.7 以下版本补静态解包支持、完善日志系统、补齐测试用例。维护者公开表示时间有限这些问题主要依赖社区接手。上手路径从哪一步开始最小行动路径只有三步克隆仓库git clone https://gitcode.com/gh_mirrors/py/PyArmor-Unpacker确认目标程序编译用的 Python 版本——≥3.9.7 走静态解包否则走注入路线。复制methods/method 3/到目标目录执行python3 bypass.py 目标文件.pyc去dumps/取产物。跑通一次之后把排障清单里的版本对齐刻进习惯剩下的大多只是按症状对表的问题。【免费下载链接】PyArmor-UnpackerA deobfuscator for PyArmor.项目地址: https://gitcode.com/gh_mirrors/py/PyArmor-Unpacker创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表