Android逆向之旅---Android应用的汉化功能(修改SO中的字符串内容) (14)

但是这里需要注意的是:“jiangwei"这个字符串比”Hello from JNI !"这个字符串短,所以我们不能改变原来字符串的长度,所以需要用空字符串来补充。这里我们可以看到在修改字符串的时候我们会发现有这些问题:

遵从一个原则:在修改文件的内容的时候,一定不能影响到其他内容的地址,这样会导致其他信息的偏移值发生变化之后,代码就会异常报错的。有了这个原则,我们就有以下集中情况以及处理方法:

1、如果修改的字符串的长度和源字符串的长度相等,那么简单,直接替换就可以

2、如果修改的字符串的长度比源字符串的长度短,那么我们需要用空字符串进行补齐

3、如果修改的字符串的长度比源字符串的长度要长,那么我们就需要这么做了:

1) 在.rodata段、.data段、.string段找到一块空地,在哪里添加一个字符串,这里的so文件,我们看到没有太多的空地,我们看一下下面的这个so文件

Android逆向之旅---Android应用的汉化功能(修改SO中的字符串内容)


如何找到这些段,很简单,用IDA打开so文件,用Ctrl+S搜索,到这个段得到起始地址,然后在用010Editor打开,我们看到有一大片空字符串的地方,这就是空地,我们可以在这里添加一个字符串,添加完之后,我们还需要做一件事:

就是要修改源字符串在代码中的指针(相对地址),如何在文件中找到这个地址呢?很简单:

Android逆向之旅---Android应用的汉化功能(修改SO中的字符串内容)


我们用绝对地址减去偏移值就可以了:0x2030 - 0xBF4 = 0x143C

但是这里又需要注意一个问题,就是高位和地位需要倒叙,这个是因为内存地址都是从地位到高位开始分配地址的。

所以倒叙之后就是0x3C14,这个就是源字符串的指针,在010Editor中查找一下:

Android逆向之旅---Android应用的汉化功能(修改SO中的字符串内容)


然后用同样的方法来计算出新字符串的指针,然后替换即可。

但是我们看到案例的so文件没有空地,怎么办呢?这时候我们就需要自己添加一个段来充当空白地了。


第三、添加新的段(Section)

这个就引出了我们今天的核心内容,如何在so文件中添加一个自己的段信息?

如果要添加一个段的话,我们需要注意哪些问题,步骤是什么?

1、添加段的内容肯定不能影响到以前的信息内容,特别是偏移值,那么按照这个原则的话,我们只能在文件的末尾添加一个段了。那么这时候新加的段的位置找到了。

2、添加一个段我们需要做哪些工作?

Android逆向之旅---Android应用的汉化功能(修改SO中的字符串内容)


1)、构造一个new section header结构,追加到原有的Section Header的末尾即可(在这个过程中需要注意new section中的name在String section中的偏移值,new section的偏移值)

2)、在文件末尾添加一个0x10大小的内容,用于存放new section name.同时在文件的末尾添加new section(),这里我们需要注意的是如何正确的获取到文件的末尾,并不是真正意义上的0x3078的文件大小,而是so文件被映像到内存之后的文件末尾应该是0x5000这个会在后面解释如何获取到的

3)、修改String Section的长度,因为new section name要包括在String section中,所以只需要将原来的String Section长度修改成:
0x5000-0x3075即可

4)、修改ELF Header中的section count值

5)、修改Program Header中的第一个type=LOAD的段的文件大小和内存大小为修改之后整个文件的长度(这个后面会详细说明)


有了上面的步骤下面我们就好办了。直接上代码吧:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgwgjw.html