那么我们就好办了,我们只要获取到最后一个PT_LOAD的p_vaddr的值然后加上这个段的mem_size在做一下页面对其操作就可以得到内存中的末尾了。
关于页面对其的操作,网上有相关的资料,可以去搜一下,这里也不解释了。
这里就是0x3EB8+0x14c对0x1000对其操作结果是:0x5000也就是上面我们说的文件末尾值了。
好了,上面我就做完了所有的工作,下面就将我们修改之后的so文件保存一下,然后用readelf工具验证一下:
1、验证elf的头部信息中的section变成22了
2、验证Section Header
最后一个段是我们添加的
3、验证Program Header信息
新加的Section能够加载到内存中。
我们同样也可以用IDA进行验证一下:
用010Editor查看一下:
段名位置都是正确的,那么下面我们就来修改字符串吧,因为我们新加的段完全就是一个空白地,想怎么加就怎么加?
下面我们来修改一下字符串:
在0x5010出添加了修改的字符串,那么我还需修改一下指针:
修改之后的指针:0x5010-0xBF4 = 0x441c
倒叙之后就是0x1C44,我们替换一下源字符串的指针,上面说到了是:0x3C14
这就改好了,我们这时候可以用IDA进行验证一下:
可以看到我们修改应该是成功了。
Java版代码下载:
C++版代码下载:
但是最终的验证是集成到Android程序中测试:
测试Demo下载:
果然成功了。