获取escript可执行文件的源代码

时间:2017-04-20 09:15:14

标签: elixir decompiling

我错误地删除了我写的Elixir escript的源代码;作为最后的手段,我试图通过反编译我部署在服务器上的可执行文件来获取源代码(如果可能的话)。

如果重要的话,它是在运行mix escript.build的Ubuntu 16.04上编译的,没有额外的参数。

如果有人能给我任何指针如何做到这一点或从哪里开始,我将不胜感激!

由于

1 个答案:

答案 0 :(得分:3)

以下是如何获取文件的已编译Erlang源代码的方法。我不认为有可能将原始的Elixir源恢复,因为它根本不存在于escript中;只有编译好的Erlang字节码才是。如果你知道一些Erlang,反编译的Erlang代码应该是相当可读的(如果没有,请查看this快速Erlang< - > Elixir速成课程)。

escript可执行文件以#! /usr/bin/env escript开头,后跟一些行,然后嵌入的编译文件以二进制zip文件的形式出现。在编辑器中打开escript文件并删除所有内容,直到以PK开头的行(zip的开头)。

$ mix escript.build
$ head -c 59 m
#! /usr/bin/env escript
%%
%%! -escript main m_escript
PK
$ vim m # remove everything until `PK`
$ head -c2 m
PK

现在,您可以使用unzip提取文件的内容并获取所有已编译的.beam文件:

$ unzip m -d extracted
Archive:  m
  inflating: extracted/m_escript.beam
  inflating: extracted/Elixir.Version.Parser.DSL.beam
  inflating: extracted/Elixir.Kernel.LexicalTracker.beam
  inflating: extracted/Elixir.IO.ANSI.beam
  inflating: extracted/Elixir.Inspect.NaiveDateTime.beam
  inflating: extracted/Elixir.Protocol.beam
  inflating: extracted/Elixir.Inspect.Any.beam
  ...

最后,您可以使用decompile-beam

反编译所需的模块
$ decompile-beam extracted/Elixir.M.beam
-compile(no_auto_import).

-file("lib/m.ex", 1).

-module('Elixir.M').

-export(['__info__'/1, main/0, main/1]).

-spec '__info__'(attributes | compile | exports |
         functions | macros | md5 | module |
         native_addresses) -> atom() |
                      [{atom(), any()} |
                       {atom(), byte(), integer()}].

'__info__'(functions) -> [{main, 0}, {main, 1}];
'__info__'(macros) -> [];
'__info__'(info) ->
    erlang:get_module_info('Elixir.M', info).

main() -> main([]).

main(args@1) -> 'Elixir.IO':inspect({args@1, args@1}).

这是原始的Elixir来源:

$ cat lib/m.ex
defmodule M do
  def main(args \\ []) do
    IO.inspect {args, args}
  end
end