python逆向基础知识

First Post:

Last Update:

python逆向

为什么打包

Python脚本不能在没有安装Python的机器上运行。将脚本打包成exe文件发送给别人,即使他的电脑上没有安装Python解释器,这个exe程序也能在上面运行

这时候如果直接将这个exe文件拖入ida,会有大量的python内置解释器等冗余信息干扰逆向,并且无法很清楚的看到程序的真实逻辑

如何解包

pyinstxtractor

下载:

extremecoders-re/pyinstxtractor: PyInstaller Extractor (github.com)

使用:

1
python pyinstxtractor.py test.exe

成功示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
C:\Users\86186\Desktop\pyinstxtractor-master>python pyinstxtractor.py game.exe
[+] Processing game.exe
[+] Pyinstaller version: 2.1+
[+] Python version: 3.8
[+] Length of package: 15340963 bytes
[+] Found 134 files in CArchive
[+] Beginning extraction...please standby
[+] Possible entry point: pyiboot01_bootstrap.pyc
[+] Possible entry point: pyi_rth_pkgres.pyc
[+] Possible entry point: pyi_rth_win32comgenpy.pyc
[+] Possible entry point: pyi_rth_pywintypes.pyc
[+] Possible entry point: pyi_rth_pythoncom.pyc
[+] Possible entry point: pyi_rth_inspect.pyc
[+] Possible entry point: pyi_rth_pkgutil.pyc
[+] Possible entry point: game.pyc
[+] Found 212 files in PYZ archive
[+] Successfully extracted pyinstaller archive: game.exe

You can now use a python decompiler on the pyc files within the extracted directory

逆向

然后就可以在解包的文件夹下找到python的主函数,是一个pyc文件,pyc文件时python编译后的文件,可以放到在线网站直接转换成py文件,即变为可读源码

在线Python pyc文件编译与反编译 (lddgo.net)

python反编译 - 在线工具 (tool.lu)

或者本地也可以反编译:

Uncompyle6 安装与使用

1
pip install uncompyle6     //安装
1
uncompyle6 -o test.py test.pyc //使用

和 pyinstxtractor使用类似,一条命令即可。

pycdc 安装与使用

pycdc支持到python3.11,uncompyle6不支持3.9即以上

安装与使用

可以看看UKFC一位大佬的文章

pycdc配置和使用-CSDN博客

Magic number

在反编译过程中,可能会遇到反编译不成功的情况,一般来说是因为出题人改了文件头,每个python版本的文件头是不一样的,手动修改文件头,即可继续将pyc反编译为py文件

python Magic Number对照表以及pyc修复方法 - iPlayForSG - 博客园 (cnblogs.com)

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, /* Also covers 1.2 */
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,
};