我想向Backboardd注入一些函数,由于某些原因,我不能用plist来限制它,所以我想用“if”来确定它是否在Backboardd里面。我知道'Logos'我可以使用那样:
%ctor{ if (%c(SpringBoard)) { } }
但是没有Logos,我可以像下面这样做吗?它不起作用。
MSInitialize { if (objc_getClass("Backboardd")) { CFMessagePortRef local = CFMessagePortCreateLocal(NULL, CFSTR(MACH_PORT_NAME), messageCallBack, NULL, NULL); CFRunLoopSourceRef source = CFMessagePortCreateRunLoopSource(NULL, local, 0); CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode); } }
答案 0 :(得分:3)
一般来说,你需要找到一些obj-c类,它对你所挂钩的东西是唯一的。理想情况下,它应该在二进制文件中定义类,而不是从框架导入。例如,在SpringBoard中有SpringBoard
类只能在SpringBoard的二进制文件中找到。如果objc_getClass("SpringBoard")
返回非NULL值,那么你就在SpringBoard中。
现在,背板。我在这样的情况下正在做的是在我的PC上复制二进制文件并使用class-dump或IDA获取该二进制文件中所有类的列表。如果是背板,那么好的候选人将是BKApplication
。所以
if (objc_getClass("BKApplication")) {
...
}
会做这个工作。在backboardd中没有Backboardd
类。
就未来而言,使用更受欢迎的标签来解决这类问题。如果您使用jailbreak
或iphone-privateapi
代码,则可以更好地获得答案。