iOS汇编代码中字符串格式化的变量定位方法问询
iOS反汇编中格式化字符串变量定位方法(基于Hopper)
先看你提供的代码片段:
r0 = [var_60 myCustomString]; r0 = [r0 retain]; r22 = [[NSString stringWithFormat:@"%@%@%@"] retain]; [r0 release];
一、查找另外两个变量的方法
iOS采用的ARM汇编中,Objective-C方法的参数传递规则是:
- r0 = self(类方法里对应类对象,这里是NSString)
- r1 = SEL(即
@selector(stringWithFormat:)) - r2 = 第一个参数(这里是格式字符串
@"%@%@%@") - 后续参数依次通过r3、栈内存传递(超过r3的参数会被push到栈上)
按照这个规则,你可以在Hopper里做这些操作:
- 查看
stringWithFormat:调用前的上下文,找对r3寄存器的赋值操作,r3对应的就是第二个参数(第一个%@); - 找调用前的栈push指令(比如
push {r4, r5}这类),栈中第一个被push的值是第三个参数(第二个%@),第二个值是第四个参数(第三个%@); - 直接切换到Hopper的伪代码视图,反编译后的代码会直接列出
stringWithFormat:的完整参数列表,能直观看到另外两个变量的来源。
二、确定myCustomString的占位符位置
代码里的r0是myCustomString的引用,且调用后被release,说明它是三个参数之一,判断位置看它被放到了哪个参数位:
- 如果调用前有
mov r3, r0,说明它被放到r3,对应第一个%@; - 如果调用前有
push {r0},且是栈中第一个被push的参数,对应第二个%@; - 如果是栈中第二个被push的参数,对应第三个
%@; - 伪代码视图会直接给出明确答案,比如伪代码显示
stringWithFormat:@"%@%@%@", varA, var_60.myCustomString, varB,就能直接看到它对应第二个占位符。
内容的提问来源于stack exchange,提问作者MillerMedia
相关产品推荐
相关产品推荐

