咱们明天探讨的是办法调用的传参,寄存器是怎么运作的:
首先咱们在一个办法里打上断点,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
而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