Need help decompiling .beam file

This is the code you have, what should I change?

defp do_decompile(beam_code) do
    {:ok, {_, [abstract_code: {_, ac}]}} =
      :beam_lib.chunks(beam_code, [:abstract_code])

    :erl_prettypr.format(:erl_syntax.form_list(ac))
  end

I’m not sure what you mean - that code from decompilerl depends on the existence of the Abst chunk in the BEAM file it’s used on. If the chunk isn’t there, it’s not going to work.

Each step of the compilation process drops information that’s not important to it, so the process isn’t 100% reversible - for instance, decompilerl uses local variables like _@4 because the original names are not present in the AST.

The Code chunk throws away more information - for instance, the Abst chunk contains AST for "populate a record named :holiday_info" in a function like list_open_total:

list_open_total() ->
    [#holiday_total{id = 104,
                    name = lang:get(<<"HĐ Gộp SV"/utf8>>), type = 2,
                    start_time = {merge_day, 1},
                    end_time = {merge_day, 56, 86399}, status = 1,
                    is_show = 1},
     #holiday_total{id = 103,
                    name = lang:get(<<"HĐ Mở SV"/utf8>>), type = 1,
                    start_time = {open_day, 1},
                    end_time = {open_day, 56, 86399}, status = 1,
                    is_show = 1}].

The corresponding BEAM code from the Code section is “desugared”: the record syntax is shorthand for building a tuple that starts with {:holiday_total, ...:

   {:function, :list_open_total, 0, 2,
    [
      {:label, 1},
      {:line, 1},
      {:func_info, {:atom, :holiday_role_data}, {:atom, :list_open_total}, 0},
      {:label, 2},
      {:allocate_zero, 1, 0},
      {:move, {:literal, "HĐ Gộp SV"}, {:x, 0}},
      {:line, 2},
      {:call_ext, 1, {:extfunc, :lang, :get, 1}},
      {:move, {:x, 0}, {:y, 0}},
      {:move, {:literal, "HĐ Mở SV"}, {:x, 0}},
      {:line, 3},
      {:call_ext, 1, {:extfunc, :lang, :get, 1}},
      {:test_heap, 28, 1},
      {:put_tuple, 11, {:x, 1}},
      {:put, {:atom, :holiday_total}},
      {:put, {:integer, 103}},
      {:put, {:x, 0}},
      {:put, {:integer, 0}},
      {:put, {:literal, {:open_day, 1}}},
      {:put, {:literal, {:open_day, 56, 86399}}},
      {:put, {:integer, 1}},
      {:put, {:integer, 0}},
      {:put, {:integer, 0}},
      {:put, {:integer, 1}},
      {:put, {:integer, 1}},
      {:put_list, {:x, 1}, nil, {:x, 1}},
      {:put_tuple, 11, {:x, 2}},
      {:put, {:atom, :holiday_total}},
      ...

Hello, well, I don’t understand much since I’m new to this, but from what I understand your message is that when compiling the file, it loses some codes and doesn’t compile 100% since it eliminates unnecessary code, but I don’t understand how to solve the other the problem, I tried @lud solution and it works perfectly but for most of the files I used the steps indicated, I created a new file with mix new project and I followed the steps and it worked, but some files throw me the error that I mentioned above

It means that the BEAM file does not contain the part that would allow you to reconstruct the erlang representation of the source code. Basically you will not be able to generate a .erl file from those files unfortunately.

Maybe there is a way to generate Erlang Code from BEAM instructions but I do not know.

Damn, what bad news, possibly on the part of erlang it can be done but I already looked for many ways on google and I can’t find it. wait if any user can have the answer, thank you very much in the same way

looks like the github niahoo/decompilerl is no more there.
So its not possible to decompile beam files?

Not sure what you mean; this link works fine for me: GitHub - niahoo/decompilerl: Decompile Elixir modules to Erlang abstract code

FWIW, that’s a fork of GitHub - aerosol/decompilerl: Decompile Elixir modules to Erlang abstract code which appears to have been updated much more recently.

1 Like

niahoo is me. I forked the thing because I wanted to use it as a mix task, I do not remember why. It works just fine but yes, I should merge.

The best would be a tool with all the output formats as in GitHub - michalmuskala/decompile but with stdio output as a default and configurable output path as decompilerl does.

GitHub - michalmuskala/decompile can output Elixir code directly now, I guess it is the best tool for newcomers.

hi thx for the anwser.
But how to use this in description is only this

mix decompile ElixirModule --to erlang

But this not working.
And the other solustion with mix.exs
I change this

deps({:decompilerl, github: "niahoo/decompilerl"})

but not realy working get this error

:\testproject\myproject>mix run tt.exs > holiday_role_data.erl
warning: function deps/0 is unused
  mix.exs:23

** (CompileError) mix.exs:10: undefined function deps/1 (expected Myproject.MixProject to define such a function or for it to be imported, but none are available)

It should output an .erl file in the current working directory.

:\testproject\myproject>mix run tt.exs > holiday_role_data.erl
warning: function deps/0 is unused
  mix.exs:23

** (CompileError) mix.exs:10: undefined function deps/1 

How is your mix.exs file like? The deps({:decompilerl, github: "niahoo/decompilerl"}) is strange.

Generally you will have a deps: deps(), call in the project/0 function of the mix.exs file and dependencies defined like this:

  defp deps do
    [
      # ...
      {:decompilerl, github: "niahoo/decompilerl"}
    ]
  end

But you do not need the dependency in your project, you can just install the tool:

mix archive.install github niahoo/decompilerl
# or
mix archive.install github michalmuskala/decompile
2 Likes