我知道有很多关于方法混淆的资源。但是是否可以从私有API中混淆方法?问题在于没有头文件。我想从PrivateFramework中的私有类(例如(随机示例)Message.framework方法)混淆一个方法。
这是为了个人测试,我知道它会被苹果拒绝。
这是为了个人测试,我知道它会被苹果拒绝。
NSClassFromString
来获取 Class
,然后使用运行时库执行方法交换。不需要头文件,您只需要知道类名和方法签名。@selector(somePrivateMethod)
时出现错误,指出 somePrivateMethod
不是有效的选择器(因为头文件不可用),可以使用 sel_getUid
。SEL sel = sel_getUid("codeDiagnosticsAtLocation:withCurrentFileContentDictionary:forIndex:");
Class IDEIndexClangQueryProviderClass = NSClassFromString(@"IDEIndexClangQueryProvider");
Method method = class_getInstanceMethod(IDEIndexClangQueryProviderClass, sel);
IMP originalImp = method_getImplementation(method);
IMP imp = imp_implementationWithBlock(^id(id me, id loc, id dict, IDEIndex *idx) {
id ret = ((id (*)(id,SEL,id,id,id))originalImp)(me, sel, loc, dict, idx);
// do work
return ret;
});
method_setImplementation(method, imp);
+[load]
中。 - Bryan Chen[IDEIndexClangQueryProviderClass codeDiagnosticsAtLocation:0 withCurrentFileContentDictionary:0 forIndex:NULL]
?这只是一个例子。除非你也在编写Xcode插件,否则它不会起作用。你应该将类名、选择器名称和方法签名更改为iOS上存在的内容。 - Bryan ChenNSSelectorFromString()
来获取一个选择器,而不是使用sel_getUid
,以便在仍然绕过编译器检查的情况下抓取它。我发现NSSelectorFromString
更容易与Swift进行互操作。 - Charlton Provatas
class-dump
或class-dump-z
等工具。很多人已经将反向工程的头文件发布在网上。然后,将该头文件作为源文件包含在项目中即可。如果遇到反向工程的头文件无法编译的问题,通常只需要手动检查并删除不需要的#imports
,或者将头文件精简到只包含你感兴趣的函数即可。 - Nate