App 混淆再资安保护领域来说,可谓是最复杂的一环,也是最重要的一环
但是资安检测无法有个标准的检核方式,因此在资安检验只有建议,并没有强制要求此项
另外外在贩售的 APP保护服务,都在混淆这个基础上下功夫
回到正题,混淆到底是混淆什麽,混淆的重要性到底在哪
要了解混淆重要,要先从 app 反编译讲起,知道别人是怎麽破解app 才能知道需要怎麽保护
从 App Store 安装的 APP,其中 .ipa 档案都有 FairPlay DRM 保护 ,所以单纯从 App Stroe 想直接反组译是不行的
因此需要先进行「砸壳」,砸壳工具很多 dumpdecrypted 、 frida-ios-dump 、clutch、gdb....
砸壳:保护手段叫做加壳保护,相之的去掉保护就叫「砸壳」 又称为脱壳
想深入读者可以参考 OWASP Acquiring the App Binary 如何提取二进位档
有详细说明如何「砸壳」(删除 FairPlay DRM)
用 debug下产生的 ipa 或者是release下的ipa ,都是没有经过Apple DRM保护, 可以直接进行反编译
这章重点在於混淆,简单介绍砸壳让读者了解大概是怎麽进行
简单的专案如下,除了套件以外,就只有一个初始 ViewController
├── AppSecDev
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ ├── Base.lproj
│ ├── Info.plist
│ ├── SceneDelegate.swift
│ └── ViewController.swift
├── AppSecDev.xcodeproj
├── AppSecDev.xcworkspace
├── Podfile
└── Pods
寻找编译後的 .app ,从 products 内直接使用右键从 Finder 寻找到编译後二进位执行档
AppSecDev.app
就是我们要找的编译後二进位执行档
属於静态分析的一种,将公开类别名及方法 dump 出来
使用工具 class-dump(Nygard)
在Terminal 执行
./class-dump -H APP路径/APP名称.app -o 汇出目标资料夹
class-dump -H .../DerivedData/AppSecDev-xxxxxx/Build/Products/Debug-iphonesimulator/AppSecDev.app -o ./out
Dump出的东西
这是原始 ViewController 内定义的方法
可以比对一下发现有点不一样,原因是我使用的 class-dump 无法解析Swift 相关的东西,但objC 部分都没什麽问题
因为对这个范例所需资料已经够用
依照刚刚解析出来资料
可看出想要破解的资料应该是在 _TtC9AppSecDev14ViewController 里面
後续可以用这个当做搜寻用的关键字
想要完整解析 swift 可以使用 dsdump
反编译需要具备很多专业知识,看懂组合语言是基本东,当然还有很多『美美角角』要知道
因此这边就不详细叙述怎麽反编译
反编译很多工具可以使用,目前列出最受欢迎的 IDA 、Hopper 和 NSA 开发的Ghidra
func aes(){
let aes_message = "aes_message 咩"
let aes_key_HexString = "01234567890000000000000000000111"
let keyArray = Array<UInt8>.init(hex: aes_key_HexString)
if
let aes = try? AES(key: keyArray, blockMode: ECB()) , // aes128
let encrypted = try? aes.encrypt(aes_message.bytes) ,
let EncData = encrypted.toBase64()
{
print(EncData)
}
}
找到我们在程序内进行加密的字串
和金钥
认真在分析,还原程序也可知道使用什麽加密演算法
看了上面的反编译流程,可以得知顺序怎麽进行,因此可以这流程上做手脚
达到混淆有心人士的意图,让分析动作十分困难,让他们觉得无利可图,而放弃
混淆可分为这三大类
字串在反编译中算是最没有难度,因为工具有一区就是记载全部的字串,可以慢慢在里面找
如果字串包含很大的识别程度,很快就会被找到,像是Android 指定 加密模式是用字串
"AES/CBC/PKCS5Padding"
所以我们可以在字串上面作手脚
串接,字串虽然会复杂一点,但还是很快可以组出来因此就不讨论
通常是用字串上做位元运换,或其他方式转换,因此加密也是一种方式
加密前
详细运作方式及原理可以参考以下文章
https://blog.csdn.net/junzia/article/details/85466578
https://blog.csdn.net/jaccty/article/details/52471196
但原理大同小异,只是演算方式不同
也有人写好的套件可以使用 ,https://github.com/UrbanApps/UAObfuscatedString
大多数反组第一步都会先做静态分析,从对应的class 结构来找寻有用的资料
所以要增加困难度,就是对 class name 、 method 进行混淆,使其造成阅读困难,无法使用关键字搜索
有些人会自己写
也有些不错的工具
https://github.com/CUITCHE/code-obfuscation for ObjC
https://github.com/rockbruno/swiftshield for Swift
为了让反组译的人更不容易找到资料,所以会针对指令修改,流程做的更复杂,让人更不好破解
控制流程扁平化
指令替换
标准二元运算符(+ , – , & , | 和^)
SDK API function 置换
虚假控制流程
iOS 上有人又称为 OLLVM (Obfuscator-LLVM),用这个关键字也可以找到很多前辈分享的作法
程序码混淆保护
但为了更加的安全,会采用加壳处理
自定义底层保护
dsdump 支援Objective-C和Swift。支持Swift 5+
命令工具,用於检查Mach-O(Mach object)主要针对 Objective-C classes, categories, and protocols
class-dump-z 可使class-dump-z速度比其前任快近10倍。
Ghidra是由NSA研究部开发的一套软件逆向工程(SRE)工具
https://github.com/OWASP/owasp-mstg/blob/master/Document/0x06c-Reverse-Engineering-and-Tampering.md
<<: [Day 30]30天挑战成功!同场加码Azure Machine Learning!
前面我们已经完成了 Create 和 Details , 今天就来实作 List 页面 List 页...
缘由: 若客户端使用者不只单一国家,就会需要有变更app语言的功能, 之前查了一些资讯都是需要退出後...
终於到了倒数第二天 现在一直在努力的写前後端的程序码跟串接 在前端 RxDB 中有一些 Middle...
本文将介绍在前後分离的状况下,後端如何与前端配合制作 Web API ,串接蓝新金流服务。 .NET...
When it comes to hiring an [Assignment Helper] the...