- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
从 objc 源代码我们可以看到 SEL
被定义为 typedef struct objc_selector *SEL;
我用 idaq 反汇编了我的 dylib ,我确实调用了 _MSHookMessageEx
函数,从 libsubstrate.dylib 链接
_MSHookMessageEx
具有以下签名
void MSHookMessageEx(Class class, SEL selector, IMP replacement, IMP *result);
所以我们可以假设在源代码中有类似@selector(someMethod:)
的东西第二个参数
在目标文件的数据部分,我可以看到源代码中使用的所有 CFString
但是这里没有任何选择器字符串,所以我们可以看到 @selector()
没有转换成静态的 CFString
我很想找到传递给 _MSHookMessageEx
函数的选择器和类的字符串表示形式。
如何从目标文件 (Mach-o) 中获取 SEL (@selector())? SEL 如何存储在 Mach-o 中?
谢谢!
更新:
我确实发现在调用之前在 ida 方法表示中有一些字符串方法
我想有些选择器会传递给函数。我说得对吗?
最佳答案
选择器名称存储在 __TEXT
段的 __objc_methname
部分:
:; otool -v -s __TEXT __objc_methname /System/Library/Frameworks/AppKit.framework/AppKit | head
/System/Library/Frameworks/AppKit.framework/AppKit:
Contents of (__TEXT,__objc_methname) section
0x000000000097cbd8 count
0x000000000097cbde countByEnumeratingWithState:objects:count:
0x000000000097cc09 alloc
0x000000000097cc0f initWithObjects:count:
0x000000000097cc26 release
0x000000000097cc2e autorelease
0x000000000097cc3a copy
0x000000000097cc3f timeIntervalSinceNow
指向选择器的指针存储在 __DATA
段的 __objc_selrefs
部分:
:; otool -v -s __DATA __objc_selrefs /System/Library/Frameworks/AppKit.framework/AppKit | head
/System/Library/Frameworks/AppKit.framework/AppKit:
Contents of (__DATA,__objc_selrefs) section
0x0000000000d77d80 __TEXT:__objc_methname:initWithObjects:count:
0x0000000000d77d88 __TEXT:__objc_methname:copy
0x0000000000d77d90 __TEXT:__objc_methname:timeIntervalSinceNow
0x0000000000d77d98 __TEXT:__objc_methname:sharedAppleEventManager
0x0000000000d77da0 __TEXT:__objc_methname:_prepareForDispatch
0x0000000000d77da8 __TEXT:__objc_methname:_setLaunchTaskMaskBits:
0x0000000000d77db0 __TEXT:__objc_methname:_disableSuddenTermination
0x0000000000d77db8 __TEXT:__objc_methname:_appleEventActivationInProgress
源代码中的 SEL
实际上(当前)是指向选择器的 C 字符串名称的指针。所以如果你这样写:
SEL s = @selector(initWithObjects:count:);
那么 s
实际上是一个 char const *
,它指向字符串 initWithObjects:count:
。直到最近,您还可以通过执行以下操作来打印选择器名称:
NSLog(@"selector is %s", (char *)s);
但是,Apple 更改了编译器(我相信从 Xcode 4.6 开始)以禁止将 SEL
转换为 char *
,因此他们可能会更改选择器实现 future 。
无论如何,棘手的部分是机器代码使用 PC 相对寻址从 __objc_selrefs
部分加载指针。 PC 是“程序计数器”,它是当前正在执行的指令的地址。在 x86 架构上,它通常称为 IP(指令指针)或 EIP(扩展 IP)。
这就是你的反汇编的相关说明中发生的事情:
1444 LDR R1, =(off_2038 - 0x145C)
...
1454 LDR R1, (PC,R1)
指向选择器的指针是从地址 0x2038 处的字加载的。但是常量 0x2038 实际上并没有出现在机器代码中。通过分析程序的数据流,您的反汇编程序已帮助您计算出它。存储在第一个 LDR
指令中的常量实际上是 0xBDC,因为 0xBDC + 0x145C = 0x2038。
您可能想知道为什么当第二个 LDR
指令位于地址 0x1454 时它使用 0x145C。当 ARM 处理器使用 PC 相对寻址计算地址时,PC 的值实际上是当前正在执行的指令的地址加 4 或加 8(取决于处理器模式)。 This is documented here (可能还有其他地方)。
关于iphone - 如何从目标文件 (Mach-o) 中获取 SEL (@selector())? SEL 如何存储在 Mach-o 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15828329/
我已经使用它们很长一段时间了,但大多数时候,我更喜欢较短的,但是,我只是想真正深入了解本质细节。我可能一直在创建有错误的代码,并且我不想在网络上贡献和传播懒惰完成的代码。 所以,告诉我: What a
我似乎无法正常工作,我想检查是否选择了 AM-1 路线,然后是否也选择了值“1vlucht”并相应地更改 innerHTML。这可能吗?我也尝试过 && 但没有运气。 我什至不确定你是否可以为 1 个
您建议如何处理此错误? Actor 阵容是否必要第一名? - (NSMethodSignature*)methodSignatureForSelector:(SEL)selector { retu
从 objc 源代码我们可以看到 SEL 被定义为 typedef struct objc_selector *SEL; 我用 idaq 反汇编了我的 dylib ,我确实调用了 _MSHookMes
我有以下 XML 我确实从属性中获得了正确的值,但我想用新行将它们分开以进行进一步处理。 使用命令时 xmlstarlet sel -t -v "count(process/@id" "exa
我想将选择器添加到 NSMutableArray。但由于它们是不透明类型并且没有对象,所以这是行不通的,对吧?有我可以使用的包装对象吗?还是我必须创建自己的? 最佳答案 您可以将其包装在 NSValu
我正在尝试让另一个对象调用选择器。我试图通过定义选择器属性从另一个类定义这个选择器。它似乎没有像我预期的那样工作。 组合框.h @property (nonatomic) SEL onComboSel
当你只有一个 SEL 对象时,似乎应该有一种简单的方法来调用带有一些参数的选择器。我似乎找不到正确的语法。 -(MyClass*) init: (SEL)sel owner:(NSObject*) p
命令 $ xmlstarlet sel -t -c "/collection/record" file.xml 似乎在应用给定的 Xpath 表达式之前将整个文件加载到内存中。这不适用于大型 XML
我刚刚在在线教程中发现了以下内容。它显示 001 作为分配选择器的方法,但是我无法让它工作。我是否正确地认为 001 不对,002 是正确的方法,还是我对 001 做错了什么? // 001 SEL
带有选择标签的 HTML: ` 在 JavaScript 部分,我试图在选择下拉列表中添加选项,在循环中创建它们,将数组值分配给选项: var sel = document.getElementByI
我的 PHP 代码有问题。在前一页中,用户输入他们的用户名。现在,当他们提交表单时,用户名会发布并回显在当前页面上。 例如,如果教师输入“j.lu”作为用户名,它会在当前页面上发布“j.lu”。 但我
我只是好奇是否有办法动态提取 SEL 名称? 不确定如何提取 SEL,因为它是一个 typedef 结构。 谢谢。 最佳答案 请详细说明。但是,我相信您正在尝试将 SEL 转换为 NSString。如
我有一个来自字符串的 SEL。我可以使用“method_copyArgumentType”,这是一个运行时函数来获取每个参数的类型,就像这样 char *arguType = method_copyA
当我将一个选择器传递给我的方法时,我是否应该只保存它: -(void) setCallBack:(SEL) selectorToCall { self->mSelectorToCall = s
我最近阅读了由受人尊敬的 Bryan Oakley( Tkinter adding line number to text widget ) 撰写的答案,他在其中展示了有关解决问题的示例代码。 当我尝
我正在设置一个表格,格式如下。请原谅愚蠢的示例数据。所有这些实际上都是用 json 加载的,但输出如下所示: It was the best of times, it was the worst o
我有一个 appDelegate,它初始化了一个名为 LocationService 的类的实例。 我只想通过 init 传递给这个实例这个类将运行的方法。 我得到了这个异常(exception):
Perl-Selenium 还提供了 Test::More 的标准方法,例如 ok()、like()、is() 等,也作为对象方法,例如$sel->like()。 ($sel 是 selenium p
例如,我想跟踪发送到我的 canPeformAction 的操作,但它们数量太多,无法在调试器中通过“悬停”在每次出现时显示。因此,我想在我的测试周期后跟踪日志并检查它。 - (BOOL)canPer
我是一名优秀的程序员,十分优秀!