首页 > 编程语言 >[Python]解密pyc文件

[Python]解密pyc文件

时间:2022-11-04 12:22:14浏览次数:62  
标签:文件 反编译 Python 解密 python loads pyc marshal

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

 

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

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

import marshal

count = 0

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

标签:文件,反编译,Python,解密,python,loads,pyc,marshal
From: https://www.cnblogs.com/egmkang/p/16857353.html

相关文章

  • 云数据库 GaussDB(for Influx) 解密第十一期:让智能电网中时序数据处理更高效
    摘要:GaussDB(forInflux)是一款基于计算存储分离架构,完全兼容InfluxDB生态的云原生时序数据库。本文分享自华为云社区《云数据库GaussDB(forInflux)解密第十一期:让智能......
  • Python内置模块FTPLIb的 STORLINES方法运行出错解决过程
    FTPLIbSTORLINES方法出错解决过程错误现象importftplibimportoptparseimportsysclassFTPWebpageDetect:def__init__(self)->None:self.target......
  • python django在线零食商城系统的设计与实现
    ......
  • python-列表排序
    输入三个整数x,y,z,形成一个列表,请把这n个数由小到大输出这就是要求升序排列,用之前写过几种方法法一#数组li=[1,3,5,7,2,0]#用sort()排序li_sort=sorted(li,reverse=......
  • python-将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
    分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。如果n!=k,但n能被k整除,则应打印出k的值,并......
  • python-练习
    Python实现秒表功能importtimeprint('按下回车开始计时,按下Ctrl+C停止计时')whileTrue:try:input()starttime=time.time()print('开......
  • python-requests的简单用法
    做一个总结~以便以后参考本文参考:​​​添加链接描述​​importrequestsGET请求eg:r=requests.get('http://httpbin.org/get')print(r.url)传参eg:load={'key1':'value1......
  • python-迭代器与生成器
    迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。迭代器有两个基本的方法:iter()和next()。字符串,列表或元组对象都可用于创建......
  • python-求三角形的面积
    计算三角形的面积法一:#计算三角形的面积a=float(input('输入三角形第一边长:'))b=float(input('输入三角形第二边长:'))c=float(input('输入三角形第三边长:'))whilea......
  • python-当字符串为空则抛出异常
    今天有一个需求,判断字符串是否为空,为空则抛出异常python的异常有个大基类,承的是Exception。所以我们自定义类也必须继承Exception#最简单的自定义异常classFError(Exceptio......