从 .beam 文件生成 Erlang 源文件

逆向工程 反编译 二郎
2021-06-10 23:17:35

我有要反编译的 Erlang 应用程序的梁文件。

应用程序使用“debug_info”选项编译和构建。这是用于构建应用程序的 emake 文件片段:

{"apps/my_app/src/*",   [debug_info, nowarn_export_all, {outdir, "apps/my_app/ebin"},{pa, "deps"},{parse_transform, lager_transform}, {parse_transform, events_transform}]}.

我已经尝试过来自 beam_lib 模块的函数,但得到以下错误:

1>{ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(abc,[abstract_code]).
** exception error: no match of right hand side value {error,beam_lib,{not_a_beam_file,'abc.beam'}}

我还尝试了以下帖子中提到的解决方案,即在没有 debug_info 的情况下编译的反编译 erlang .beam 文件, 但它对我不起作用。我收到以下错误:

1> file:write_file("/tmp/my_module_disasm", io_lib:fwrite("~p.\n", [beam_disasm:file(abc)])).
ok

/tmp/my_module_disasm 文件包含:

{error,beam_lib,{not_a_beam_file,'abc.beam'}}.

有人有想法吗?

1个回答

您是否尝试过使用recon:source/1我认为它正是你所需要的。如果你不想使用它,至少你可以从它的源代码中获得灵感

-spec source(module()) -> iolist().
source(Module) ->
    Path = code:which(Module),
    {ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Path, [abstract_code]),
    erl_prettypr:format(erl_syntax:form_list(AC)).