You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 11:50:19