beam文件的格式是 "EA IFF 1985"标准的变种,它把数据分为多个chunks。有时候我们会有这样一种需求,我们想通过beam文件得到源代码,这时候我们首先要想到的是beam_lib模块
beam_lib可以用不同的标识符来访问Chunk数据,而标识符又分为两类,atoms和strings,通过atoms访问到的chunk返回的都是Compound terms

而通过strings访问到的是binary。当然了,其实我们可以理解成两张哈希表,分别保留着不同类型的Key和Value值,便于用户访问,

其实我们最频繁使用到的就是beam_lib:chunks/2,beam_lib:chunks/3,根据标识符,取得某类chunk的不同表现形式。
具体官方文档请查看 http://www.erlang.org/doc/man/beam_lib.html


ok,解析来,我们讨论一下反汇编beam文件的问题,首先我们要明确一件事,如果在编译模块时,已经指定了debug_info,那么就很简单了:


我们直接使用abstract_code来通过beam_lib:chunks来获取beam文件的asf即可。

可是有时候,我们拿到手的beam文件未必包含了debug_info的信息
如下:


或者已经对debug_info进行了加密(具体的加密方法,请查看官方文档)
如下:

 

在这两种情况下,我们可以看到beam_lib这时候就没办法直接获取到了,其实还有一种方式,我们可以通过strings标识符的方式,获取
到不同的chunks的binary形式,如果我们知道其内部格式,根据二进制进行反汇编即可,这说起来容易,做起来困难,
最近我在翻看代码时候,在compiler的lib中找到一个内部模块beam_disasm。

哈哈,看到没,熟悉的asf又出现了,既然得到了解析树,接下来,亲们想干嘛就干嘛啊,O(∩_∩)O
 






 posted on 2013-02-28 10:01  文武双全大星星  阅读(4137)  评论(1编辑  收藏  举报