2017-04-20 61 views
3

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

万一它很重要,它被编译在Ubuntu 16.04上运行混合escript.build没有额外的参数。

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

谢谢

回答

3

下面是如何获得您的文件编译的Erlang源文件。我不认为有可能获得原始的Elixir源,因为它根本不存在于脚本中;只有编译的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([email protected]) -> 'Elixir.IO':inspect({[email protected], [email protected]}). 

这是Elixir的原始资料来源:

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

非常感谢,还有一些工作要做,但它是一个很好的基础,非常感谢! – mur762