iOS私有方法加密混淆

背景

因为苹果审核禁止调用私有方法,在开发过程中很多的有用的私有方法都不能直接使用。那有没有办法可以绕开苹果对私有方法的审核呢?

首先我们猜测下苹果的审核方式:
1、通过扫描二进制文件,mach-O都保存有所有的代码中的方法名字符串,如果直接明文调用私有方法,扫描二进制文件就会被发现。
2、通过运行时的方法调用检测,这种情况需要执行到对应代码才会被发现。(可以在审核界面把对应的代码屏蔽掉。)

实现

如果审核逻辑如上,我们只要将调用的方法名混淆下,在二进制文件扫描阶段就可以避免被扫描出来。

下面就介绍一种方法名加密混淆方法,字节加密
要加密的方法名是 : test。

1、将方法名转换为char*字节,并把每个字节与一个字节(这里用0x55)进行亦或处理, 最后通过printf将转换后的字节打印出来。

1
2
3
4
5
6
7
8
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。

1
2
3
4
5
6
7
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
转载请注明出处!

坚持原创技术分享,您的支持将鼓励我继续创作!