【问题标题】:Setting a register value to NSString in lldb在 lldb 中将寄存器值设置为 NSString
【发布时间】: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


    【解决方案1】:

    你有两个选择:

    创建字符串,获取对它的引用,然后使用register write 设置它

    (lldb) p/x @"hello world"
    (__NSCFString *) $0 = 0x00006000002232a0 @"hello world"
    (lldb) register write rdx 0x00006000002232a0
    (lldb) p/x $rdx
    (unsigned long) $1 = 0x00006000002232a0
    (lldb) po $rdx 
    hello world
    

    或者,您也可以使用表达式命令:

    (lldb) p/x @"goodbye world"
    (__NSCFString *) $1 = 0x0000604000423000 @"goodbye world"
    (lldb) po $rdx = 0x0000600000223220
    goodbye world
    
    (lldb) po $rdx
    goodbye world
    

    【讨论】:

      猜你喜欢
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-24
      • 2020-06-08
      • 1970-01-01
      • 2013-08-05
      • 2012-08-11
      相关资源
      最近更新 更多