iOS Swift5算法恢复——HMAC

demangle的时候看到了CryptoSwift,HMAC,于是写一个helloworld,用于对照。

Swift 复制代码
sudo gem install cocoapods
pod init

pods文件,注意要标注静态链接:

复制代码
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'hello_swift' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks! :linkage => :static

  # Pods for hello_swift
  pod 'CryptoSwift'

end
Swift 复制代码
pod install
Swift 复制代码
import UIKit
import CryptoSwift

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let message = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
        let key = "xxxxxxx"
        
        if let hmacResult = myhmac(message: message, key: key) {
            print("HMAC Result: \(hmacResult)")
        } else {
            print("Failed to generate HMAC")
        }
    }
    
    func myhmac(message: String, key: String) -> String? {
        guard let messageData = message.data(using: .utf8),
              let keyData = key.data(using: .utf8) else {
            return nil
        }
        print("sep");
        print("sep1");
        
        do {
            let hmac = try HMAC(key: keyData.bytes, variant: .md5).authenticate(messageData.bytes)
            let hmacString = hmac.toHexString().lowercased()
            return hmacString
        } catch {
            print("Error generating HMAC: \(error)")
            return nil
        }
    }
}

编译之后,在Build文件夹下找到软件包,右键,打开软件包,把里面的macho文件拖出来。

对照几个关键函数的内部实现:

这两个sub,展开之后的内容,和右侧完全一致。转成sub的原因是因为这个地方,还有很多的xref,猜测是编译器进行的体积优化造成的。去除重复代码块。而正是这种优化,会导致IDA处理Swift的时候遇到很多问题。

F5也可以快速发现关键相同处。

下面来到关键的核心函数:可以看到,CFG相似度还是有的。然后,关键地方一致,例如JUMPOUT了BR X10,虽然整体F5的结构看着不同,但是里面的小片段整体是一样的,一些特定的数字(a.k.a. 魔数)一致,虽然这里的魔数比较小,单从这一点看,特征属于比较一般。

其他的函数原理一致。

那么HMAC的整体上层调用者的写法如图:左侧为需逆向的程序。里面的函数除了_s4HMACCMa()这个地方,其他的Data_bytes_getter、HMAC_init_key_variant__、HMAC_authenticate____、Array_toHexString__,这些都是自己修复的,原来都是一个个的sub。在逆向分析的时候一定要注意将函数本身逻辑、编译器逻辑、内存管理逻辑、Bridge逻辑、还有最关键的点:库函数逻辑,分隔开。识别库函数也是很重要的能力。右侧是一个自己用Swift5写的Hmac的"HelloWorld"程序以便对照。

修复完的整体样式:

发现左侧少了一个String的metadata获取,于是按照这个特征,找这个函数的上层调用者函数,发现上一个函数的调用就是生成了key。于是找到了key的生成位置。

inited = (void *)HMAC_init_key_variant__(key, 128LL);

128代表md5,129代表sha1。

由此,HMAC算法的识别恢复完成,可以提取到消息、密钥、hash方法三个参数了。随便找个在线网站验证成功。

相关推荐
HouWan32 分钟前
SwiftUI 小技巧:如何读取 SwiftUI Font 的详细信息
ios·swiftui·apple
李游Leo1 小时前
HarmonyOS 7 实战开发 05:把页面做到可上线状态
ios·harmonyos
终端安全笔记6 小时前
描述文件、企业证书、MDM 不是三个名字,是三层
android·ios·智能手机
传奇开心果编程7 小时前
【SwiftUI入门练中学】第1课 从零开始
学习·ui·ios·swiftui·swift
丿Wayne12 小时前
iOS Token 刷新实战(Actor 避免并发重复刷新)
ios·swift·token·actor·swift并发
终端安全笔记1 天前
iOS 27 给了租赁一个新工具,但它只认受监督的设备
android·网络·安全·ios
大熊猫侯佩1 天前
独立 App 首发完成 iPhone Duo 展开态适配
ios·swiftui·swift
光影少年1 天前
setImmediate 和 setTimeout(0) 的区别
android·前端·react.js·ios·前端框架
2501_916008891 天前
SSE 和 gRPC 流式接口如何抓包,调试 SSE 与 gRPC 流式接口
网络协议·计算机网络·网络安全·ios·adb·https·udp