背景
因为苹果审核禁止调用私有方法,在开发过程中很多的有用的私有方法都不能直接使用。那有没有办法可以绕开苹果对私有方法的审核呢?
首先我们猜测下苹果的审核方式:
1、通过扫描二进制文件,mach-O都保存有所有的代码中的方法名字符串,如果直接明文调用私有方法,扫描二进制文件就会被发现。
2、通过运行时的方法调用检测,这种情况需要执行到对应代码才会被发现。(可以在审核界面把对应的代码屏蔽掉。)
实现
如果审核逻辑如上,我们只要将调用的方法名混淆下,在二进制文件扫描阶段就可以避免被扫描出来。
下面就介绍一种方法名加密混淆方法,字节加密。
要加密的方法名是 : test。
1、将方法名转换为char*字节,并把每个字节与一个字节(这里用0x55)进行亦或处理, 最后通过printf将转换后的字节打印出来。
NSString *method = @"test";
NSData *data = [method dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
char *bs = malloc(sizeof(char) * data.length);
memcpy(bs, data.bytes, data.length);
for (int i = 0 ; i< data.length; i++) {
char c = bs[i] ^ 0x55;
printf("0x%2x",c);
}
2、 然后我们代码中通过char数组保存转换后的字节信息,在使用时将其在转换成方法名字符串test。
static unsigned char selByte[] = {0x21,0x30,0x26,0x21};
char sel[5] = {0};
for (int i = 0; i< sizeof(selByte); i++) {
char b = selByte[i] ^ 0x55;
sel[i] = b;
}
NSString *selStr = [NSString stringWithCString:sel encoding:NSUTF8StringEncoding];
注:虽然我们可以使用这种方法避开以上两种苹果的审核,但是也应该尽量避免使用私有方法。我们无法保证那天苹果的审核会不会升级,增加什么新的审核逻辑。
本文作者: ctinusdev
原文链接: https://ctinusdev.github.io/2018/02/25/iOSPrivateMethodEncrypt
转载请注明出处!
网友评论