diff --git a/src/compile/utBeamToSrc.erl b/src/compile/utBeamToSrc.erl index baa7a5d..bb0a6d0 100644 --- a/src/compile/utBeamToSrc.erl +++ b/src/compile/utBeamToSrc.erl @@ -3,6 +3,8 @@ -export([ genSrc/2 , genSrcs/2 + , notCan/2 + , reToDir/2 ]). %% 通过beam生成erl文件,生成的beam编译选项必要带debug_info才能反编译生成代码 @@ -23,28 +25,69 @@ genSrc(Module, SrcDir) -> %% 通过beam生成erl文件,生成的beam编译选项必要带debug_info才能反编译生成代码 genSrcs(BeamDir, SrcDir) -> - FunRead = + FunDeal = fun(File, ProAcc) -> - case filename:extension(File) == ".beam" of - true -> - ModName = filename:basename(File, ".beam"), - Module = list_to_atom(ModName), - case beam_lib:chunks(code:which(Module), [abstract_code]) of - {ok, {_, [{abstract_code, {_, AC}}]}} -> - Code = erl_prettypr:format(erl_syntax:form_list(AC)), - %% 如果代码中有unicode码 需要下面的函数转换一下 第二个函数效率更高 - %% SrcStr = io_lib:fwrite("~ts~n", [erl_prettypr:format(erl_syntax:form_list(AC))]), - SrcBin = unicode:characters_to_binary(Code), - file:write_file(lists:concat([SrcDir, Module, ".erl"]), SrcBin), - io:format("build beam:~p to erl:~p success.~n", [Module, Module]); - {error, beam_lib, Reason} -> - io:format("code_gen_erl_file error, reason:~p~n", [Reason]); - _Err -> - io:format("code_gen_erl_file error, reason:~p~n", [_Err]) - end, + ModName = filename:basename(File, ".beam"), + Module = list_to_atom(ModName), + case beam_lib:chunks(code:which(Module), [abstract_code]) of + {ok, {_, [{abstract_code, {_, AC}}]}} -> + Code = erl_prettypr:format(erl_syntax:form_list(AC)), + %% 如果代码中有unicode码 需要下面的函数转换一下 第二个函数效率更高 + %% SrcStr = io_lib:fwrite("~ts~n", [erl_prettypr:format(erl_syntax:form_list(AC))]), + SrcBin = unicode:characters_to_binary(Code), + file:write_file(lists:concat([SrcDir, Module, ".erl"]), SrcBin), + io:format("build beam:~p to erl:~p success.~n", [Module, Module]); + {error, beam_lib, Reason} -> + io:format("code_gen_erl_file error, reason:~p~n", [Reason]); + _Err -> + io:format("code_gen_erl_file error, reason:~p~n", [_Err]) + end, + ProAcc + end, + filelib:fold_files(BeamDir, "\\.beam$", true, FunDeal, []). + +%% 将不能反编译的beam文件复制到指定的目录 +notCan(BeamDir, SrcDir) -> + FunDeal = + fun(File, ProAcc) -> + ModName = filename:basename(File, ".beam"), + Module = list_to_atom(ModName), + case beam_lib:chunks(code:which(Module), [abstract_code]) of + {ok, {_, [{abstract_code, {_, _AC}}]}} -> ProAcc; + {error, beam_lib, Reason} -> + io:format("code_gen_erl_file error, reason:~p~n", [Reason]), + file:copy(File, lists:concat([SrcDir, ModName, ".beam"])); + _Err -> + io:format("code_gen_erl_file error, reason:~p~n", [_Err]), + file:copy(File, lists:concat([SrcDir, ModName, ".beam"])) + end, + ProAcc + end, + filelib:fold_files(BeamDir, "\\.beam$", true, FunDeal, []). + +%% 将反编译的文件根据最前面的-file信息 重新复制到正确的目录 +reToDir(SSrcDir, DSrcDir) -> + FunDeal = + fun(File, ProAcc) -> + case file:read_file(File) of + {ok, <<"-file(", _/binary>> = BinStr} -> + case binary:split(BinStr, <<"-module">>) of + [AllFileInfo, _] -> + FileInfo = binary:replace(AllFileInfo, [<<" ">>, <<"\n">>, <<"\"">>], <<"">>, [global]), + [_, LeftFileInfo] = binary:split(FileInfo, <<"(">>), + [DirInfo, _] = binary:split(LeftFileInfo, <<",">>), + FileDir = filename:join(DSrcDir, DirInfo), + filelib:ensure_dir(FileDir), + {ok, _} = file:copy(File, FileDir), + ok; + _ -> + ProAcc + end; _ -> ProAcc end end, - filelib:fold_files(BeamDir, "\\.beam$", true, FunRead, []). \ No newline at end of file + filelib:fold_files(SSrcDir, "\\.erl$", true, FunDeal, []). + +%% 还可以根据反编译的内容恢复头文件 暂时没这个需求 \ No newline at end of file diff --git a/src/docs/EnDeCrypto b/src/docs/EnDeCrypto new file mode 100644 index 0000000..fe5d9c9 --- /dev/null +++ b/src/docs/EnDeCrypto @@ -0,0 +1,41 @@ +#!/usr/bin/env escript +%% -*- erlang -*- +main([EnOrDe, Key, InFileName, OutEnFile]) -> + crypto:start(), + io:format("~p~n", [{EnOrDe, Key, InFileName, OutEnFile}]), + case file:read_file(InFileName) of + {ok, SrcData} -> + IV = <<88:128>>, + KeyBin = fixKey(Key), + {IsEn, DealData} = case EnOrDe of "en" -> {true, SrcData}; _ -> {false, base64:decode(SrcData)} end, + EnData = crypto:crypto_one_time(aes_128_cbc, KeyBin, IV, DealData, IsEn), + LastData = case EnOrDe of "en" -> base64:encode(EnData); _ -> EnData end, + case OutEnFile of + "" -> + io:format("~s the file result:~ts ~n", [EnOrDe, LastData]); + _ -> + file:write_file(OutEnFile, LastData) + end, + halt(0); + _ -> + io:format("bad file:~ts ~n", [InFileName]), + halt(1) + end. + +fixKey(Key) -> + KeyBin = list_to_binary(Key), + KeySize = bit_size(KeyBin), + case KeySize >= 128 of + true -> + io:format("too len key max len is 128, in put len:~p ~n", [KeySize]), + halt(1); + _ -> + FixLen = 128 - KeySize, + <<0:FixLen, KeyBin/binary>> + end. + + + + + +