LLDB 打印 swift 只知道十六进制地址的数组
LLDB print swift array knowing only hex address
我正在尝试对使用发布配置构建的应用之一进行逆向工程。
我的线程信息如下所示。
* 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 存储的 'bytes' 变量。
我也知道 'auth' 方法是用这样的参数调用的:
let key = "somekey".utf8
let result = auth(key)
理想情况下我想取回密钥。
我终于完成了这件事。
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
我正在尝试对使用发布配置构建的应用之一进行逆向工程。
我的线程信息如下所示。
* 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 存储的 'bytes' 变量。
我也知道 'auth' 方法是用这样的参数调用的:
let key = "somekey".utf8
let result = auth(key)
理想情况下我想取回密钥。
我终于完成了这件事。
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