我们今天讨论的是方法调用的传参,寄存器是怎么运作的:
首先我们在一个方法里打上断点,lldb输入re re打印所有寄存器的值

唯一的输入参数,是在x2寄存器里,我们现在看看能用什么方法读出寄存器里的值,
memory read 0x0000000100b24850

这里可以看到是占32位的一个数据结构,再这里我们要先回到MachOView里查看这个地址所在的数据是什么样子的,首先我们通过减去ASLR的值找到MachoView里的地址

打开MachOView,数据是这样的,总共32位,我们以8个字节来分割来解析这个数据结构,最高8字节是表示数据的大小,次高8字节是表示存放的是地址指向真正的内容,次次8字节可能存发的是类型???0x07c8,最低8字节可能是存放的是给指针分配的地址
图解:

最高8字节
在memory read 最高8字节是0A 00 00 00 00 00 00 00
我们先看最高8字节,因右边是高位,它的数据得从右向左读(是一个字节一个字节的读的,16进制两位表示一个字节)
00 00 00 00 00 00 00 0A

由此得出和MachOView这里的值是符合的

次高8字节
在memory read 次高8字节是7f b0 62 04 01 00 00 00,因右边是高位从右向左读得到
0x000000010462b07f减去ASLR得到0x000000010001f07f

去MachOView里寻找0x000000010001f07f果然是对应的字符串,这里是存放在__TEXT,__cstring里,表示是不可修改的.

在lldb读出字符串内容,由于我们得知字符串大小是10字节,由此我们可以以memory read -c 10读出字符串,

后记:字面量字符串英文是存放在__TEXT,__cstring里的,比如说下图中的appsafekb
字面量字符串中文是存放在__TEXT,__ustring里的

而oc字符串类的属性是放在__DATA,__cfstring里的,比如说上图的_jsonName

示例:在函数里定义一个字符串变量,NSString *key = @"songxuhua_OK";

由此可见,字符串变量地址指向的是一个占有32字节的空间,16~23字节所存放的地址指向字符串的内容,23~31字节存放的是字符串大小,前16字节暂时不是很清楚代表啥

memory read详细使用方法
x/memory read:dump指定地址的内存(Read from the memory of the process being debugged),后接起止地址或-c指定count加起始地址。可help mem read查看帮助:

Syntax:
memory read[]

Command Options Usage:
size指定内存块(block/item)的大小,默认为1byte。
--size):The size in bytes to use when displaying with the selected format.

count指定内存块(block/item)的个数,可配合起始地址使用。
-c( --count):The number of total items to display.

format指定内容显示格式,格式符同print:c-char,s-string,d-decimal,x-hex。
-f( --format):Specify a format to be used for display.

Command Samples:
(a)起止地址
(lldb)mem read 0x10b88f0c 0x10b88f0c+9
0x10b88f0c: 39 38 37 36 35 34 33 32 31 987654321
(b)起始地址+内存块count
(lldb)mem read 0x10b88f0c -c 9
0x10b88f0c: 39 38 37 36 35 34 33 32 31 987654321
(c)起始地址+内存块size+内存块count(dump hex format)
(lldb)memory read -s 1 -f x -c 9 0x10b88f0c
0x10b88f0c: 0x39 0x38 0x37 0x36 0x35 0x34 0x33 0x32
0x10b88f14: 0x31
(d)起始地址+内存块size+内存块count(dump char format)
(lldb)memory read -s 1 -f c -c 9 0x10b88f0c
0x10b88f0c: 987654321
(e)起始地址+内存块size+内存块count(dump string format)
(lldb)mem read 0x10b5cf2c -f s -c 1
0x10b88f0c: "987654321"
(f)起始地址+内存块size+内存块count(dump int format)
(lldb)memory read -s 4 -f x -c 3 0x10b88f0c
0x10b88f0c: 0x36373839 0x32333435 0x109f0031
memory write:改写指定地址的内存(Write to the memory of the process being debugged)。可help mem write查看帮助:

Syntax: memory write


宋冬野
32 声望4 粉丝

« 上一篇
lldb 使用