Linux 可执行文件中使用的代码转换类型

red*_*ief 13 iptables command-line compiling executable 14.04

我想问一下使用什么类型的编码来制作 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?$???.)
Run Code Online (Sandbox Code Playgroud)

它是什么意思?

Oli*_*Oli 29

它是二进制的。源代码已经编译完成。您可以在编辑器中查看它(十六进制编辑器bless可能会进行更精细的更改),但您确实需要知道自己在做什么。它可能仅适用于进行字符串更改。

对于更硬核的内容,您可以开始将二进制文件逆向工程为汇编代码。这通常被认为是人类可解析的最低级别的计算机语言。

objdump -d helloworld | less
Run Code Online (Sandbox Code Playgroud)

但它也会包含很多编译器的废话。例如,如果您使用 G++编译最简单的helloworld.cpp代码,然后编译objdump它,您最终会得到 226 行(删除 208 行)。你可以只用 15 行汇编编写一个“hello world”,编译它,objdump但它仍然会变成 166 行(被剥离)。

如果你对汇编足够好,这可能会让你有足够的机会了解正在发生的事情,甚至让你改变它......但要回答你最初的问题:

您无法将编译后的代码转换回原始源代码。

对不起。这是一种单向转换,会丢失信息(注释、格式、可读算法概念等),与其他事物静态链接,并且通常以这样的方式进行优化,除了最好和最有经验的程序员之外,任何人都无法理解它。

为了让您了解问题的规模,逆向工程软件的整个想法都有自己的 Stack Exchange 站点

  • 查看我最近的编辑。没有回到原始来源。通过大量的学习和大量的时间,您可能能够*基于*反汇编的汇编代码重写源代码,但在大多数情况下,它会更便宜(除非您的时间一文不值)并且更容易重写它划痕。 (7认同)

小智 7

我没有足够的声望点来发表评论,所以这是一个答案:

不,不可能将其“返回”。你提到upx packer,你有没有看过upx的手册?

如果您丢失了源代码,或者无法访问其他人的代码,这里都无所谓,这根本不可能。

二进制可执行文件是用编译器生成的,不要相信本网站上的任何内容,只需阅读该编译器的手册即可。然后,你可以在这里添加,原始代码是用什么语言编写的,使用的编译器,然后你自己可能会注意到这一步(预处理,编译,链接,也许打包)作为一个整体不是颠倒的,而只能分析原作者可能的意图和写作。