Scan 发表于 2024-5-14 19:03

关于代码混淆的学习经验求助

本帖最后由 Scan 于 2024-5-14 19:05 编辑

代码地址链接:https://pan.baidu.com/s/1MQcH655USKY0HDT37fp6PA?pwd=52pj
提取码:52pj
--来自百度网盘超级会员V3的分享

请问这个   x1f\x8b\x08\x00\xe4k 这种是怎么弄出来的我知道是进制但是弄不出人家这个效果,我解密就解不出来,自动写出来的一下就解密出来了,他的加密过程有例子吗,给个思路和例子结贴!~~~想学习的一天!~~~
而且他有的JS代码也是经过混淆的!!!
学到他的加密过程就行!!!!需要给出完整的例子,可以加币(需要提前说明)


大家好,在此收集代码混淆学习文件
有效期截止到2024年5月29日19:03,麻烦在此之前点击以下链接将文件发送给我,支持发送任意格式的文件,感谢~
链接:https://pan.baidu.com/disk/main#/transfer/send?surl=ADMAAAAAABIwYA
来自:拯救Safe的轩轩

Scan 发表于 2024-5-14 19:06

这是自动写出来的,但是一下子就解密出来了,人家的就解不出来,求大佬们给个思路吧!!!
import marshal
import zlib
import base64

# 定义代码字符串
code_str = "print('123')"



# 将代码字符串转换为字节串,以便序列化
code_bytes = code_str.encode()

# 使用marshal进行序列化
marshaled_code = marshal.dumps(code_bytes)

# 使用zlib进行压缩
compressed_code = zlib.compress(marshaled_code)

# 将压缩后的字节数据进行Base64编码
compressed_code_base64 = base64.b64encode(compressed_code)
import marshal
import zlib

# 假设compressed_code是从某处接收或读取的
# 解压缩
decompressed_code = zlib.decompress(compressed_code)

# 反序列化
unmarshaled_code_bytes = marshal.loads(decompressed_code)
unmarshaled_code_str = unmarshaled_code_bytes.decode()
exec(unmarshaled_code_str)

Arcticlyc 发表于 2024-5-14 19:03

### 首先,你只是对代码进行 encode 操作,而他的代码实际上是 code boject,这一点我已经跟你讲过

了解 code object 之前,可以先看一张图

https://img2.imgtp.com/2024/05/14/sZOtTIjV.png

上图是 python 中 pyc 文件的结构,如果你不知道 pyc 可以百度搜索

从上图可以看出,一个 pyc 文件中,从第 16 字节开始(python 3.7+),就是 code object (经过 marshal 序列化后)的二进制数据。

**代码对象 code object 是一段可执行的 Python 代码在 CPython 中的内部表示。**

我们知道,pyc 反编译一般有 uncompyle6(最高支持 py 3.9) 和 pycdc 两个工具。

由于我的环境为 3.11,现在我将演示从 py 到 pyc,并从 pyc 中获取 code object 的过程,然后再通过 code object 重新生成 pyc 文件,最后再通过 pyc 反编译工具将 pyc 文件反编译为源代码的过程。


#### 1. 从 py 到 pyc,获取 code object
```python
# test.py
# 斐波那契数列
def fib(n):
    a, b = 0, 1
    while b < n:
      print(b, end=' ')
      a, b = b, a+b
    print()

fib(1000)
```

https://img2.imgtp.com/2024/05/14/7KT9UdY5.png

#### 2. 通过 code object 生成 pyc 文件
```python
# 通过 code object 生成 pyc
HEADER = magic + b"\x00" * 4
# 时间随便写
HEADER += struct.pack("<I", int(time.time()))
# 大小随便写
HEADER += struct.pack("<I", 30)

code = HEADER + marshal.dumps(pyobj)

Path('test.pyc').write_bytes(code)
```

#### 3. 通过 pyc 反编译工具反编译 pyc 文件
https://img2.imgtp.com/2024/05/14/dGou2tHh.png

**可以看出,这种方法是可以反编译 pyc 的**
**但是受到代码或是反编译工具本身的影响,反编译的结果可能不完全**

Scan 发表于 2024-5-14 21:42

Arcticlyc 发表于 2024-5-14 20:45
### 首先,你只是对代码进行 encode 操作,而他的代码实际上是 code boject,这一点我已经跟你讲过

...

非常感谢您的再次解答,这次我已经略懂了,可对第二点通过code object生成pyc还是不太了解,假如我要生成他的那个pyc文件我应该怎么操作 magic替换成他里面那个进制代码吗?

Arcticlyc 发表于 2024-5-14 21:47

Scan 发表于 2024-5-14 21:42
非常感谢您的再次解答,这次我已经略懂了,可对第二点通过code object生成pyc还是不太了解,假如我要生成 ...

Python逆向全版本MagicNumber表

Scan 发表于 2024-5-14 21:50

Arcticlyc 发表于 2024-5-14 21:47
Python逆向全版本MagicNumber表

嗯呢,我的意思是说在哪里填写他那个代码,然后逆向出来他源代码,哈哈我比较笨一点 我刚刚拿笔记了一遍上述的知识

Arcticlyc 发表于 2024-5-14 21:51

Scan 发表于 2024-5-14 21:42
非常感谢您的再次解答,这次我已经略懂了,可对第二点通过code object生成pyc还是不太了解,假如我要生成 ...

还有一点需要注意,marshal 这个库是 python 专门用于生成 pyc 的,因此不同版本 marshal 会不一样,如果你要使用这个库反序列化,请使用相同的 python 版本

Arcticlyc 发表于 2024-5-14 21:55

本帖最后由 Arcticlyc 于 2024-5-14 21:57 编辑

Scan 发表于 2024-5-14 21:50
嗯呢,我的意思是说在哪里填写他那个代码,然后逆向出来他源代码,哈哈我比较笨一点 我刚刚拿笔记了一遍 ...
marshal.loads 的结果就是 code object,要写入文件的话需要将 code object 进行 marshal.dumps。
页: [1]
查看完整版本: 关于代码混淆的学习经验求助