gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:22:40 27 4
gpt4 key购买 nike

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

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

如果有人能给我任何指示如何执行此操作或从哪里开始,我将不胜感激!

谢谢

最佳答案

以下是获取文件的已编译 Erlang 源代码的方法。我认为不可能找回原始的 Elixir 源,因为它根本不存在于脚本中;只有编译后的 Erlang 字节码是。如果您了解一些 Erlang,则反编译的 Erlang 代码应该具有相当的可读性(如果不了解,请查看 this 快速 Erlang <-> Elixir 速成类(class))。

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

关于elixir - 获取 escript 可执行文件的源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43515205/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com