【发布时间】:2018-02-24 07:14:21
【问题描述】:
当我查看寄存器时,我试图将寄存器值从一个 NSString 更改为另一个 - 在此示例中,“rdx”指向一个 NSString 对象:
(lldb) register read
General Purpose Registers:
rax = 0x0000000000000000
rbx = 0x0000000000000000
rcx = 0x0000000000007d0b
rdx = 0x00007fffb6e40860 @"Helvetica"
现在我尝试以多种方式更改它的值 - 我尝试在“表达式”中创建一个 NSString 对象并将其设置为 $rdx:
(lldb) expression
Enter expressions, then terminate with an empty line to evaluate:
1: NSString *abc=@"Times";
2: $rdx=abc;
error: assigning to 'unsigned long' from incompatible type 'NSString *'
现在我记得 rdx 只是一个指向 NSString 对象的指针,所以我尝试获取指针值(unsigned long)并将其设置为 rdx:
(lldb) expression
Enter expressions, then terminate with an empty line to evaluate:
1: NSString *abc=@"Times";
2: $rdx=(unsigned long)&abc;
(unsigned long) $110 = 123145406123008
现在寄存器读取只显示一个指针值而不是一个 NSString 值
(lldb) register read
General Purpose Registers:
rax = 0x0000000000000000
rbx = 0x0000000000000000
rcx = 0x0000000000007d0b
rdx = 0x000070000e275d00
当我让程序继续运行时 - 它崩溃了...
现在我知道我遗漏了一些东西,因为 rdx 的初始值指向 NSString (0x00007fffb6e40860) - 当从内存中读取它时,它指向另一个指针(7fffb3d721b8,它指向垃圾数据......)
(lldb) memory read 0x00007fffb6e40860
0x7fffb6e40860: b8 21 d7 b3 ff 7f 00 00 c8 07 00 00 00 00 00 00 ?!׳?...?.......
在将 rdx 分配给我的 NSString 指针后读取值时 - 它确实显示了字符串值:
(lldb) memory read 0x000070000f8a3d00
0x70000f8a3d00: 55 54 69 6d 65 73 00 00 00 00 00 00 00 00 00 00 UTimes..........
如果还不够清楚 - 我的目标是设置 rdx,使其显示如下内容:
(lldb) register read
General Purpose Registers:
rax = 0x0000000000000000
rbx = 0x0000000000000000
rcx = 0x0000000000007d0b
rdx = 0x00007fffb6e40860 @"Times"
【问题讨论】:
标签: macos debugging nsstring reverse-engineering lldb