我做了一个xcode项目,我做了一些安全性的东西,他们让我混淆方法名称
喜欢这样
#define specialMethod a9328238
+(void) specialMethod
{
// do security stuff
}
我从项目(项目A)创建了一个.framework库,并将其包含在另一个项目(项目B)中。
但是当我使用Release构建配置运行(项目B)时,它总是像这样崩溃。
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[SecurityClass a9328238]: unrecognized selector sent to class 0x337cc4'
因此在尝试访问该方法时会崩溃。
但是当我运行(项目B)时,它使用Debug构建配置,它运行顺畅
(我将所有构建配置设置保留为默认值)
答案 0 :(得分:7)
您在哪里放置#define
进行混淆?是在框架文件(.h
)中还是在框架的实现文件(.m
)中?
要使混淆有效,必须将其放在实现和调用者都包含的文件中。
您还可以通过检查预处理文件来检查预处理是否正常。选择实施文件并转到菜单Product > Generate Output > Generate Preprocessed File
(您可以选择屏幕底部的配置)。
答案 1 :(得分:2)
我的预感也是#define
位置/可见度。
但你可能想从另一个角度考虑这个问题。你可以改变:
#define specialMethod a9328238
+(void) specialMethod
{
// do security stuff
}
为:
@interface SecurityClass : NSObject
// private obfuscated interface:
+ (void)a9328238;
// {
// do security stuff in a9328238's definition
// }
@end
// here is the public interface:
static inline void SecurityClass_LogIn() {
[SecurityClass a9328238];
}
完全放弃#define
。
使用中:
SecurityClass_LogIn();
…
由于这是一个类方法,因此您可以编写一个包含在人类可读内联中的混淆函数。精心设计的C实现将比objc更难分开。
更完整的例子可以帮助我们缩小可能性。
同时验证没有警告 - 如果您调用了未声明的选择器,编译器可能会发出警告。调用该方法的可能性是#define
在其他情况下不可见。
答案 2 :(得分:1)
似乎导入混淆框架的可执行文件试图访问非混淆的方法。
您应该检查框架中的符号。在框架中的静态库上使用nm
来查看导出的符号(标记为“t”)。确保符号被混淆。
答案 3 :(得分:1)
如果您已将所有内容都包装到框架中,您是否确保在框架外部公开了相应的标头?框架内的标头不会像普通文件那样暴露。转到项目 - >构建阶段,在右下角,您会看到“添加复制标题”。这将在您的构建阶段添加一个新部分。在此部分中,单击“+”和定义方法名称的标题。