iOS逆向安防从入门到秃头–反盗版防护

小谷秃头合集

有些app也会做反越狱操作防越狱插件

不过小谷觉得没有必要这么绝。毕竟人家是越狱手机的话,直接掐死就不太好了~

  • 小谷今天说下防盗版

1. 检查 BundleID

  • BundleID也称APPID,每个应用独一份(其实他的本名是文件ID

  • 兄弟们知道用MonkeyDev重签名的话,会更改BundleID

  • 直接上代码了

- (void)checkBundleId{
    NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary];
    NSString *bundleID = [infoDic objectForKey:@"CFBundleIdentifier"];
    
    if (![bundleID isEqualToString:@"服务器请求的bundleID"]) {
        //防护措施
        NSLog(@"防护措施");
    }
}
复制代码

2. 检查重签名

钉钉好像是用到这个了。

  • 检查重签名的原理:是检查权力配置文件embedded.mobileprovisionUUID账户的前缀

  • 如果应用被重签名,账户的前缀 UUID会不一样。所以我们可以通过这种方法检查重签名

我估计兄弟们都玩过这个

  • 由于embedded.mobileprovision不是标准的plist文件。所以我们要通过处理把他变成plist文件,然后在检测

上代码了

//检测重签名
- (BOOL)isResign{
    NSString * embedProPath = [[NSBundle mainBundle] pathForResource:@"embedded" ofType:@"mobileprovision"];
    
    NSError *error;
    NSString *embedProStr = [NSString stringWithContentsOfFile:embedProPath encoding:NSISOLatin2StringEncoding error:&error];
    
    if (embedProStr) {
        NSScanner *scanner = [NSScanner scannerWithString:embedProStr];
        
        NSString * contentStr;
        BOOL result = [scanner scanUpToString:@"<plist" intoString:&contentStr];
        
        if (result) {
            result = [scanner scanUpToString:@"</plist>" intoString:&contentStr];
            
            if (result) {
                //格式化字符串
                NSString *strPlist = [NSString stringWithFormat:@"%@</plist>",contentStr];
//                NSLog(@"plist --> %@",strPlist);
                
                //plist --> dic
                NSData * data = [strPlist dataUsingEncoding:NSUTF8StringEncoding];
                NSError *errordic;
                NSDictionary *dicPlist = [NSPropertyListSerialization propertyListWithData:data options:0 format:0 error:&errordic];
                //如果没有错误
                if (!error) {
                    //可以查看UDID和签名前缀
                    NSLog(@"dicPlist --> %@",dicPlist);
                    //UUID
                    NSString *UUIDStr = [dicPlist objectForKey:@"UUID"];
                    //签名前缀
                    NSArray *prefixArr = [dicPlist objectForKey:@"ApplicationIdentifierPrefix"];
                    NSString *appPrefix = [prefixArr firstObject];
                    
                    //判断 这里可以做一个服务器请求,具体判断根据自己的项目来!!
                    if ([UUIDStr isEqualToString:@"7a016e01-31c1-4f6e-bfee-998245a9063a"] && [appPrefix isEqualToString:@"9536852PXS"]) {
                        
                        //说明没有重签名
                        NSLog(@"没有重签名");
                        return false;
                    }else{
                        NSLog(@"重签名应用");
                        return true;
                    }
                    
                }
            }
        }
        return true;
    }
    return false;
}
复制代码
  • 给兄弟们看下dicPlist的打印

1.png

这个就可以防止重签名应用了

3. 检查来源(是否来自App Store)

  • 还有一种更帅气的检测。(偷偷的告诉兄弟们,这个小谷曾经在用,感觉不错~,不过我们公司的iOS包不好过审(什么版号的问题),然后小谷只能把这个去掉了~)

  • App Store下载的应用,在 loadCommand 中的 LC_ENCRYPTION_INFO_64段会有加密情况

  • 如果没有加密,一定不是从App Store下载的,或者逆向大佬操作过了

  • 给兄弟们对比下加密未加密

2.png

3.png

我们的砸壳,也会把这个值改掉

  • 大体的逻辑和判断兄弟们应该都知道了,那么,上代码(兄弟看过dyld源码或者fishhook的源码就比较好理解查找了~)
#include <execinfo.h>
#import <mach-o/ldsyms.h>

//是否是从App Store下载的(这里小谷只判断LC_ENCRYPTION_INFO_64,毕竟现在大多数都不主持32位了)
- (BOOL)isAppStore{
     const uint8_t *command = (const uint8_t *) (&_mh_execute_header + 1);
     for (uint32_t idx = 0; idx < _mh_execute_header.ncmds; ++idx)
     {
         if (((const struct load_command *) command)->cmd == LC_ENCRYPTION_INFO_64)
         {
             struct encryption_info_command *crypt_cmd = (struct encryption_info_command *) command;
              printf("crypt_cmd--cryptid,%d\n",(uint32_t)crypt_cmd->cryptid);
              
              if (crypt_cmd->cryptid == 0) return false;
              
              if (crypt_cmd->cryptid == 1) return true;
             
         }
         else
         {
             command += ((const struct load_command *) command)->cmdsize;
         }
     }
     return false;
}
复制代码

兄弟们可以试一下

4. 代码MD5对比

  • 这个就是和我原先博客写的代码签名原理差不多,就是把一块重要代码块,进行MD5比较

  • 如果有更改 –> MD5就会改变,做到防护的目的

5. 总结

  • 这几种方法还是比较流行的。兄得们可以在项目中用起来试试

  • 希望可以和兄弟们共同探讨技术!?,然后,小谷去加班了~

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享