iOS逆向安防从入门到秃头--反盗版防御

小谷秃头合集服务器

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

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

  • 小谷今天说下防盗版

1. 检查 BundleID

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

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

  • 直接上代码了加密

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

2. 检查重签名

钉钉好像是用到这个了。spa

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

  • 若是应用被重签名,帐户的前缀 UUID会不同。因此咱们能够经过这种方法检查重签名code

我估计兄弟们都玩过这个orm

  • 因为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. 总结

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

  • 但愿能够和兄弟们共同探讨技术!😆,而后,小谷去加班了~

相关文章
相关标签/搜索