我想问一下,制作 Linux 可执行文件使用什么类型的编码,例如十六进制、二进制还是其他。如何转换?有没有办法从这个可执行文件中恢复原始代码?
这是我的一些代码:
ELF���������>�����%|�����@�������������������@�8��@���������������������@�������@�����7<�����7<������� ������������������f�����f���������������������� ������[�UPX!L
h�h�8����������?�E�h=��ڊ̓�N� 4���9ISloB�q�w�]ȉ.��,ς��Q䝦����#e��-�N����/�b,���d<��'��-E��6E�s�/�U���ly�V�Y2]"a��S�.�hU�|�S�J�I�2���X}
�G0�;���5d�$���.)
这是什么意思?
答案1
它是二进制的。源代码已经编译。您可以在编辑器中查看它(十六进制编辑器bless
可能会进行更精细的更改),但您确实需要知道自己在做什么。它可能只适合进行字符串更改。
对于更复杂的问题,你可以开始对二进制文件进行逆向工程集会代码。这通常被认为是最低级别的人类可解析的计算机语言。
objdump -d helloworld | less
但它也会包含很多编译器的废话。例如,如果你编译最简单的helloworld.cpp
用 G++ 再用objdump
它,你最终会得到 226 行(去掉 208 行)的令人讨厌的代码。你可以仅用 15 行汇编代码就能写出“hello world”,对其进行编译,objdump
但仍有 166 行(剥离)。
如果你对汇编足够了解,这可能会给你足够的权限来了解正在发生的事情,甚至让你改变它......但回答你最初的问题:
您无法将编译后的代码重新转换为原来的源代码。
抱歉。这是单向转换,会丢失信息(注释、格式、可读算法概念等),与其他内容静态链接,并且通常经过优化,以至于除了最优秀、最有经验的程序员之外,其他人都无法理解。
为了让你了解问题的规模,逆向工程软件的整个概念已经它有自己的 Stack Exchange 网站。
答案2
我的声誉点数不足以发表评论,因此这是一个答案:
不,不可能将其转换回“原样”。你提到了 upx 打包程序,你看过 upx 的手册吗?
如果您丢失了源代码,或者无法访问其他人的代码,这没关系,因为这根本不可能。
二进制可执行文件是用编译器生成的,不要相信本网站上的任何内容,只需阅读该编译器的手册即可。然后,您可以在此处添加原始代码是用什么语言编写的,使用了哪个编译器,然后您可能会注意到这些步骤(预处理、编译、链接、可能打包)并不是整体上颠倒的,而只能分析原作者的意图和写作方式。
答案3
这可能是一个二进制文件(ELF 文件),如下面描述的:
https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
如果您使用普通文本编辑器对其进行了修改并保存了更改,那么这不是一个好主意,而且您可能会毁掉它。
答案4
如果您谈论的是已编译的程序,则可执行文件通常是二进制的。您可以使用 查找更多信息file path/to/executable
。您可以使用 eg 以十六进制显示二进制可执行文件hexdump -C path/to/executable | less
(无论这对您有什么好处)。如果您想“将其转换回其原始形式”,则必须使用适当的反编译器参见这篇文章,例如,但这会给你非常难以阅读的代码,而不是编译后的原始代码。如果它不是编译后的二进制文件,那么它应该是某种可执行脚本,应该很容易在任何文本编辑器中读取。你在这里展示的可能是编译后的可执行文件。ELF 表示“可执行和链接格式”,这是 Linux/Unix 系统上常见的二进制格式。strings path/to/executable
如果这是你需要的,可以使用 从二进制文件中提取可读的字符串部分。