【问题标题】:Calculating JMP instruction's address计算 JMP 指令的地址
【发布时间】:2011-09-30 11:15:02
【问题描述】:

我正在尝试通过将函数的开头替换为应该导致我的函数的 JMP 指令来挂钩函数。但问题是我不知道如何计算 JMP 偏移来定位我的函数的地址。好吧,如果你在内存中向前跳转,我知道该怎么做(目标地址 - 当前地址),但我不知道当你在内存中跳转时如何确定它。

有人可以帮忙吗?

【问题讨论】:

    标签: assembly x86 memory-address


    【解决方案1】:

    只需使用负偏移量向后跳转。

    记住要考虑JMP 指令的大小。偏移量是相对于JMP 指令的结尾而不是开头。如果当前地址是您要写入 JMP 的位置,那么您需要 5+dest-current 的偏移量,因为 JMP 指令的大小加上偏移量(如果为 5 个字节)。

    【讨论】:

      【解决方案2】:

      这是您应该能够弄清楚的基本数学。 :)

      如果 JMP 前向是 Destination - Origin,那么 JMP 后向就是 Origin - Destination

      用简单的数字想一想:如果您想将 JMP 从 100 转发到 110,您的 JMP 将是 110 - 100 = 10。如果你想向后JMP 相同的数量,那就是100 - 110 = -10。

      【讨论】:

      • 不不,我当然知道如何向前跳。问题是,我不确定如何用十六进制计算和表示它。比如我想从地址1000跳转到2000,会是“E9 3E8”,但是如果我想从地址2000跳转到1000,会是什么呢?像“E9 FFFFFFFFFFFFFC18”这样可怕的东西?
      • 十六进制也不例外。把我的例子从100改成0x100,把110改成0x110,数学是一样的。
      • user972948:这没什么可怕的,它只是你想要的负偏移的二进制补码。
      【解决方案3】:

      相对跳转是有符号的,即使用符号位进行正负位移。绝对跳跃是绝对的,所以没关系。请参阅英特尔指令指南的第 2A 和 2B 卷。

      【讨论】:

        【解决方案4】:

        偷偷摸摸

        对函数上方的位置进行虚拟调用

         call location1
        
        
         .location1
         call location2
         .location2
         pop ax
         ret
         .yourfunction
        

        你现在在 ax 中有 location2 的地址

        将 3 加到 ax 上,你就有了函数的内存地址

        【讨论】:

          猜你喜欢
          • 2021-09-14
          • 1970-01-01
          • 2019-03-17
          • 2016-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-18
          相关资源
          最近更新 更多