2016-04-26 139 views
0

我还在学习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] 

回答

0

的功能有以下几个部分:

  1. 商店注册到stacj和(奇怪的是,没有恢复)
  2. 加载到R0的地址GLOBAL_OFFSET(一旦添加了PC),实际访问__stack_chk(当添加到GLOBAL_OFFSET时)。这是以一种非常奇怪的方式完成的。
  3. __stack_chk加载数据,并将其
  4. 加载存储在堆栈中R0的值的sub_637D0,通过1做乘法这是由该函数返回的值。

所以在我看来,这似乎并没有做什么有用的东西......

+1

“这是由函数返回值” - 它没有返回任何东西,它做一个奇怪的跳转_to_'sub_637D0 ',这几乎肯定是一个反汇编器生成的符号,表示0x637cc处的mov pc,r0之后的下一条指令。让我想知道'mov r0,#1'是否打算做hotpatched,或者它只是世界上最少优化的单项跳转表。无论哪种方式,我们只能想知道函数的其余部分是什么样的...... – Notlikethat

+0

我想我已经找到了函数的其余部分。没有必要怀疑了^^。顺便说一句,谢谢你的回答。 –