纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

IOS如何对app进行安全加固 浅谈IOS怎样对app进行安全加固

为童沉沦   2021-06-07 我要评论
想了解浅谈IOS怎样对app进行安全加固的相关内容吗为童沉沦在本文为您仔细讲解IOS怎样对app进行安全加固的相关知识和一些Code实例欢迎阅读和指正我们先划重点:IOS,app加固下面大家一起来学习吧

防止 tweak 依附

通常来说我们要分析一个 app最开始一般是砸壳

$ DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /path/to/XXX.app/XXX

然后将解密之后的二进制文件扔给类似 hopper 这样的反编译器处理直接将没有砸壳的二进制文件扔个 hopper 反编译出来的内容是无法阅读的(被苹果加密了)所以说砸壳是破解分析 app 的第一步对于这一步的防范有两种方式

1.限制二进制文件头内的段

通过在 Xcode 里面工程配置 build setting 选项中将

-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null

添加到 "Other Linker Flags"(注意这里我在项目中碰到了一个 问题在 iPod touch iOS 9.3 的设备上使用了 swift 的项目会导致莫名奇妙的 swift 标准库无法找到而在 iOS 10 的设备上没有这个问题之前并没有以为是因为添加了这个的原因直到网上搜了所有解决方案比如这个 SO Post 都没有效果的时候我才发现是这个设置的原因)

2.setuid 和 setgid

Apple 不接受调用这两个函数的 app因为它可以通过查看符号表来判断您的二进制运行文件是否包含这两个函数

检测越狱设备上是否有针对性 tweak

一般来说在越狱手机上我们会使用 TheOS 创建 tweak 类型的工程然后针对我们要分析的类使用提供的 logify.pl 命令生成的 mk 文件来打印该类所有方法的入参和出参这对分析 app 的运行方式有很大的帮助当然我们也可以自己创建某个类的 mk来 hook 某个函数让它以我们想要的方式运行比如说对于一些做了证书绑定的 app如果它用的框架是 AFNetWorking 的话那么我们可以创建一个 mk 文件hook AFSecurityPolicy 类的下列方法:

- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust forDomain:(NSString *)domain

让这个方法永远返回 YES那么大多数的应用所做的证书绑定也就失效了用过 TheOS 的 tweak 模版的话你会发现这种方式相当简单快速

对于这一步的防范可以在工程的 main 函数里面加入一层判断首先读取 /Library/MobileSubstrate/DynamicLibraries 下所有的 plist 文件的内容查看是否某个 plist 含有你的 app 的 bundle id是的话可以判定有人想利用 tweak 攻击你的 app这时候你可以采取比如说将 app 给 crash 掉或者限制某些功能等方式来应对

具体原理可以查看参考资料4简单来说就是 MobileSubstrate 在 app 加载到内存的时候会先去检查 /Library/MobileSubstrate/DynamicLibraries 下面是否有需要加载的 tweak有的话就加载怎么判断有没有?就是根据 plist 里面的 bundle ID 判断的

代码参考如下

static __inline__ __attribute__((always_inline)) int anti_tweak()
{
    uint8_t lmb[] = {'S', 'u', 'b', 's', 't', 'r', 'a', 't', 'e', '/', 'D', 'y', 'n', 'a', 'm', 'i', 'c', 0, };
    NSString *dir = [NSString stringWithFormat:@"/%@/%@%s%@", @"Library", @"Mobile", lmb, @"Libraries"];
    NSArray *dirFiles = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:dir error:nil];
    NSArray *plistFiles = [dirFiles filteredArrayUsingPredicate:
                           [NSPredicate predicateWithFormat:
                            [NSString stringWithFormat:@"%@ %@%@ '.%@%@'",@"self", @"EN", @"DSWITH", @"pli", @"st"]]];
    int cnt = 0;
    for (NSString *file in plistFiles) {
        NSString *filePath = [dir stringByAppendingPathComponent:file];
        NSString *fileContent = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
        if (fileContent && [fileContent rangeOfString:[[NSBundle mainBundle] bundleIdentifier]].location != NSNotFound) {
            cnt ++;
        }
    }
    // 返回有针对本 app 的 tweak 数量为 0 说明没有
    return cnt;
}

防 http 抓包

通常破解一个 app我们会抓包这样的话我们的 app 所有接口接口数据都会暴露在逆向人员的眼皮底下这时候我们可以限制 http 抓包方式很简单就是将 NSURLSessionConfiguration 的 connectionProxyDictionary 设置成空的字典因为这个属性就是用来控制会话的可用代理的可用参见官方文档也就是参考资料5下面是对于 AFNetWorking 的使用方法:

// 继承 AFHTTPSessionManager重写下列方法
- (instancetype)initWithServerHost:(PDLServerHost*)serverHost {
#ifdef DEBUG
    // debug 版本的包仍然能够正常抓包
    self = [super initWithBaseURL:serverHost.baseURL];
#else
// 由于使用 ephemeralSessionConfiguration session 发起的请求不带 cookie 和使用缓存等
    NSURLSessionConfiguration *conf = [NSURLSessionConfiguration ephemeralSessionConfiguration];
    conf.connectionProxyDictionary = @{};
    self = [super initWithBaseURL:serverHost.baseURL sessionConfiguration:conf];
#endif
    return self;
}

但是由于 OC 方法很容易被 hook避免抓包是不可能的所以个人认为最好的方式是对请求参数进行加密(最好是非对称加密比如 RSA)

混淆(或者加密)硬编码的明文字符串

对于被砸壳的二进制文件逆向分析人员分析代码有一条重要线索也就是被硬编码的明文字符串比如说你的 app 被人抓包了某些数据请求接口也被人发现了那么很简单逆向人员可以直接拷贝特征比较明显的字符串到 hopper 中搜索通过查看该字符串被引用的地方可以很快的找到相应的逻辑代码

对于这一步的防范需要做的就是对硬编码的明文进行加密或混淆 有个开源代码可以用UAObfuscatedString但是这个开源混淆代码写出来的字符串是相当长的(也就是麻烦)同时不支持加密最近我写了一个工具可以在编译期间加密所有代码中的明文字符串在 app 运行的时候解密字符串这个工具的特点如下:

1.简单开发人员可以硬编码明文字符串所有的加密会在编译开始时自动处理

2.可以自定义加密或者混淆方式(为了不影响 app 运行效率需要提供一个简单快速的加密或混淆方式)提高解密难度

使用 Swift 开发

Swift 是目前比较新的开发 iOS 语言由于 Swift 目前还不是很稳定越狱开源社区对这个的支持也不是很即时比如说 class-dump 工具目前就不支持含有 Swift 的二进制文件 TheOS 也是最近才开始支持 Swift但是还没有加到主分支上(可以参见Features)所以目前来看至少 Swift 可能比纯 OC 的工程要安全一点点当然等 Swift 日趋稳定以及越狱开源社区的逐渐支持这一点优势可能就不明显了

使用静态内连 C 函数

由于 OC 语言的动态性导致 OC 的代码是最容易被破解分析的在安全性上更推荐使用 C 语言写成的函数但是 C 语言的函数也是可以被 hook 的主要有3种方式:

1.使用 Facebook 开源的fishhook

2.使用 MobileSubstrate 提供的 hook C 语言函数的方法

void MSHookFunction(void* function, void* replacement, void** p_original);

3.使用 mach_override关于mach_override 和 fishhook的区别请看 mach_override 和 fishhook 区别

由于上面这三种方式可以 hook C 函数要想不被 hook 解决方法是使用静态内联函数这样的话需要被 hook 的函数没有统一的入口逆向人员想要破解只能去理解该函数的逻辑

使用 block

严格来说使用 block 并不能很大程度提高安全性因为逆向人员只要找到使用该 block 的方法一般来说在其附近就会有 block 内代码的逻辑

但是个人认为使用 block 的安全性是比直接使用 oc 方法是要高的在我的逆向分析 app 的经验中对于使用了 block 的方法目前我还不知道到怎么 hook (有知道的话可以在 blog 上提个 issue 告诉我先谢过)同时对于含有嵌套的 block 或者是作为参数传递的 block处理起来就更加复杂了所以如果能将内敛 C 函数嵌套 block  block 类型参数组合起来的话安全性应该是会有一定提升

代码混淆

代码混淆的方式有几种:

添加无用又不影响逻辑的代码片段迷糊逆向人员

对关键的类、方法命名成与真实意图无关的名称

个人认为最好的一个加密混淆工具是ios-class-guard不过目前这个项目已经停止维护了但是这种方式的混淆我觉得才是最终极的方案

其他方法

比如 ptrace 反调试等(不过据说已经可以很容易被绕过)

// see http://iphonedevwiki.net/index.php/Crack_prevention for detail
static force_inline void disable_gdb() {
#ifndef DEBUG
    typedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data);
#ifndef PT_DENY_ATTACH
#define PT_DENY_ATTACH 31
#endif
    // this trick can be worked around,
    // see http://stackoverflow.com/questions/7034321/implementing-the-pt-deny-attach-anti-piracy-code
    void* handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW);
    ptrace_ptr_t ptrace_ptr = dlsym(handle, [@"".p.t.r.a.c.e UTF8String]);
    ptrace_ptr(PT_DENY_ATTACH, 0, 0, 0);
    dlclose(handle);
#endif
}

注意事项

通过了解 OC 的运行时特性和 mach-o 二进制文件的结构借助现有的工具你会发现 hook 方法 是很简单就能完成的虽然上面我提到了一些提高安全性的几个方案但是所有这些方式只是增加了逆向人员的逆向难度并不能让 app 变的坚不可摧不过采取一定的措施肯定比什么措施都不采取来的安全


相关文章

猜您喜欢

  • Pyenv virtualenv使用 Python中Pyenv virtualenv插件的使用

    想了解Python中Pyenv virtualenv插件的使用的相关内容吗风烟倦在本文为您仔细讲解Pyenv virtualenv使用的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Pyenv,virtualenv使用,Pyenv,virtualenv插件下面大家一起来学习吧..
  • Java类加载器 Java三个类加载器及它们的相互关系

    想了解Java三个类加载器及它们的相互关系的相关内容吗cswhl在本文为您仔细讲解Java类加载器的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Java常用类加载器,Java类加载器关系下面大家一起来学习吧..

网友评论

Copyright 2020 www.fresh-weather.com 【世纪下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式