版权声明:本文为博主原创文章,未经博主允许不得转载
ios一种简单的方法加密
对于需要上线Appstore的项目,几乎很少会用到私有API,因为Appstore审核不会让你通过;
但是如果一旦需要用到私有API的话,那就蛋疼了;因为你要冒着项目被拒的风险。
而如果是直接在项目中使用私有API的话,是百分百会被拒的,那么怎么不直接私有API呢?
有几种方案觉得可行:
- 对方法名进行字符串混淆替换,这种方案比较简单,基本只要知道混淆的,或者知道字符串替换的就能搞定;
- 对字节进行拼接,之后再合成方法名,生成SEL;这种方法比较高级,你还可以在里面进行其他加密操作;
- 其他方案类似;
举个例子:
这是个简单加密后的recursiveDescription
字符串,是私有api,所以通过字符串拼接的方式生成selector
进行方法调用
//这种加密的方式目的是想绕过AppStore的审核,从而使用私有API
static unsigned char uiStackSelectorBinary[] = {0xcd,0xe4,0xde,0xd4,0xcd,0xce,0xd8,0xd1,0xe4,0xc3,0xe4,0xce,0xde,0xcd,0xd8,0xcf,0xd3,0xd8,0xda,0xd9};
unsigned char selector[128] = {0};
for(int i = 0; i < sizeof(uiStackSelectorBinary); i++) {
unsigned char c = uiStackSelectorBinary[i]; //变成ASCII码
selector[i] = (c-0xa5)^0x5a;
}
SEL sel = NSSelectorFromString([NSString stringWithUTF8String:(char *)selector]);
当然,这两种方案本人都没有试过,哈哈!
彩蛋:
在这里我是假设Appstore的审核机制:
- 直接扫描项目字符串,然后和私有API的库进行对比,发现存在使用私有API,直接打回原形
- 如果对比之后没有发现,则在运行时检测,在方法缓存hashtable中检测,是否使用私有API
对于第二步,只有在运行到那段代码处,才有可能会被检测出来,如果没有运行到该私有API的代码处,则有可能检测不出来;这也是本人觉得上述方案可以绕过审核的原因;
当然以上都是本人猜测;如有错误,纯属瞎编,娱乐一下就好。
主要是提供一种混淆代码的方法供大家参考,还可以玩出很多花样来哦。