【问题标题】:Arm Instructions [closed]手臂说明[关闭]
【发布时间】:2014-09-07 08:43:44
【问题描述】:

我想在这里询问手臂指令中发生了什么。我了解 ASM,但我很难理解 ARM。我尝试在互联网上查找提供基础知识的信息,但我正在查看的内容有点不同。所以这是我试图理解的代码..你能解释一下这些说明在做什么吗?我会标记那些我不明白的。它是来自 IDA 的代码。有人可以解释整个功能。我将不胜感激。谢谢

LDR             R3, =(unk_E9BFB0 - 0x6B1B4C)  //This once,i dont get it, is it subtracting?
LDR             R8, [R5]
MOV             R1, R6
ADD             R3, PC, R3
LDR             LR, [R4,#0xC]  //This instruction
LDR             R12, =(aDraw_debug - 0x6B1B68) //This once
MOV             R2, R7
STR             R8, [R3,#0x30]
MOV             R0, R3
STR             R4, [R3]
ADD             R12, PC, R12 ; "draw_debug"  //This once 
STR             R3, [R5]
STR             R12, [R3,#0x2C]
ADD             R12, LR, #1
STR             R12, [R4,#0xC]
BL              __aeabi_atexit

【问题讨论】:

  • 你试过ARM的website吗?
  • "有人能解释一下整个函数吗?"简而言之,没有。 a)它显然不是一个“整个函数”,因为最后没有返回,b)它是一系列指令,读取一些内存地址,计算一些偏移量,并写入一些内存地址 - 我非常怀疑任何人都可以解释 为什么没有比在这里重现更多的上下文。

标签: android assembly arm reverse-engineering


【解决方案1】:

LDR 是 ARM 上的指令,用于从内存中加载具有值的寄存器。不过下面是LDR的伪指令形式:

LDR             R3, =(unk_E9BFB0 - 0x6B1B4C)  //This once,i dont get it, is it subtracting?
LDR             R12, =(aDraw_debug - 0x6B1B68) //This once

我相信它正在从代码位置构造一个偏移量,以将数据拉出.text 部分。例如,aDraw_debug - 0x6B1B68 可能会获取标签aDraw_debug 的地址,并减去某些指令的位置0x6B1B68。

最终结果是,这基本上会将aDraw_debug 的偏移量(从任意点)加载到R12 中。同样,另一条指令会将unk_E9BFB0 加载到R3 中。由于名称错误,那可能是编译器生成的数据。

另一条LDR指令:

LDR             LR, [R4,#0xC]  //This instruction

是一个简单的事情。 LDR 仍在用于从内存中加载寄存器,但寻址方式不同。在这种情况下,链接寄存器LR 正在加载内存中地址R4 + 0xC 的数据。

ADD 也很简单,我不确定您是否对它在做什么感到困惑,但是:

ADD             R12, PC, R12 ; "draw_debug"  //This once 

这只是添加PC + R12 并将其存储在R12 中,而不更新处理器标志。这采用之前确定的偏移量并将其应用于当前的PC。

总的来说,这看起来像是将值存储到某种struct 或class 中的代码。编译器选择进行 PC 相对寻址,但偏移量可能超出指令的可用范围。 PC 相关的LDR/STR 指令只能从PC 寻址+/- 4096。

【讨论】:

    【解决方案2】:

    ldr reg,=something 是一个快捷方式。 arm 是一个主要是固定长度的指令集,或者可以说没有足够的位来允许任何可能的立即值。此快捷方式还允许您使用标签,将某些标签的地址加载到此寄存器中。汇编器对此所做的事情是,当它生成机器代码时,它会在不远且不在执行路径中的某个位置(例如在无条件分支或 bx 之后)分配一个字位置。然后对于 ldr reg,= 指令,它编码一个 pc 相关指令 ldr reg,[pc,+offset] 以将该值加载到寄存器中。这允许加载任何 32 位值,没有任何限制。它还允许在链接器稍后填写数据值(地址)的地方使用标签。您的示例更进一步并在标签上进行数学运算,因此汇编器或链接器必须解析标签,进行数学运算,然后将该值放入单词位置。

    【讨论】:

      【解决方案3】:
      猜你喜欢
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 2013-02-05
      • 2015-01-24
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多