如果我知道寄存器名称,如何简化内存读取

时间:2017-10-18 11:45:29

标签: cocoa reverse-engineering lldb

我正在尝试获取调用方法的参数值:

@selector(processEditingForTextStorage:edited:range:changeInLength:invalidatedRange:)

我知道如何存储值:

  • $ rdx - 第一个参数
  • $ rcx - 第二个参数
  • $ r8 - 第三个参数(NSRange.location 8bytes)
  • $ r9 - 第三个参数(NSRange.length 8bytes)
  • $ rbp + 0x10 - 第四个参数(NSUInteger 8bytes)
  • $ rbp + 0x18 - 第五个参数(NSRange.location 8bytes)
  • $ rbp + 0x20 - 第五个参数(NSRange.length 8bytes)

这是对的吗?

如果我知道存储整数的位置,第二个问题是如何打印NSRange的更简单方法?类似于" po *(NSUInteger *)($ rbp + 0x20)"

我得到错误:

(lldb) po *(NSRange *)($rbp+0x18)
error: incomplete type 'NSRange' (aka '_NSRange') where a complete type is required
forward declaration of '_NSRange'

需要

(lldb)  memory read --size 8 --format x --count 1 ($rbp+0x20)
0x7fff5e348660: 0x0000000000000008
(lldb)  memory read --size 8 --format x --count 1 ($rbp+0x18)
0x7fff5e348658: 0x000000000000000a
(lldb)  memory read --size 8 --format x --count 1 ($rsp+0x8)
0x7fff5e348438: 0x000000000000000a
(lldb)  memory read --size 8 --format x --count 1 ($rsp+0x10)
0x7fff5e348440: 0x0000000000000008

1 个答案:

答案 0 :(得分:2)

模仿GDB命令的各种命令都有缩写。其中之一是x(对于“eXamine memory”),它是“memory read”的缩写。您可以添加斜杠和格式说明符以使用特定格式。例如,x/xg以十六进制格式化8字节值。该参数是要检查的地址的表达式。

所以:

x/xg $rsp+0x10