可以将所有程序转换为汇编吗?

时间:2011-02-16 13:29:23

标签: assembly disassembly

假设我们有一个exe,可以很容易地转换为汇编吗?软件作者是否有办法阻止/阻止这种情况?

5 个答案:

答案 0 :(得分:6)

没有。程序只有在能够理解的情况下才能由您的系统运行;如果它理解它,它可能在机器码中,可以直接转换为汇编。

你可以做的是尝试使用代码混淆方法,以使反汇编的二进制文件尽可能难以理解。

http://en.wikibooks.org/wiki/X86_Disassembly/Code_Obfuscation

编辑:想要补充一点,当然,随着时间和足够的资源,有人最终会弄清楚如何阅读你的混淆代码。这是不可避免的。混淆的做法是尽可能使你的工作逆向工程变得不方便,使它不值得花时间去追求它,所以只有那些想要对其进行逆向工程的人才会这样做。

答案 1 :(得分:4)

可执行文件被设计为由计算机处理器执行(因此名称)。汇编语言是计算机处理器执行的机器代码之上的一层。如果您的程序可以作为机器代码运行,那么它可以作为程序集读取。

您可能会遇到这样的情况:正在向客户端分发专有的C / C ++编写程序。一些客户不太诚实,他们将程序反编译为汇编,更改一些指令(例如那些阻止恶意使用程序,无限延长程序试用功能的指令),然后重新编译程序。

在这种情况下或类似情况下,您必须意识到所有未执行的程序都只是磁盘上的数据。任何人都可以阅读该数据并根据自己的喜好进行更改。如果这确实是一个问题,那么您将不得不想出另一种方法来保护您的程序:例如,将重要的逻辑委托给执行它的Web服务并发回结果。一个例子:谷歌的搜索算法在他们自己的网络服务器上运行 - 没有人确切知道它是如何工作的。

答案 2 :(得分:2)

总之,没有。就像你无法阻止某人阅读和分析你给他们的书一样。

答案 3 :(得分:2)

如果通过“转换”你的意思是编译,并且你的意思是编译成机器代码,是的,绝对。在任何盒子上运行的每一段代码都作为机器代码运行。对于任何特定语言,答案会根据是否存在创建不需要语言运行时库的独立可执行文件的工具而有所不同。

如果通过“转换”表示在汇编中手动编码,请参阅其他答案。我们不这样做,因为编写代码需要很长时间。

至于混淆,我在第一段中提到的转换/编译并不适用于此。当你“编译”像Java或C#这样的东西时,源代码会转换成很多指向运行时库的指针。这些指针可以很容易地进行逆向工程,并重新生成原始代码。

答案 4 :(得分:1)

我认为马拉纳斯到目前为止对此有最好的答案,但我想补充一点,我认为你可以在某些条件下拆解程序。首先想到这一点,如果它实际上是可执行的,意味着可以由处理器执行,那么绝对可以完全以与处理器相同的方式解析该二进制文件,这意味着您可以解析每个位和字节并将其转换为成为人类可读的形式ascii /汇编程序。如果可以执行程序,这总是可行的。

现在,如果您拥有的是.exe文件,那么有什么东西可以阻止它工作吗?当然,很多东西和maranas的答案与其中一些相关联,例如加密,如果加密的密钥是在硬件或用户密码或.exe文件中未包含的内容中,您可能无法弄清楚它是游戏结束。

在编写反汇编程序的多年中,我看到了不同的技巧,有时是故意的,有时不是。例如,如果您阅读Michael Abrash的Zen of Zen,我似乎相信在8088/86中有关于预取器的讨论,讨论是将一个处理器告诉另一个处理器的方式(记住这是在缓存之前),而且也是打败黑客。你可以做的例如是有一条指令修改下一条指令,增加就可以了。这将完美地执行,因为第二条指令已被提取并且在管道中,因此修改的指令仅在内存中,未修改的指令将被执行。当然,这需要是在ram中修改该指令时只运行一次的代码。这样做特别阻止了人们通过调试器单步执行代码,因为调试器会执行修改后的指令并崩溃或执行类似的操作。如果您的反汇编程序试图模拟程序并且没有考虑硬件再次运行的方式,那么您将被引入杂草。我还看到使用say加载一个立即为零的寄存器,然后是一个分支,如果为零,这与无条件分支相同(假设寄存器真的不需要为零),请遵循一些数据,导致反汇编程序被绊倒。您需要使用可变字长指令集才能使其正常工作。人类不难弄清楚发生了什么,并且手动调整反汇编过程以避免数据字不是指令,但对于自动化工具(不是模拟器)则更难。技巧列表一直在继续......

最重要的是,如果您的程序可以由处理器执行,那么绝对可以将机器代码转换回人类可读的汇编程序表单。是的,你可以做的事情,特别是使用秘密或对反汇编程序只看可执行文件不明显的硬件功能,可以并且将防止反汇编。与任何安全措施一样,如果用户可以对物品进行物理访问,他们可能会将其击败,如果他们能够在硬件上运行程序,则他们可能会破坏您的安全措施并对其进行反汇编。