百木园-与人分享,
就是让自己快乐。

[Python]解密pyc文件

公司的pyc做了加密, 前段时间研究了一下怎么解密.

 

最开始的思路是反汇编pypy的dll, 找到import代码的实现, 然后写一个解码的函数. 但是对反编译的东西不熟悉, 想要找到解密的地方比较困难. 最后放弃了这个思路.

后面看到了一篇pyc文件格式的文章, 得知pyc文件其实就是文件头+marshal编码后的python vm字节码, 所以尝试了hook一下marshal.loads

import marshal

old_loads = marshal.loads
count = 0
pyc_set = set()
def marshal_loads(s): global count pyc_hash = hashlib.md5(s).hexdigest() if pyc_hash in pyc_set: return old_loads(s) pyc_set.add(pyc_hash) count += 1 x = \"O_\" + str(count) with open(\"./dumps/%s.pyc\" % x, \"wb\") as f: f.write(base64.b32decode(\'BLZQ2CR54CUFU===\')) f.write(s) print(1, len(s)) return old_loads(s) marshal.loads = marshal_loads

然后去import那个pyc, 他自己修改过的python解释器会先解码加密过的pyc文件, 然后再走到marshal.loads, 这时候已经不是加密的内容, 所以我们可以加一个标准的pyc头重新组装成一个pyc, 只是不清楚当前这段bytes是哪个pyc文件的, 这个不是很重要, 反正所有import到的模块都会被dump出来.

下来用uncompyle6反编译就行了. 反编译出来的代码, 头部会标明自己是哪个模块, 再写一个脚本重新rename一下, 就可以了. 不过有少数代码会反编译失败.

 

文中那个\'BLZQ2CR54CUFU===\' magic number, 应该是我随便找了一个正常的pyc文件, 应该是python 2.7的, 如果是python 3的话, 找一个正常的pyc文件看看, 替换一下就行了.

 

最后吐槽一下, 把pyc文件加密有什么意义, 为啥要把脑子浪费在这种地方上???

 

参考:

1. PYC文件格式分析 (kdr2.com)

2. uncompyle6 · PyPI

/**********************************************************************
 * 机械教条主义
 *

 * From:         

http://www.cnblogs.com/egmkang/

 * Email:          egmkang [at] outlook.com


 * Weibo:
        http://weibo.com/egmkang

 * Github:       http://github.com/egmkang
 *
 **********************************************************************/


来源:https://www.cnblogs.com/egmkang/p/16857353.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » [Python]解密pyc文件

相关推荐

  • 暂无文章