由于处于DATA段,所以内部的全局变量,不需要手动修改地址。加载时会自动偏移。
所以这个问题,是“白折腾了”。
Facebook 有一些特殊的section,例如下图的:__DATA,FBInjectable。
经过一些分析,得知此section的数据含义如下:(armv7下)
共72 bytes,每4 bytes一组,分18组。每一组的逆序(读入内存导致),例如第一组 B8DB8404 的逆序为 0484DBB8 ,也就是0X0484DBB8的位置是个字符串,如下图:
就是这个字符串, +[FBNewAccountNUXPYMKVCFactory(FBInjectable) fb_injectable]
以上是背景,以下是问题:
app运行时,通过 getsectiondata 获取__DATA segment的 FBInjectable section 的数据。相关代码如下:
通过调试,打印出getsectiondata的返回值如下:
(问题马上出来),读出来的内容与之前在 MachOView 中看的不一样。
显然由于ASLR的存在,FBInjectable内的每组地址也需要加上偏移地址,才能保证通过每组地址可以获取到对应的那个字符串。
(问题来了),我想了各种办法都没有找到getsectiondata的返回数据是在什么地方被修改了。(每4bytes一组分别加上偏移地址)
例如第一组: 0x0493fbb8 - 0x0484dbb8 = 0xf2000
1、我开始以为是hook,但单步进入调试,并没有发现到达自己模块。
2、以为getsectiondata 会自动增加偏移,显然不会这样。
还有什么方法,会让getsectiondata 返回的数据每组自动加上偏移呢?恳求大家支招。 (如果自己写这段代码,肯定就是getsectiondata后处理返回值,但Facebook貌似处理的更加自动化,如何做到的呢)
这里有个简单的getsectiondata的例子 https://github.com/everettjf/FBInjectableTest
Facebook armv7 可执行文件在这里 https://pan.baidu.com/s/1dELFd5Z
getsectiondata 的调用地址在 0x0334cc1c
PS:关于Facebook为何创建FBInjectable 这个section,我已经得出结论,近期会整理分享出来。