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方法三个参数了。随便找个在线网站验证成功。

相关推荐
2601_955767424 小时前
圆偏振光膜与AR抗反射膜原理评测:scinique双护技术如何实现“一柔一清”?
ios·ar·iphone·圆偏振光·磁控溅射
人月神话-Lee4 小时前
【图像处理】图像导出与工业级压缩策略——从像素到文件的最后一公里
图像处理·人工智能·ios·ai编程·swift
iOS日常7 小时前
iOS 横竖屏实践(UIKit)
swift
UXbot10 小时前
无需设计经验也能做原型:AI辅助工具功能评测
前端·人工智能·低代码·ui·ios·交互
看谷秀11 小时前
wift Part 5 oc -> swift
swift
ch_ziyuan12 小时前
2026新优化神马TV8.5影视点播系统保姆级搭建教程:三后台配置+反编译修改
android·ios·php
2601_9557674212 小时前
观复盾 iPhone 17 Pro 护景贴深度评测:参数解析与实测避坑
人工智能·ios·ar·iphone·圆偏振光·磁控溅射
一拳一个娘娘腔14 小时前
【SRC漏洞挖掘系列】第11期:移动端安全(Android/iOS)—— APP 里的“猫腻”大起底
android·安全·ios
学习3人组15 小时前
IOS手机使用电脑代理 IP 作为网关/代理出口实现穿越上网
tcp/ip·ios·智能手机
2501_9151063215 小时前
深入解析HTTPS抓包原理、中间人攻击及反抓包技术攻防
数据库·网络协议·ios·小程序·https·uni-app·iphone