函数跳转分析

             __cxa_atexit@PLT:        // __cxa_atexit
00005414         add        ip, pc, #0x0, #0xc                                  ; 0x541c, CODE XREF=dword_58ac+36, _Z32jsb_init_file_operation_delegatev+116
00005418         add        ip, ip, #0x1e000
0000541c         ldr        pc, [ip, #0xa60]!

             __cxa_atexit@GOT:        // __cxa_atexit

00023e7c         dd         0x000242c4   

反编译工具,反编译出某段代码。 

ip 是 内部过程调用寄存器

pc 是程序寄存器

add 语法

ADD{S}{cond} {Rd}, Rn, Operand2
ADD{cond} {Rd}, Rn, #imm12 ; Thumb, 32-bit encoding only
add        ip, pc, #0x0, #0xc   //ip = pc
add        ip, ip, #0x1e000   //ip = ip + 0x1e000

ldr pc, [ip, #0xa60]! // ip = ip + 0xa60; pc = *(int*)ip;
当执行到第一个add的时候, pc的值为0000541c, 因为pc始终指向当前执行指令+8。   
官网原话:在执行期间,PC不包含当前执行指令的地址。当前执行指令的地址通常是ARM的PC-8或Thumb的PC-4。

#0xc 是add语法外的东西,可能反编译器显示的问题。

第一个add执行完之后 ip = 0000541c
当执行到第二个add的时候,ip = 0000541c, 执行完之后 ip = 0002341c

当执行到第3个指令ldr的时候,
ip = 0002341c; 执行完之后 pc = 0x000242c4, ip=0023e7c;

此时开始执行0x000242c4
位置的代码

原文地址:https://www.cnblogs.com/dzqdzq/p/13581184.html