swift静态混淆-异或(XOR)

115 阅读1分钟

原理:编译时混淆字符串,运行时还原。

作用:该方式的主要目的是增加逆向工程的难度,防止敏感字符串在二进制文件中以明文形式出现。

实现步骤

在代码编译阶段,不直接写明文字符串,而是用一个混淆后的数据表示(字节数组),并提供一个解密函数在运行时还原。

混淆的方式很多 这里先使用异或(XOR) 操作,因为它简单且可逆

使用python脚本作为混淆工具

def xor_obfuscate_advanced(text, key_str):
    text_bytes = text.encode('utf-8')
    key_bytes = key_str.encode('utf-8')
    
    return [
        text_bytes[i] ^ key_bytes[i % len(key_bytes)]
        for i in range(len(text_bytes))
    ]

if __name__ == '__main__':
    secret = "免费版"    // 需要混淆的字符串
    key_phrase = "0x22" // 选择一个单字节密钥(0-255之间)
    
    obfuscated = xor_obfuscate_advanced(secret, key_phrase)
    print(f"{obfuscated}")

print出 [213, 253, 191, 218, 132, 193, 213, 187, 184] 的结果就是我们混淆后的字节数组

在项目中使用混淆后的字节数组(以Swift为例)

func deobfuscateAdvanced(_ array: [UInt8]) -> String {
    // 这里的单字节密钥 ("0x22")要与python混淆是的一致
    guard let keyData = "0x22".data(using: .utf8) else { 
        fatalError("无法转换密钥为UTF-8数据")
    }
    
    let keyBytes = [UInt8](keyData)
    
    let decrypted = array.enumerated().map { index, byte in
        byte ^ keyBytes[index % keyBytes.count]
    }
    
    guard let string = String(data: Data(decrypted), encoding: .utf8) else {
        fatalError("无法将数据解码为UTF-8字符串")
    }
    
    return string
}

在需要加载字符串的地方直接调用deobfuscateAdvanced() 方法并把混淆后的字节数组添加进去即可。