有人能解释一下这个 ARM 指令与实际的 Objective-C 代码相比是如何工作的吗?

逆向工程 拆卸 手臂
2021-07-04 15:49:35

我试图通过反编译我自己的 Objective-C 代码来了解它是如何工作的。这是反编译的指令:

var_8= -8
var_4= -4

SUB             SP, SP, #8
MOVS            R2, #1
STR             R0, [SP,#8+var_4]
STR             R1, [SP,#8+var_8]
MOV             R0, R2
ADD             SP, SP, #8
BX              LR

根据我的理解(如果我错了请纠正我),按行:

SP=SP-8
Move 1 to R2
Store R0 into SP+8+var_4
Store R1 into SP+8+var_8
Move R2 into R0
SP=SP+8
Next Function

和实际代码:

%hook SomeClass
- (int)somemethod {
return 1;
}
%end

现在,我不明白为什么它需要STR R0, [SP,#8+var_4]STR R1, [SP,#8+var_8]对,因为我看不到它的目的。如果我要return 0,简单地更改为MOVS R2, #1toMOVS R2, #0就可以了,不是吗?但这不起作用。

1个回答

Objective C 方法不是直接调用的,而是通过 ObjC 的运行时“objc_msgSend”函数中的一段蹦床代码调用,该函数反过来调用实现 ObjC 方法的常规 C 函数。

除了方法参数之外,C函数在前两个参数slows中还传递了两个额外的参数,分别是ARM上的R0和R1(参见此说明):

  • R0:“self”,对正在执行当前方法的实际对象的引用

在实例方法中,self 指的是调用该方法的消息的接收者(对象),而在类方法中,self 将指示调用的是哪个类。

  • R1:“_cmd”

这指向正在发送的选择器,在您的情况下,这应该指向字符串“somemethod”(或包含此字符串的结构,不确定当前的 ARM 实现)。