beam 分析+erlang反汇编+BeamAnalyzer
https://www.erlang.org/doc/apps/stdlib/beam_lib.html
https://www.cnblogs.com/unqiang/p/3737457.html
http://doofuu.com/article/4156131.html
https://segmentfault.com/a/1190000041013489
beam 分析
对17.9.2 erlang beam文件分析
1.beam_analyzer-master工具分析

ubuntu部署erlang、 elixir环境

运行beam_analyzer-master显示版本不兼容,重新下载低版本的elixir

编译项目:
mix deps.get
mix compile
运行测试:
mix test

跑通4个测试用例
使用BeamAnalyzer对思科beam文件进行测试:

测试多个beam文件,结果均失败
分析beam_analyzer源码(beam_analyzer-master\lib\beam_analyzer.ex)

1.BeamAnalyzer 的核心是利用 Erlang 的 :beam_lib 模块来提取和解析 BEAM 文件中的 abstract_code 块。
2.如果编译时没有添加 +debug_info,:beam_lib 无法找到 abstract_code,解析会失败。
总结:只有编译的时候包含(+debug_info)参数 的 .beam 文件才能被 BeamAnalyzer 解析成抽象代码(AST)。
验证:自己写一个简单的erlang程序(hello.erl),在编译的时候加(+debug_info)参数,才能被beam_analyzer编译成抽象代码



2.beam2erl分析
beam2erl与beamanalyzer同理,均调用beam_lib库

无法抽象代码

使用 Erlang 对.beam 分析
如果你希望分析 .beam 文件中的代码,可以使用 Erlang 的 beam_lib 模块来反编译 .beam 文件。反编译后的代码可以作为源代码提供给 SonarQube 进行分析。
步骤:
- 使用
beam_lib:chunks/1等函数反编译.beam文件。 - 获取
.beam文件的源代码,转化为 Erlang 源代码格式(.erl)。 - 将反编译的
.erl文件提供给 SonarQube 进行分析。

原因:
1.beam文件无抽象代码
2.elixir编译运行的时候进行crypt
操作:
elixir 或 erlang 或其它运行在 beam vm 上的语言,都会被编译成 .beam 文件。那么能否通过这些文件重建 erlang 代码呢?答案是可以的。
1 | |
代码释义:
1.从命令行获取 .beam 文件的路径。
2.读取 .beam 文件内容。
3.使用 :beam_lib.chunks/2 提取出 .beam 文件的抽象代码(abstract_code)。
4.将抽象代码格式化为 Erlang 源代码。
5.将生成的 Erlang 源代码写入新的 .erl 文件中。
将上面的代码保存为 beam2erl.exs 文件。
然后我们随便找一个 elixir 文件, 比如:
1 | |
将其编译,然后把对应的 beam 文件复制到beam2erl.exs的目录下,再执行:
$ elixir beam2erl.exs Elixir.Demo.beam
就能看到生成了一个.erl文件,内容是:
1 | |
上面的一大串是模块中内置的函数,最后一行是我们代码的内容。
有了这个小脚本,学习和调整包含复杂的 elixir 宏的代码,就方便多了。
可以整理成一个函数
1 | |
BeamAnalyzer
https://github.com/joeyates/beam_analyzer/tree/master
简介
beam_analyzer是一个专门用于分析Erlang和Elixir语言编写的BEAM模块的工具库。BEAM是Erlang虚拟机(ErlangVM)的缩写,它允许Erlang和Elixir编写的程序在虚拟机上运行。Erlang和Elixir都是高级编程语言,它们以其并发处理、容错和分布式计算的特性而闻名。
作用:
- 将 .beam 文件中的字节码反汇编成可读的汇编语言或伪代码
2.控制流和调用图分析
3.提取.beam中的常量池数据
4.对.beam直接进行静态分析
BeamAnalyzer库实现了几个核心功能:
- functions/1: 这个功能可以列出模块中所有的公共函数和私有函数。公共函数是那些可以被模块外调用的函数,而私有函数通常只能在定义它们的模块内部被调用。
- exports/1: 此功能专注于列出模块中所有的公共函数。在Erlang和Elixir中,公共函数构成了模块的公开接口,对于其他模块或者用户来说,是用于交互和实现功能的主要手段。这使得开发者能够清晰地识别出模块对外提供的服务。
- private_functions/1: 相对于公共函数,此功能列出了模块内所有的私有函数。私有函数的存在通常用于模块内部的逻辑处理,例如辅助公共函数执行任务,或是实现模块内部使用的工具方法。虽然它们不是模块外部接口的一部分,但对于理解模块的内部工作原理以及维护和测试非常重要。
- function/3: 它将任意指定函数的所有子句作为抽象语法树(Abstract Syntax Tree,AST)的形式返回。在编译过程中,源代码被转换成AST,它是源代码的抽象化表示,用树状数据结构表示编程语言的语法和结构。通过查看函数的AST,开发者能够深入理解函数的实现细节,以及编译器是如何处理特定代码段的。这对于调试复杂的代码和性能优化特别有用。
由于BeamAnalyzer是用Elixir编写的,它还具有Elixir语言的一些特性,比如模式匹配和管道操作符,这使得它在处理Elixir代码时更加自然和高效。同时,Elixir语言的并发和分布式计算特性也使得在分析过程中可以更好地理解并发模块的行为。