0%

python逆向!

总述

主要分为三种,python编译的可执行程序、pyc字节码、dis反编译的代码。

打法

手撸!

[原创]死磕python字节码-手工还原python源码-软件逆向-看雪-安全社区|安全招聘|kanxue.com

自动化工具

可执行程序

用到的工具有

pyinstxtractor.py → 可以将exe转字节码

转成字节码之后头部是有缺失的(头部版本magic等缺失

要把struct这个文件的头部丢过去(winhex等

转成字节码之后看pyc字节码的处理方法

爆强!将 exe 文件反编译成 Python 脚本! - 知乎 (zhihu.com)

pyc字节码

主要有两个低版本可看uncompyle6

高版本可看pycdc

pycdc处理效果好

dis反编译的代码

可以试试pycdc里面的pycdas

如果所有方法都不行可以问问AI

补充

1
2
3
4
Python3.3 以下版本: 只有Magic Number和四位时间戳
Python3.3(包含) - Python3.7(不包含)版本: 4个字节的magic num + 8个字节的时间戳,这个时间戳可以全是0
Python3.7(包含)版本: 4个字节的magic num + 4个字节的空白数据 + 4个字节的时间戳 + 4个字节的文件长度,除了magic num,其它数据可以全是0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
enum PycMagic {
MAGIC_1_0 = 0x00999902,
MAGIC_1_1 = 0x00999903,
MAGIC_1_3 = 0x0A0D2E89,
MAGIC_1_4 = 0x0A0D1704,
MAGIC_1_5 = 0x0A0D4E99,
MAGIC_1_6 = 0x0A0DC4FC,

MAGIC_2_0 = 0x0A0DC687,
MAGIC_2_1 = 0x0A0DEB2A,
MAGIC_2_2 = 0x0A0DED2D,
MAGIC_2_3 = 0x0A0DF23B,
MAGIC_2_4 = 0x0A0DF26D,
MAGIC_2_5 = 0x0A0DF2B3,
MAGIC_2_6 = 0x0A0DF2D1,
MAGIC_2_7 = 0x0A0DF303,

MAGIC_3_0 = 0x0A0D0C3A,
MAGIC_3_1 = 0x0A0D0C4E,
MAGIC_3_2 = 0x0A0D0C6C,
MAGIC_3_3 = 0x0A0D0C9E,
MAGIC_3_4 = 0x0A0D0CEE,
MAGIC_3_5 = 0x0A0D0D16,
MAGIC_3_5_3 = 0x0A0D0D17,
MAGIC_3_6 = 0x0A0D0D33,
MAGIC_3_7 = 0x0A0D0D42,
MAGIC_3_8 = 0x0A0D0D55,
MAGIC_3_9 = 0x0A0D0D61,
};