gpt4 book ai didi

objective-c - ARM 汇编 (IOS) 中 Objective-C 选择器的偏移量

转载 作者:可可西里 更新时间:2023-11-01 04:27:55 25 4
gpt4 key购买 nike

我试图了解 IOS objective-C 消息调用是如何用 ARM 汇编语言实现的。查看 IDA 反汇编输出,我可以看到在调用 __obj_msgsend 之前将类和选择器引用插入寄存器。这是完全有道理的,但奇怪的是这些值有一个奇怪的偏移量。

selector ref = (selRef_arrayWithObject_ - 0x29B0) 
class ref = (classRef_NSArray - 0x29BC)

类 ref 中的 0x29BC 值似乎指向 __obj_msgsend 之后的指令,它具有一定的逻辑,但 0x29B0 选择器 ref 指向随机 MOVT 指令。更糟糕的是,对于每个选择器调用,此偏移量似乎都不同。

有谁知道这些偏移量是从哪里来的?为什么它们不直接引用指令的地址 + 8?

__text:00002998 E8 1F 01 E3                 MOV             R1, #(selRef_arrayWithObject_ - 0x29B0) ; selRef_arrayWithObject_
__text:0000299C 05 20 A0 E1 MOV R2, R5
__text:000029A0 00 10 40 E3 MOVT R1, #0
__text:000029A4 01 50 A0 E3 MOV R5, #1
__text:000029A8 01 10 9F E7 LDR R1, [PC,R1] ; selRef_arrayWithObject_ ; "arrayWithObject:"
__text:000029AC 74 00 02 E3 MOV R0, #(classRef_NSArray - 0x29BC) ; classRef_NSArray
__text:000029B0 00 00 40 E3 MOVT R0, #0
__text:000029B4 00 00 9F E7 LDR R0, [PC,R0] ; _OBJC_CLASS_$_NSArray
__text:000029B8 8C 05 00 EB BL _objc_msgSend

更新:这是另一种情况:

__text:00002744 50 12 02 E3                 MOV             R1, #(selRef_view - 0x2758) ;    selRef_view
__text:00002748 00 10 40 E3 MOVT R1, #0
__text:0000274C 00 50 A0 E1 MOV R5, R0
__text:00002750 01 10 9F E7 LDR R1, [PC,R1] ; selRef_view ; "view"


__objc_selrefs:000049A8 1A 39 00 00 selRef_view DCD sel_view ; DATA XREF: __text:000025F8o

多亏了 Igor 的解释,我明白了 0x2758 是从哪里来的,但是数学在这里不成立:selRef_view - 0x2758 = 0x49A8 - 0x2758 = 0x2250。但是第一条指令中的数据是 50 12,转换为 0x1250,比我预期的少 0x1000。有什么想法吗???

最佳答案

在 ARM 中,PC 值指向前面两个指令槽,即 . + 8 在 ARM 模式和 . + 4 在拇指模式。这就是“随机”值的来源。例如:

__text:000029A8 LDR R1, [PC,R1]

由于我们处于 ARM 模式,PC 值为 029A8 + 8 = 029B0。因此,此代码等效于 r1 = *(int*)(r1+0x29B0)。 IDA 提示我们 R1 加载了值 (selRef_arrayWithObject_ - 0x29B0),因此简化后我们得到 r1 = *(int*)(selRef_arrayWithObject_),这大概解析为字符串的地址(选择器)“arrayWithObject:”

关于objective-c - ARM 汇编 (IOS) 中 Objective-C 选择器的偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8973613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com