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. 總結

  • 這幾種方法仍是比較流行的。兄得們能夠在項目中用起來試試

  • 但願能夠和兄弟們共同探討技術!😆,而後,小谷去加班了~

相關文章
相關標籤/搜索