如何为具有树结构的文件格式制作 IDA 处理器

逆向工程 艾达 拆卸 蟒蛇 文件格式 Python
2021-06-23 05:22:19

IDA 处理的大多数文件格式都是以线性方式构建的,例如 EXE 或 ELF 或 Java 的 Class 文件等。

但是,当涉及到树结构的文件格式时,我想不出一个很好的方法来正确处理它们。
比如最近遇到一个混淆的PYC文件,代码有类似OLLVM的混淆加上一些垃圾字节,所以需要像IDA这样的强反汇编器。PYC文件格式其实就是一些magic byte + python marshal数据,很容易解析。但是,编组后的数据是树结构的。下面是一个例子:http : //www.beesfun.com/2017/04/01/PyCodeObject%E5%92%8Copcode/
正如你在解析结果中看到的,根对象是一个,module其常量包含模块中的其他函数,并且模块中的函数也可以在其常量中包含子函数。可用于解析 PYC 文件的dis模块或pytype

就像Java的编译文件一样,PYC为每个函数存储字节码和一些元数据,函数之间用名字而不是地址来调用,字节码相信每个函数中地址都是从0开始的于是我研究了idasdk73中module/java的源码,试图了解HexRays的开发者是如何应对Java类文件格式的。
然后我发现 IDA 中的 Java 模块正在为每个方法和插槽区域制作一个单独的段。因为python字节码在每个函数中假设地址从0开始,并且在每个函数中都有一个单独的const池,它也从0开始索引,我决定创建一个头段、一个代码段和一个const段。但同样的方式不适用于 PYC 文件,因为 PYC 格式是树结构的(子函数存储在父常量池中),并且 IDA 不允许重叠段。所以我不能把 consts 区域变成一个单独的段。
但是如果我为每个const创建一个segment,如果原始py文件很大,就会有几万个segment。

有没有更好的方法来为PYC 之类树结构格式制作加载器

1个回答

在不知道为什么你不能只使用几个不相重叠的部分,但也许是.pyc处理器模块该IDA Pro的书将是有益的(我认为它包括装载机)