【问题标题】:Is there any way to move x86 machine code?有没有办法移动 x86 机器码?
【发布时间】:2014-06-02 22:19:28
【问题描述】:

假设我在地址X 有一小段机器代码,它是EXE (PE) 的一部分。它包含所有类型的指令,包括具有相对地址的指令。如何在不改变其行为的情况下将此代码移动到地址 Y?我不想编写自己的反编译器。也许是一些现有的库或技巧?

【问题讨论】:

  • 如果它是相对寻址的,那么它不应该关心它从哪里运行。所有地址都将与某个基地址相关。您需要弄清楚该基地址的存储位置,并用新的地址对其进行更新,其他一切都“正常工作”,因为它们正在进行“基地址 + x 字节”类型的计算。
  • 对,如果它们都是相对内存地址,它应该在你放置的任何地方运行。你的用例是什么? EXE 加载程序不是已经为您执行此操作了吗?或者您是否尝试编写另一种病毒,我将不得不清理我的计算机并向您发送损失时间的账单?
  • @RobertHarvey 我想在 exe 中制作钩子。在地址X处放置一个jmp,执行钩子,然后执行取自地址X但地址Y的原始代码。这是一款适用于 15 年前的电脑游戏的模组。

标签: windows assembly x86 exe machine-code


【解决方案1】:

在“旧学校”时代,标准做法是将代码保留在“x”处,将前几个字节(比如说是 3)替换为跳转到新代码。在新代码的末尾,您执行在“x”处替换的代码,然后跳回“x”+3

【讨论】:

  • 是的,但我只能替换没有相对地址的代码。
  • 根据您的 cmets 您不需要移动代码,@Marichyasana 提供的解决方案不会移动任何代码,它将现有代码中的弯路注入新代码,然后重新路由绕道完成后回到原来的位置。当然,您不需要重新路由回原来的例程,但您需要确保将堆栈和寄存器留在调用者的预期状态。
【解决方案2】:

通常是不可能的,但如果代码是经过仔细编写的,就会被遗忘。请参阅:position-independent code

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多