`

erlang中通过debug_info还原源代码(转)

阅读更多


转自:http://www.phpx.com/index.php
具体网址忘记了。。。

源码:
-module(a).
 
-export([test/0]).
 
test() ->
  io:format("source code.~n", []).

带 debug_info 编译,并运行之。

$ erlc +debug_info a.erl
$ erl -s a test -s c q -noshell
source code.
$

我们可以这样还原它的源码:

$ erl
1>  {ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(code:which(a), abstract_code]).
{ok,{a,[{abstract_code,
            {raw_abstract_v1,
                [{attribute,1,file,{"./a.erl",1}},
                 {attribute,1,module,a},
                 {attribute,3,export,[{test,0}]},
                 {function,5,test,0,
                     [{clause,5,[],[],[{call,6,{remote,...},[...]}]}]},
                 {eof,7}]}}]}}
2> io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).
-file("./a.erl", 1).

-module(a).

-export([test/0]).

test() -> io:format("source code.~n", []).


ok
3>

既保留 debug_info 又阻止其他人通过 debug_info 来得到源码的办法:加密 debug_info
首先建立一个 ~/.erlang.crypt 文件,内容如下:

$ cat ~/.erlang.crypt
[{debug_info, des3_cbc, [], "my_source_code_secret_key"}].
这里的 “my_source_code_secret_key” 就被用来生成对 debug_info 加密的密钥。用 encrypt_debug_info 参数编译,并运行之。

$ erlc +encrypt_debug_info a.erl
$ erl -s a test -s c q -noshell
source code.

拿掉.erlang.crypt文件后仍然可以运行;并且使用之前的反编译方法失败:
$ erl
1>  beam_lib:chunks(code:which(a), [abstract_code]).
{error,beam_lib,
       {key_missing_or_invalid,"./a.beam",abstract_code}}

如果需要现场调试,就再加上~/.erlang.crypt 文件。此时也可以再次还原代码。

$ mv ~/.erlang.old.crypt ~/.erlang.crypt
$ erl
1>  {ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(code:which(a), abstract_code]).
{ok,{a,[{abstract_code,
            {raw_abstract_v1,
                [{attribute,1,file,{"./a.erl",1}},
                 {attribute,1,module,a},
                 {attribute,3,export,[{test,0}]},
                 {function,5,test,0,
                     [{clause,5,[],[],[{call,6,{remote,...},[...]}]}]},
                 {eof,7}]}}]}}
2> io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).
-file("./a.erl", 1).

-module(a).

-export([test/0]).

test() -> io:format("source code.~n", []).


ok
3>

 

分享到:
评论

相关推荐

    erlang语言实现binary_to_term完整代码

    erlang提供了binary_to_term 函数,用于把二进制数据转为原始的erlang数据。这个函数都是c实现的,这里用erlang语言实现了,很有参考价值,其他语言可以参考这个解析erlang二进制协议数据。配套文章地址...

    Erlang otp_src_20.3.tar.gz

    此压缩包`otp_src_20.3.tar.gz`包含了Erlang OTP 20.3的源代码,对于开发者来说,这意味着他们可以自定义编译和配置Erlang以适应特定的系统需求。这个版本的Erlang OTP是20系列的一部分,相较于早期版本,它可能包含...

    esl-erlang_23.0_windows_amd64.exe rabbitmq-server-3.8.4.exe

    esl-erlang_23.0和rabbitmq-3.8.4windows版本 直接下载安装...以及在path中设置ERLANG_HOME的bin目录 4. erlang安装后要检查能否编译成功一个helloworld文件。 5. rabbitMQ无法安装插件时非常有可能是erlang出问题了。

    erlang_otp_src_22.3.tar.gz

    在 `otp_src_22.3` 压缩包中,包含了 Erlang OTP 22.3 版本的源代码。要安装此版本,你可以按照提供的链接(https://blog.csdn.net/tangcv/article/details/111841082)中的说明进行操作。通常,这包括解压源码、...

    erlang otp_src_20.2.tar.gz

    在本场景中,"otp_src_20.2.tar.gz" 是Erlang OTP 20.2版本的源代码包,适用于安装和配置RabbitMQ 3.7.3,这是一个基于Erlang的开源消息代理,常用于实现消息队列和发布/订阅模式的通信。 安装Erlang OTP源码步骤...

    Erlang_x64_20.1

    在描述中提到,Erlang_x64_20.1是RabbitMQ环境配置必需的。RabbitMQ是一个开源的消息代理和队列服务器,它使用AMQP(Advanced Message Queuing Protocol)协议,允许应用程序之间异步传递消息。在部署RabbitMQ时,...

    Erlang_win64_24.1.rar

    标题中的"Erlang_win64_24.1.rar"是指Erlang的64位Windows版,版本号为24.1.7。这个压缩包文件是专为在Windows操作系统上安装和运行Erlang而准备的,包含了所有必要的二进制文件和库,使得开发者可以在Windows平台上...

    最新版 erlang安装包 otp_src_21.3.tar.gz

    Erlang是一种强大的编程语言,尤其在分布式计算、并发处理和实时系统中有着广泛的应用。OTP(Open Telecom Platform)是Erlang的核心组件,提供了一系列的库和设计原则,用于构建可靠、可扩展的系统。在Linux CentOS...

    esl-erlang_23.0_windows_amd64.exe

    这个erlang23.0版本,根据rabbitMQ官网的介绍,可以和下面这几个版本的rabbitMQ配合使用: 3.8.9 3.8.8 3.8.7 3.8.6 3.8.5 3.8.4 其他版本的rabbit,请移步其他资源下载

    erlang_otp_win64_25.0

    在"erlang_otp_win64_25.0"这个标题中,我们可以提取出几个关键点: 1. **Erlang**:这是一种函数式编程语言,以其在处理并发性和容错性方面的强大能力而闻名。Erlang的设计理念是让程序员能够轻松地构建能够并行...

    erlang_win64_22.0+rabbitmq3.8.2.rar

    标题中的"erlang_win64_22.0"指的是Erlang OTP(Open Telecom Platform)的第22.0版本,这个版本是为64位Windows操作系统设计的。OTP是Erlang的核心库,包含了大量用于构建可靠系统和网络服务的模块。 描述中提到,...

    Erlang_B_model.rar_Erlang B _Erlang B model_Wireless Handbook_e

    **Erlang B模型**是通信工程领域中的一个重要概念,特别是在无线通信系统设计中用于评估系统容量...通过深入研究"Erlang_B_model.pdf",读者可以更全面地了解这一模型的原理和应用,从而提升在通信工程领域的专业素养。

    Erlang-win64_20.1

    在Erlang的20.1版本中,开发者可能会遇到一些关键的更新和改进,比如更好的性能、新的编程特性以及对老版本中一些已知问题的修复。对于Erlang程序员来说,了解每个版本的变更日志是非常重要的,以便充分利用新功能并...

    Erlang_win64_24.2 64位 rabbitmq 必要环境

    标题“Erlang_win64_24.2 64位 rabbitmq 必要环境”暗示了我们讨论的是Erlang的特定版本——24.2,用于64位Windows操作系统,并且是运行RabbitMQ所必需的环境。RabbitMQ是一款开源的消息代理和队列服务器,它使用...

    erlang_otp_src_22.3.tar.gz+rabbitmq-server-3.8.3-1.el6.noarch.rpm.7z

    在给定的文件“erlang_otp_src_22.3.tar.gz”中,包含了Erlang OTP的源代码,版本为22.3。这个版本的发布通常会包含许多新特性、性能优化以及对已知问题的修复。源代码的获取对于开发者来说至关重要,因为这允许他们...

    Erlang程序设计].源代码

    通过学习并实践这个压缩包中的源代码,你将能够逐步掌握Erlang的核心概念和编程技巧,这对于想要构建高并发、高可用系统的开发者来说是非常有价值的。记得实践是学习编程的最好方式,尝试运行和修改这些源代码,看看...

    erlang_otp_win64_20.3.zip

    是erlang_otp_20.3 的win64安装包,内为exe文件,一路next即可安装完成 ...变量名为ERLANG_HOME,变量值为安装Erlang的路径(路径中不要包含bin目录) 2.将新建的系统变量添加在Path中:格式为%ERLANG_HOME%\bin

    Erlang-Formula.zip_Erlang B _Erlang-B_erlang_erlang B计算_erlang C

    在提供的 "Erlang Formula" 文件中,可能包含了用于计算这两种模型的代码或工具。这些工具可能支持大容量计算,意味着它们能够处理大量的数据输入,这对于大型通信网络的性能分析尤其有用。用户可以利用这些工具模拟...

    Erlang 安装包(otp_win32_R16B03-1.part2)

    Erlang 安装包(otp_win32_R16B03-1.part2)

    megaco_session-0.5.rar_erlang_erlang Megaco_megaco

    标题中的“megaco_session-0.5.rar”指的是一个压缩包文件,该文件包含了名为“megaco_session”的项目版本0.5的源代码。这个项目是关于Megaco协议的实现,而“Erlang”是用于开发这个实现的编程语言。Erlang是一种...

Global site tag (gtag.js) - Google Analytics