[Python]解密pyc文件

打印 上一主题 下一主题

主题 853|帖子 853|积分 2559

公司的pyc做了加密, 前段时间研究了一下怎么解密.
 
最开始的思路是反汇编pypy的dll, 找到import代码的实现, 然后写一个解码的函数. 但是对反编译的东西不熟悉, 想要找到解密的地方比较困难. 最后放弃了这个思路.
后面看到了一篇pyc文件格式的文章, 得知pyc文件其实就是文件头+marshal编码后的python vm字节码, 所以尝试了hook一下marshal.loads
  1. import marshal
  2. count = 0<br>old_loads = marshal.loads
  3. def marshal_loads(s):
  4.     global count
  5.     pyc_hash = hashlib.md5(s).hexdigest()
  6.     if pyc_hash in pyc_set:
  7.         return old_loads(s)
  8.     pyc_set.add(pyc_hash)
  9.     count += 1
  10.     x = "O_" + str(count)
  11.     with open("./dumps/%s.pyc" % x, "wb") as f:
  12.         f.write(base64.b32decode('BLZQ2CR54CUFU==='))
  13.         f.write(s)
  14.     print(1, len(s))
  15.     return old_loads(s)
  16. 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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

小秦哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表