需要帮助了解ARM功能

时间:2016-04-26 03:21:50

标签: arm

我还在学习ARM,我无法理解这个函数应该做什么。

你能帮我解释一下它是如何运作的吗?

.text:0006379C           EXPORT _nativeD2AB
.text:0006379C           _nativeD2AB
.text:0006379C           var_28          = -0x28
.text:0006379C
.text:0006379C           STMFD           SP!, {R4-R11,LR}
.text:000637A0           SUB             SP, SP, #0x3A4
.text:000637A4           STMFA           SP, {R0-R3}
.text:000637A8           LDR             R0, =(_GLOBAL_OFFSET_ - 0x637B8)
.text:000637AC           LDR             R1, =(__stack_chk - 0x134EAC)
.text:000637B0           ADD             R0, PC, R0 ; _GLOBAL_OFFSET_
.text:000637B4           LDR             R0, [R1,R0] ; __stack_chk
.text:000637B8           LDR             R0, [R0]
.text:000637BC           STR             R0, [SP,#0x3C8+var_28]
.text:000637C0           MOV             R0, #1
.text:000637C4           ADR             R1, sub_637D0
.text:000637C8           MUL             R0, R1, R0
.text:000637CC           MOV             PC, R0
.text:000637CC           ; End of function _nativeD2AB

.got:00134EAC _GLOBAL_OFFSET_TABLE_ DCD 0 

.got:00134B0C                 AREA .got, DATA
.got:00134B0C __stack_chk DCD __stack_chkA

找到剩下的功能。如果我理解其中的一些,它似乎在扰乱数据,尽管这可能只是一个疯狂的猜测:

.text:000637D0 sub_637D0
.text:000637D0                 MOV             R0, #1
.text:000637D4                 ADR             R1, sub_637E0
.text:000637D8                 MUL             R0, R1, R0
.text:000637DC                 MOV             PC, R0
.text:000637DC ; End of function sub_637D0

.text:000637E0 sub_637E0
.text:000637E0
.text:000637E0 arg_14          =  0x14
.text:000637E0
.text:000637E0                 STR             R2, [SP,#arg_14]
.text:000637E4                 MOV             R0, #1
.text:000637E8                 ADR             R1, loc_637F4
.text:000637EC                 MUL             R0, R1, R0
.text:000637F0                 MOV             PC, R0
.text:000637F0 ; End of function sub_637E0

.text:000637F4 loc_637F4
.text:000637F4                 STR             R2, [SP,#0x28]
.text:000637F8                 STR             R0, [SP,#0x18]
.text:000637FC                 MOV             R1, #2
.text:00063800                 STR             R2, [SP,#0x1C]
.text:00063804                 STR             R0, [SP,#0x20]
.text:00063808                 STR             R0, [SP,#0x24]

1 个答案:

答案 0 :(得分:0)

该功能有几个部分:

  1. 将寄存器存储到stacj并保留空间(奇怪,未恢复)
  2. GLOBAL_OFFSET的地址(一旦添加了PC)加载到R0,以实际访问__stack_chk(当添加到GLOBAL_OFFSET时)。这是以一种非常奇怪的方式完成的。
  3. 将数据加载到__stack_chk并将其存储在堆栈中
  4. 通过乘以1将sub_637D0的值加载到R0。这是函数返回的值。
  5. 所以在我看来,这似乎没有做任何有用的事情......