【发布时间】:2016-10-26 02:05:32
【问题描述】:
假设我制作了一个 C++ 程序并编译了它。现在你有了它的汇编代码。
那么,如果我使用asm()中的汇编代码,会得到完全相同的结果吗?
如果是,我们可以用它做什么?
【问题讨论】:
-
不会一样的。变量、过程和许多其他东西将被偏移量取代,代码可能会被优化等等。但你可以用它来改变流程或逻辑(就像病毒一样)。
-
那么,有的有,有的没有?
-
问题是 asm 不是重现程序所需的唯一东西。您还需要相同的部分、代码偏移量、链接...可能不包含在反汇编列表中。
-
发生了什么?
-
重新加载代码时,会处于不同的环境中,实际位置可能会有所不同。这意味着链接加载器将通过目标代码并为程序集跳转放置最终值。如果你重建代码,那么跳转目标(即跳转到while语句的末尾)可能会改变,如果你拉出的代码没有考虑到这一点,代码执行可能会变得不对齐,导致未定义的行为。汇编器和编译器通常会为我们处理这些问题。
标签: c++ assembly reverse-engineering disassembly