如何根据Data的值获取到classname的字符串?书上的转换步骤有点不懂。
模块在文件中的偏移地址为0x18000
模块在内存中的地址为0x100000000
有点小白,这里自己总是不知道怎么算出来的。调试了class-dump的代码,但是看了它是用的OSReadLittleInt64([_data bytes], _offset); 这个方法直接读取了变量。还是不清楚是怎么算出来的。
如何根据Data的值获取到classname的字符串?书上的转换步骤有点不懂。
有点小白,这里自己总是不知道怎么算出来的。调试了class-dump的代码,但是看了它是用的OSReadLittleInt64([_data bytes], _offset); 这个方法直接读取了变量。还是不清楚是怎么算出来的。
0x18000 + (0x100008fa0 - 0x100000000) = 0x20fa0
Data: 0x100008578
0x18000 + (0x100008578 - 0x100000000) = 0x20578
0x18000 + (0x100006c25 - 0x100000000) = 0x1EC25
书中问题:
请问下,你的第一个截图是哪个section的? 我好像都翻了一遍,没找到你这张截图在MachOView的位置。 今天翻了整个Executable(ARM64_ALL)查到有这个地址了。 但是想知道你的这个截图是哪里的?
另外,算出来0x20578后,这个0x6c25对应的不是0x20590处的地址吗?
今早自己想了下,是不是因为获取到的0x20578是整个结构体class_ro_t所在的地址,从这个地址排除前面变量的占位(uint32_t 的flags, instanceStart, instanceSize, reversed和uint8_t * ivarLayout) 总共占用位数是24个字节。然后name的位置就是0x20578+这些占用的空间位置得到的最终地址是0x20590。