ARM反汇编 - 混淆了" LDR r7,[pc,#0x14]"

时间:2017-06-07 02:47:17

标签: arm

我正在尝试学习ARM程序集。我决定拆解"阅读"功能,这就是我得到的。从它的外观来看,似乎是使用R7寄存器作为系统调用号进行系统调用(svc#0)。

mov ip, r7            # save R7
ldr r7, [pc, #0x14]   # get system call number and put it into R7 ??
svc #0                # make system call
mov r7, ip            # restore R7
cmn r0, #0x1000
bxls lr
rsb r0, r0, #0        # R0 = 0
b #2976848216

我对它为什么加载系统调用号码感到有点困惑(" LDR r7,[PC,#0x14]")。这不就是在C代码中执行r7 = *(pc + 0x14)吗?我查看了其他可能也使用系统调用的函数(例如kill,wait等),它们使用了非常相似的约定(即LDR R7,[PC,#0x14])。

如果它有帮助,这是在Android上。

谢谢!

1 个答案:

答案 0 :(得分:1)

mov ip, r7            @# save R7
ldr r7, [pc, #0x14]   @# get system call number and put it into R7 ??
svc #0                @# make system call
mov r7, ip            @# restore R7
cmn r0, #0x1000       @
bxls lr               @
rsb r0, r0, #0        @# R0 = 0
.word 0x1234
.word 0xABCD

你几乎遗漏了最重要的部分,所以不得不即兴发挥

00000000 <.text>:
   0:   e1a0c007    mov ip, r7
   4:   e59f7014    ldr r7, [pc, #20]   ; 20 <.text+0x20>
   8:   ef000000    svc 0x00000000
   c:   e1a0700c    mov r7, ip
  10:   e3700a01    cmn r0, #4096   ; 0x1000
  14:   912fff1e    bxls    lr
  18:   e2600000    rsb r0, r0, #0
  1c:   00001234    andeq   r1, r0, r4, lsr r2
  20:   0000abcd    andeq   sl, r0, sp, asr #23

是的,它正在做你说它正在做的事情,它在进行系统调用之前在r7中加载了一些值,现在是什么价值为什么它使用pc相对负载(可能是一个不适合的常量)作为立即和/或链接时间解析的值而不是编译时间)并且不同的系统调用是否有不同的值,r7是否为参数?那么你没有提供足够的信息来讨论这个问题。一旦你有/看到那些信息,那么这些答案应该是非常明显的......如果这些是你的问题。