汇编码理解求指点

小弟新手,刚开始学逆向,对于汇编码的理解还很浅薄,很简单的函数流程老是觉得理解不到位,请各位高手指点一下。。

在自己的ipad找了个游戏,用IDA分析了一些,下面是小弟的理解:

汇编码文本:

__text:00084E2C
__text:00084E2C                         ; =============== S U B R O U T I N E =======================================
__text:00084E2C
__text:00084E2C                                           ; SaveLayer - (int)rs_Gold
__text:00084E2C
__text:00084E2C                                           ; int __cdecl -[SaveLayer rs_Gold](struct SaveLayer *self, SEL)
__text:00084E2C                                           __SaveLayer_rs_Gold_                    ; DATA XREF: __objc_const:00123464o
__text:00084E2C    4E F6 6C 61 C0 F2 0A 01                        MOV             R1, #(_OBJC_IVAR_$_SaveLayer.rs_Gold - 0x84E38) ; int rs_Gold;
__text:00084E34    79 44                                                      ADD             R1, PC  ; int rs_Gold;
__text:00084E36    09 68                                                      LDR             R1, [R1] ; int rs_Gold;
__text:00084E38    40 58                                                      LDR             R0, [R0,R1]
__text:00084E3A    70 47                                                      BX              LR
__text:00084E3A                                          ; End of function -[SaveLayer rs_Gold]
__text:00084E3A
__text:00084E3C
__text:00084E3C                         ; =============== S U B R O U T I N E =======================================
__text:00084E3C
__text:00084E3C                                           ; SaveLayer - (void)setRs_Gold:(int)
__text:00084E3C
__text:00084E3C                                           ; void __cdecl -[SaveLayer setRs_Gold:](struct SaveLayer *self, SEL, int)
__text:00084E3C                                           __SaveLayer_setRs_Gold__                ; DATA XREF: __objc_const:00123470o
__text:00084E3C    4E F6 5C 61 C0 F2 0A 01                  MOV              R1, #(_OBJC_IVAR_$_SaveLayer.rs_Gold - 0x84E48) ; int rs_Gold;
__text:00084E44    79 44                                                ADD              R1, PC  ; int rs_Gold;
__text:00084E46    09 68                                                LDR              R1, [R1] ; int rs_Gold;
__text:00084E48    42 50                                                STR              R2, [R0,R1]
__text:00084E4A    70 47                                                BX                LR
__text:00084E4A                                            ; End of function -[SaveLayer setRs_Gold:]
__text:00084E4A

首先,根据你发的这两段代码,可以看出,[SaveLayer setRs_Gold:]和[SaveLayer rs_Gold]是rs_Gold这个property的accessor,所以要达到修改金钱的目的,应该是很简单的;
其实,你的疑问主要集中在这一部分:

__text:00084E3C    MOV              R1, #(_OBJC_IVAR_$_SaveLayer.rs_Gold - 0x84E48) ; int rs_Gold;
__text:00084E44    ADD              R1, PC  ; int rs_Gold;
__text:00084E46    LDR              R1, [R1] ; int rs_Gold;
__text:00084E48    STR              R2, [R0,R1]

我们一行一行地看:
MOV R1, #(OBJC_IVAR$_SaveLayer.rs_Gold - 0x84E48)
翻译成C,就是R1 = (OBJC_IVAR$_SaveLayer.rs_Gold - 0x84e48),这很明显是一个地址,即R1应该是个指针;

ADD R1, PC ; int rs_Gold
在ARM处理器中,PC指向的是当前指令下2条指令的地址,即这里的PC = 0x84e48。看到这里你或许已经明白了,R1 = R1 + PC = OBJC_IVAR$_SaveLayer.rs_Gold - 0x84e48 + 0x84e48 = OBJC_IVAR$_SaveLayer.rs_Gold;

LDR R1, [R1]
R1 = *(OBJC_IVAR$_SaveLayer.rs_Gold) = rs_Gold

STR R2, [R0,R1]
self->rs_Gold = R2

参考:IDA作者Igor Skochinsky对类似问题的解答

多谢指点,豁然开朗啊,多谢多谢