美文网首页
iOS 给APP安全升级

iOS 给APP安全升级

作者: 浮生随笔 | 来源:发表于2019-11-04 00:03 被阅读0次

    检测设备是否越狱

    + (BOOL)isJailBreak {
        if ([[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app"]){
            return YES;
        }
    
        if ([[NSFileManager defaultManager] fileExistsAtPath:@"/Library/MobileSubstrate/MobileSubstrate.dylib"]){
            return YES;
        }
    
        if ([[NSFileManager defaultManager] fileExistsAtPath:@"/bin/bash"]){
            return YES;
        }
    
        if ([[NSFileManager defaultManager] fileExistsAtPath:@"/usr/sbin/sshd"]){
            return YES;
        }
    
        if ([[NSFileManager defaultManager] fileExistsAtPath:@"/etc/apt"]){
            return YES;
        }
        if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]]) {
            return YES;
        }
        return NO;
    }
    
    

    检测设备网络环境是否开启代理

    NSDictionary *proxySettings = (__bridge NSDictionary *)(CFNetworkCopySystemProxySettings());
    NSArray *proxies = (__bridge NSArray *)(CFNetworkCopyProxiesForURL((__bridge CFURLRef _Nonnull)([NSURL URLWithString:@"https://www.baidu.com"]), (__bridge CFDictionaryRef _Nonnull)(proxySettings)));
    
    NSLog(@"\n%@",proxies);
    NSDictionary *settings = proxies[0];
    NSLog(@"%@",[settings objectForKey:(NSString *)kCFProxyHostNameKey]);
    NSLog(@"%@",[settings objectForKey:(NSString *)kCFProxyPortNumberKey]);
    NSLog(@"%@",[settings objectForKey:(NSString *)kCFProxyTypeKey]);
        if ([[settings objectForKey:(NSString *)kCFProxyTypeKey] isEqualToString:@"kCFProxyTypeNone"])
        {
            NSLog(@"kael 没代理");
        }
                                                                                                         else
        {
            NSLog(@"kael 设置了代理");
        }
    
    

    APP 禁止动态调试

    #import <UIKit/UIKit.h> 
    #import "AppDelegate.h"  
    #import <dlfcn.h>
    
    typedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data);
    #if !defined(PT_DENY_ATTACH)
    #define PT_DENY_ATTACH 31
    #endif  // !defined(PT_DENY_ATTACH)
    
    void disable_gdb() {
      void* handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW);
      ptrace_ptr_t ptrace_ptr = dlsym(handle, "ptrace");
      ptrace_ptr(PT_DENY_ATTACH, 0, 0, 0);
      dlclose(handle);
    }
    
    int main(int argc, char * argv[]) {
    #ifndef DEBUG
        disable_gdb();
    #endif
        @autoreleasepool {
            return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        }
    }
    
    

    如果你在Xcode调试环境下,去掉#ifndef DEBUG #endif这句话,你会发现,Xcode无法调试该应用;因为动态的加载了ptrace,然后给传输的宏是PT_DENY_ATTACH 拒绝附加进程

    代码混淆 脚本

    代码混淆相关 参考文章

    TABLENAME=symbols
    SYMBOL_DB_FILE="$PROJECT_DIR/CodeObfuscation/symbols"
    STRING_SYMBOL_FILE="$PROJECT_DIR/CodeObfuscation/func.list"
    HEAD_FILE="$PROJECT_DIR/CodeObfuscation/codeObfuscation.h"
    export LC_CTYPE=C
    
    #维护数据库方便日后作排重
    createTable()
    {
    echo "create table $TABLENAME(src text, des text);" | sqlite3 $SYMBOL_DB_FILE
    }
    
    insertValue()
    {
    echo "insert into $TABLENAME values('$1' ,'$2');" | sqlite3 $SYMBOL_DB_FILE
    }
    
    query()
    {
    echo "select * from $TABLENAME where src='$1';" | sqlite3 $SYMBOL_DB_FILE
    }
    
    ramdomString()
    {
    openssl rand -base64 64 | tr -cd 'a-zA-Z' |head -c 16
    }
    
    rm -f $SYMBOL_DB_FILE
    rm -f $HEAD_FILE
    createTable
    
    touch $HEAD_FILE
    echo '#ifndef Demo_codeObfuscation_h
    #define Demo_codeObfuscation_h' >> $HEAD_FILE
    echo "//confuse string at `date`" >> $HEAD_FILE
    cat "$STRING_SYMBOL_FILE" | while read -ra line; do
    if [[ ! -z "$line" ]]; then
    ramdom=`ramdomString`
    echo $line $ramdom
    insertValue $line $ramdom
    echo "#define $line $ramdom" >> $HEAD_FILE
    fi
    done
    echo "#endif" >> $HEAD_FILE
    
    sqlite3 $SYMBOL_DB_FILE .dump
    
    

    相关文章

      网友评论

          本文标题:iOS 给APP安全升级

          本文链接:https://www.haomeiwen.com/subject/zgqrbctx.html