erlang 编译后的文件极易被对方反编译得到源代码,
对编译后的源码进行加密后,可以起到防止反编译的目的。
下面是如何进行防止反编译的:(环境linux下)
1>在root目录下, 创建.erlang.crypt这个文件
2> 在 .erlang.crypt中加入[{debug_info, des3_cbc, [], "this_is_my_secret_key"}].
(des3_cbc的算法来对文件进行加密,加密的密钥为:this_is_my_secret_key)
3> 修改Emakefile
{
[
'src/*',
'src/*/*',
'src/*/*/*'
]
,[
encrypt_debug_info
,{i, "include"}
,{outdir, "ebin"}
]
}.
(注意的是encrypt_debug_info,不要用debug_info)
4>编译源文件
erl -make
5>测试加密
5.1、 [root@phyzhou]# erl -pa ./ebin
Erlang R14B (erts-5.8.1) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
5.2 、beam_lib:chunks(code:which(loop), [abstract_code]). (我随便写了一个叫loop.erl的测试模块)
{ok,{loop,[{abstract_code,{raw_abstract_v1,[{attribute,1,
file,
{"src/test/performance/loop.erl",1}},
{attribute,9,module,loop},
{attribute,10,compile,export_all},
{function,15,do_loop,2,
[{clause,15,[{nil,15},{var,15,'_Data'}],[],[{atom,15,ok}]},
{clause,16,
[{cons,16,{cons,16,...},{var,...}},{var,16,'Data'}],
[],
[{call,17,{...},...}]}]},
{function,19,do_loop2,3,
[{clause,19,
[{nil,19},{var,19,'_Data'},{var,19,'_X'}],
[],
[{atom,19,ok}]},
{clause,20,
[{cons,20,{cons,...},{...}},{var,20,'Data'},{var,20,...}],
[[{op,20,...}]],
[{call,21,...}]},
{clause,22,
[{cons,22,{...},...},{var,22,...},{var,...}],
[],
[{call,...}]}]},
{function,25,test,0,
[{clause,25,[],[],[{match,26,...},{match,...},{...}|...]}]},
{eof,36}]}}]}}
5.3 、退出(ctrl+c)
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
(v)ersion (k)ill (D)b-tables (d)istribution
5.4、移除 .erlang.crypt
5.5、[root@phyzhou]# erl -pa ./ebin
Erlang R14B (erts-5.8.1) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
5.6、beam_lib:chunks(code:which(loop), [abstract_code]).
{error,beam_lib,
{key_missing_or_invalid,"./loop.beam",abstract_code}}
6.总结:
从日志可以看出,移除.erlang.crype文件后,无法进行反编译。
7.谢谢。