【问题标题】:LLDB print swift array knowing only hex addressLLDB 打印快速数组只知道十六进制地址
【发布时间】:2017-07-22 04:46:03
【问题描述】:

我正在尝试对使用发布配置构建的应用程序之一进行逆向工程。

我的线程信息如下所示。

* thread #21: tid = 0x876cb, 0x000000010133856c SomeLibSwift`SomeLibSwift.Auth.auth (Swift.Array<Swift.UInt8>) throws -> Swift.Array<Swift.UInt8>, queue = 'com.apple.root.utility-qos', stop reason = breakpoint 1.6
  * frame #0: 0x000000010133856c SomeLibSwift`SomeLibSwift.Auth.auth (Swift.Array<Swift.UInt8>) throws -> Swift.Array<Swift.UInt8> 

寄存器x0(地址0x181ba4174)包含需要的参数

内存读取显示类似(我尝试了不同的格式)

memory read -s1 -fC -c1000 --force 0x181ba4174

0x181ba4174: ...??._?.......??._?0......??._?
0x181ba4194: P......??._?p......??._?.......?
0x181ba41b4: ?._ְ......??._??......??._?....
0x181ba41d4: ...??._?0......??._?P......??._?
0x181ba41f4: p......??._?.......??._ְ......?
0x181ba4214: ?._??......??._?.......??._?P...
0x181ba4234: ...??._?p......??._?.......??._?
....

我发现auth func有这样的定义

func auth(_ bytes: Array<UInt8>) throws -> Array<UInt8>

所以基本上我想要的只是获取地址 0x181ba4174 存储的“字节”变量。

我也知道'auth'方法是用这样的参数调用的:

let key = "somekey".utf8
let result = auth(key)

理想情况下,我想取回密钥。

【问题讨论】:

    标签: swift reverse-engineering lldb disassembly


    【解决方案1】:

    我终于能够完成这项工作。

    expr -l Swift  -- String(unsafeBitCast(0x181ba4174, to: Array<UInt8>.self))
    

    它给出如下输出:

    (String) $R0 = "[10, 11, 118, 105, 19, 1]"
    

    然后使用 Xcode 我能够得到密钥:

    var arr: [UInt8] = [10, 11, 118, 105, 19, 1]
    
    let data = Data(bytes: arr)
    let key = String(data: data, encoding: .ascii)
    

    我还写了一条命令以防有人需要。

    command regex ptrInt8Array 's/(.+)/expr -l Swift  -- String(describing: unsafeBitCast(%1, to: Array<UInt8>.self))/'
    

    执行方式:

    ptrInt8Array 0x181ba4174
    

    【讨论】:

      猜你喜欢
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      • 1970-01-01
      • 2019-07-04
      相关资源
      最近更新 更多