iOS的应用代码注入防护
在应用开发过程中,我们不仅仅需要完成正常的业务逻辑,考虑应用性能,代码健壮相关的问题,我们有时还需要考虑到应用安全的问题。
那么应用安全的问题涉及到很多方面。比如防止静态分析的,代码混淆,逻辑混淆;防止重签名的,应用ID检测,甚至是代码的HASH检测等等那么这篇文章我想聊聊关于代码的注入检测,因为发现随着iOS的系统的更新,我们防护的手段发生了一些变化。
代码注入的方式
代码注入的方式大致分为两种
- 越狱注入:修改通过
DYLD_INSERT_LIBRARIES
环境变量的值,来插入动态库并执行 - 非越狱注入:
- 直接将自定义的Framwork或者dylib库打包进入APP并重签名。
- 利用yololib修改男子气概的文件,添加库路径。在应用启动时,使dyld会加载并执行。
早期防护方式
在工程的构建设置中找到其他链接器Flages并添加字段
此操作的作用是在可执行文件中添加一个节。我们使用MachOView分析如下:
当MachO文件中拥有这个字段,那么我们通过越狱环境插入动态库的方式就会失效。起到防护的作用。其原理在dyld的源码中可以分析到。
dyld的源码分析
首先这里分析的dyld的源码版本的英文519.2.2版本。 我们可以通过检索DYLD_INSERT_LIBRARIES定位到_main函数加载插入动态库的代码如下。
但是早在这个环境变量判断之前,dyld的已经做了一个判断
如果判断出进程是受限制的!也就是当前进程是限制插入动态库的!就会调用pruneEnvironmentVariables函数移除相关的环境变量。
那么我们的processIsRestricted值什么时候为真呢?
继续分析源码可以发现两个关键函数影响其值。其中hasRestrictedSegment函数专门检测RESTRICT段
通过注释也能发现。任意进程的__restrict段设置为受限制的动态库插入将被限制。 我们进入到processIsRestricted函数内,实现如下。
所以通过添加其他链接器标志在MachO中设置RESTRICT段赋值为限制可以用来防护越狱的代码注入。 但是新版的dyld源码中去掉了__RESTRICT检测。从iOS10开始,这种防护手段已失效
DYLD_INSERT_LIBRARIES检测
那么既然dyld的加载过程不再检测__restrict了段就我们的手动检测DYLD_INSERT_LIBRARIES
环境变量。通过函数可查看当前进程环境变量的值。
在没有插入动态库时,ENV为空。 那么一旦为自己的应用写入插件时,我们就可以看到控制台的输出
白名单检测
那么上面的检测只可以检测越狱环境中的代码注入,在非越狱环境中,逆向工程师可以利用yololib工具注入动态库。所以我们可以检索一下自己的应用程序所加载的动态库是否是我们源程序所有
其中libraries的英文变量白名单。
相关文章
- 盘古正式发布IOS 7.1.1 完美越狱
- iOS逆向入门实践 — 逆向微信,伪装定位(二)
- iOS app测试_测试插件app
- IOS 大裁员,一半来自 BAT 大厂开发。
- AppCode 2022 for Mac(iOS代码编写利器)v2022.2.4中文特别版
- iOS屏幕旋转处理
- push证书申请_iOS上架App Store
- iOS App怎么上架到苹果TestFlight?
- iOS 生成证书、描述文件、打包上架Appstore详细流程
- 《简化iOS APP上架流程,App Uploader助你搞定!》
- IOS网络编程—(数据请求+slider)将网络上的大文件下载到本地,并打印其进度详解手机开发
- iOS异步请求下载图片详解手机开发
- iOS开发– 开发环境,证书和授权文件详解手机开发
- Linux与iOS之间的技术对比(linux和ios)
- Linux技术可以开发IOS系统?(linux能开发ios吗)
- 操作系统开启iOS时代:Linux操作系统的新篇章(ios是linux)
- 把 Linux 安装到 iOS 设备上的步骤(ios安装linux)
- iOS开发与Linux的技术融合(ios开发linux)