Day 30. 要别人看不懂,还是让自己看不懂的 - 混淆 Obfuscation

App 混淆再资安保护领域来说,可谓是最复杂的一环,也是最重要的一环

但是资安检测无法有个标准的检核方式,因此在资安检验只有建议,并没有强制要求此项

另外外在贩售的 APP保护服务,都在混淆这个基础上下功夫

回到正题,混淆到底是混淆什麽,混淆的重要性到底在哪

image-20201015180610208

反编译(Decompiling)流程

要了解混淆重要,要先从 app 反编译讲起,知道别人是怎麽破解app 才能知道需要怎麽保护

提取 APP .ipa 档案 & 砸壳

从 App Store 安装的 APP,其中 .ipa 档案都有 FairPlay DRM 保护 ,所以单纯从 App Stroe 想直接反组译是不行的

因此需要先进行「砸壳」,砸壳工具很多 dumpdecryptedfrida-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

截图 2020-10-15 上午12.13.55

寻找编译後的 .app ,从 products 内直接使用右键从 Finder 寻找到编译後二进位执行档

截图 2020-10-15 上午12.28.51

截图 2020-10-15 上午12.30.25

AppSecDev.app 就是我们要找的编译後二进位执行档

Class-Dump

属於静态分析的一种,将公开类别名及方法 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出的东西

截图 2020-10-15 上午12.09.48

这是原始 ViewController 内定义的方法

截图 2020-10-15 上午12.11.16

可以比对一下发现有点不一样,原因是我使用的 class-dump 无法解析Swift 相关的东西,但objC 部分都没什麽问题

因为对这个范例所需资料已经够用

依照刚刚解析出来资料

可看出想要破解的资料应该是在 _TtC9AppSecDev14ViewController 里面

後续可以用这个当做搜寻用的关键字

想要完整解析 swift 可以使用 dsdump

进行反编译

反编译需要具备很多专业知识,看懂组合语言是基本东,当然还有很多『美美角角』要知道

因此这边就不详细叙述怎麽反编译

反编译很多工具可以使用,目前列出最受欢迎的 IDA 、Hopper 和 NSA 开发的Ghidra

字串寻找

原始程序码

截图 2020-10-14 下午11.15.08

    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)
        }
    }

搜寻反编译资料

截图 2020-10-14 下午11.14.05

找到我们在程序内进行加密的字串金钥

认真在分析,还原程序也可知道使用什麽加密演算法

混淆

看了上面的反编译流程,可以得知顺序怎麽进行,因此可以这流程上做手脚

达到混淆有心人士的意图,让分析动作十分困难,让他们觉得无利可图,而放弃

混淆可分为这三大类

  • 字串混淆 (Obfuscated String)
  • 程序码混淆 CodeObfuscation
  • 程序码逻辑混淆(Obfuscator)

字串混淆 (Obfuscated String)

字串在反编译中算是最没有难度,因为工具有一区就是记载全部的字串,可以慢慢在里面找

如果字串包含很大的识别程度,很快就会被找到,像是Android 指定 加密模式是用字串

"AES/CBC/PKCS5Padding"

所以我们可以在字串上面作手脚

串接,字串虽然会复杂一点,但还是很快可以组出来因此就不讨论

通常是用字串上做位元运换,或其他方式转换,因此加密也是一种方式

加密前

image-20201015012146714

image-20201015012159499

image-20201015012221242

详细运作方式及原理可以参考以下文章

https://blog.csdn.net/junzia/article/details/85466578

https://blog.csdn.net/jaccty/article/details/52471196

但原理大同小异,只是演算方式不同

也有人写好的套件可以使用 ,https://github.com/UrbanApps/UAObfuscatedString

程序码混淆 CodeObfuscation

大多数反组第一步都会先做静态分析,从对应的class 结构来找寻有用的资料

所以要增加困难度,就是对 class name 、 method 进行混淆,使其造成阅读困难,无法使用关键字搜索

image-20201015012929037

有些人会自己写

也有些不错的工具

https://github.com/CUITCHE/code-obfuscation for ObjC

https://github.com/rockbruno/swiftshield for Swift

程序码逻辑混淆(Obfuscator)

为了让反组译的人更不容易找到资料,所以会针对指令修改,流程做的更复杂,让人更不好破解

  • 控制流程扁平化

    • if-else语法,转成do-while语法

    image-20201015013733726

  • 指令替换

    • 标准二元运算符(+ , – , & , | 和^)

      SDK API function 置换

      image-20201015013753544

  • 虚假控制流程

    • 多一堆垃圾程序码

iOS 上有人又称为 OLLVM (Obfuscator-LLVM),用这个关键字也可以找到很多前辈分享的作法

延伸阅读 Android 混淆机制

程序码混淆保护

但为了更加的安全,会采用加壳处理

自定义底层保护

逆向工具

免费

  • 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)工具

付费&有限制免费使用

  • IDA Pro 可以处理iOS二进制文件。有内建 iOS Debuger。UI 操作很棒,但很贵,很多不错的功能都是另外买。
  • Hopper 用於macOS和Linux的逆向工具,用於disassemble, decompile 。

参考资料

https://github.com/OWASP/owasp-mstg/blob/master/Document/0x06c-Reverse-Engineering-and-Tampering.md

https://github.com/OWASP/owasp-mstg/blob/master/Document/0x06b-Basic-Security-Testing.md#acquiring-the-app-binary


<<:  [Day 30]30天挑战成功!同场加码Azure Machine Learning!

>>:  Day30. 8人订阅Q&A问答

【从实作学习ASP.NET Core】Day12 | 後台 | 资料筛选与分页

前面我们已经完成了 Create 和 Details , 今天就来实作 List 页面 List 页...

本地化APP(变更APP语言)

缘由: 若客户端使用者不只单一国家,就会需要有变更app语言的功能, 之前查了一些资讯都是需要退出後...

倒数第二天

终於到了倒数第二天 现在一直在努力的写前後端的程序码跟串接 在前端 RxDB 中有一些 Middle...

.NET 前後分离 Web API 蓝新金流串接

本文将介绍在前後分离的状况下,後端如何与前端配合制作 Web API ,串接蓝新金流服务。 .NET...

Believing These Myths About Assignment Helper Will Not Let You Grow

When it comes to hiring an [Assignment Helper] the...