最近在Reddit ReverseEngineering上,我偶然发现了Python中的自修改代码。查看Github存储库非常有启发性,我发现以CFG形式公开的Python字节码程序的图片:在Python字节码程序上具有一些不错的功能(例如生成CFG或允许操纵代码,...)?

评论

如果没有,那么写一个就不难了。困难的部分是创建友好而直观的GUI。

能否编写一种使IDA可读的文件的工具?

@ heinrich5991:是的,更好,但是它可能可以在Python本身中实现:)

@ 0xC0000022L,是的,但是可以使其自我修改吗?

@ 0xC0000022L,是的,我在开玩笑。

#1 楼

有几种专用于Python的字节码反转的工具:转换成等效的Python
源代码。它仅接受Python版本2.7中的字节码。生成的源代码可读性强:docstring,列表,元组和哈希表打印精美。

'uncompyle'也可以通过编译并比较两个字节码来验证生成的源的等效性。
'uncompyle'基于John Aycock的通用小语言编译器
'spark'及其在
'decompyle'上的先前工作。



pyREtic,它比简单的程序更强大。 pyREtic是一个可扩展的框架,可以帮助执行Python语言项目的各种逆向工程任务。它帮助反向工程师从字节码(.pyc)中获取源代码(.py),特别是当被反向的代码已尽力尝试使用标准工具集停止反编译时,它提供了帮助。



pycdc,它比uncompyle更好,并且比pyRetic更易于使用


Decompyle ++旨在将已编译的Python字节码转换回有效的人类可读的Python源代码。尽管其他项目也取得了不同程度的成功,但Decompyle ++的独特之处在于它寻求支持任何版本的Python的字节码。

Decompyle ++包括字节码反汇编程序(pycdas)和反编译器。 (pycdc)。


Manyard框架,专用于Python3


#2 楼

Maynard是Python字节码的(反)汇编程序,由Python核心成员和Python 3.4的发布管理器编写。在这里和这里阅读材料。我不知道可以像这样进行CFG可视化的公共工具(除了链接的工具之外),但您当然可以在Maynard的基础上构建一个。

评论


AFAIK,pypy有一个控制流程图查看器和一个jitviewer。

– NlightNFotis
13年5月9日在12:43

看起来像这样吗?如果是这样,那仅适用于RPython,它是Python的严格子集。我认为区别很重要,因为RPython的重点是它比Python更适合静态分析。也就是说,仍然可能有用。

– 94c3
2013年5月9日12:58



#3 楼

Immunity Sec的pyREtic还可以提供一些帮助,以帮助您研究原始源代码并进行修改。

您可能有兴趣在此文档中查看该工具的功能:
Rich Smith撰写的“ pyREtic,用于混淆Python字节码的内存反向工程” [PDF]

#4 楼

编写用于提取python字节码控制流的工具的一个挑战是,到目前为止有大约25个左右的Python字节码版本可供选择(如果您包含pypy变体)。

示例图中的字节码及其JUMP_IF_FALSE,后跟一些POP_TOPPRINT_NEWLINE指令,反映了2.7之前的Python。

但是,Flare_bytecode_graph及其POP_TOP_IF_FALSE的注释之一中的示例为2.7。 Python 3删除了PRINT_ITEM指令。

编写此类工具的任何人都必须牢记这一点;或对使用单一版本的Python感到满意,对于它,2.7可能是最受欢迎的选择。或者,您可以确保正在运行的Python版本与要分析的字节码匹配,并使用Python提供的当前dis和opcode模块。但是即使在这里,这些模块也会随着时间而变化,至少不是特定的字节码指令。

我为那些希望在所有版本的Python字节码中工作的人编写了一个名为xdis的python软件包,不想使用字节码所需的相同版本的Python。

在此过程中,您可能要做的下一件事是将指令分类为可以分支的类别以及那些不能的,以及分支是否有条件的分支。

Python的一些列表涵盖了其中的某些部分(“ hasjrel”,“ hasjabs”),但是可惜它没有最有用的类别。出于历史原因,类别是列表而不是集合。但是再次xdis在这里进行救援;它使用“ CONDITION_OPS”,“ JUMP_UNCONDITIONAL”和“ JUMP_OPS”集填充此信息。

为此,我编写了https://github.com/rocky/python-control-flow,它使用xdis并具有一些基本代码,这些代码将为大多数Python字节码创建控制流图和控制树。有一些代码可以创建点文件,我使用graphviz进行显示。我注意到Python可以创建很多无效代码。

该软件包的预期用途是重建高级Python控制结构。有一些基本的控制结构检测,尽管这需要做很多工作。当您包含try / while / for“ else”子句和“ finally”子句时,Python控件结构非常丰富。甚至照原样,基本块的带注释的控制流对于手动重建结构化控制流非常有帮助。

完成后,我可以在uncompyle6中替换很多hacky代码。

这使我进入了公认的答案中提到的反编译器列表。

如上所述,uncompyle和uncompyle2的那些特定版本仅处理Python 2.7。如建议的那样,有些旧版本可以处理多个Python版本1.5至2.3或2.4左右。也就是说,如果您有Python 2.3或2.4解释程序可以在其上运行。

但是这些项目都没有得到积极维护。在uncompyle6中,当前有25个左右的代码问题,其中许多是我在uncompyle6中解决的。这是用于不再更改的Python版本! (为公平起见,尽管uncompyle6中有一些bug在uncompyle2中不存在。要解决这些问题,我真的需要进行更好的控制流分析)

只需执行与uncompyle6相同的操作即可轻松解决uncompyle6中的错误,我想我已经在问题中提到了其中的一些。在这一点上,uncompyle2比uncompyle更好,如果您仅对Python 2.7感兴趣,那是最准确的。

至于pycdc,尽管它的体积相对较小(与uncompyle6相比)相当不错,但也没有保持与Python更改保持同步的水平。因此,它在Python 3.4左右的版本中较弱,而在以后的版本中逐渐变得较弱。 Uncompyle6也是如此,但目前还不是。 pycdc记录了60多个问题,我怀疑很快就会解决这些问题。其中一些并不难修复。我对这两个反编译器的比较(可能是倾斜的)是https://github.com/rocky/python-uncompyle6/wiki/pycdc-compared-with-uncompyle6

#5 楼

Flare字节码图项目可以帮助图形化字节码CFG表示。取自项目README


...
也可以使用GraphViz创建控制流程图。图中的反汇编可以包括一个简单的窥孔反编译器的输出。

import bytecode_graph
def Sample():
    i = 2 + 2
    if i == 4:
        print "2 + 2 = %d" % i
    else:
        print "oops"

bcg = bytecode_graph.BytecodeGraph(Sample.__code__)
graph = bytecode_graph.Render(bcg, Sample.__code__).dot()
graph.write_png('example_graph.png')





评论


请尝试在链接中添加一些链接描述。

–伊戈尔·斯科钦斯基♦
17年8月15日在14:55