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

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



3)、sh_flags:段的属性,这个字段的取值如下:

/*****************sh_flag***********************/ public static final int SHF_WRITE = 0x1; public static final int SHF_ALLOC = 0x2; public static final int SHF_EXECINSTR = 0x4; public static final int SHF_MASKPROC = 0xf0000000; public static final int SHF_MIPS_GPREL = 0x10000000;这个我们看到字段就知道每个属性是什么意思了,这里我们设置成可分配属性:ALLOC


4)、sh_addr:段被映像到内存中的首地址,也就是这个section的起始地址,也就是文件的末尾地址在加上section name的大小,看到代码,我们把section name大小设置成了0x10,也就说新加的section段的name长度不可超过16个字节,当然这个数值是可以改的,但是我感觉没必要了,因为一个section name没必要搞那么长。那么这里的值就是:文件的长度+0x10


5)、sh_offset:这个字段是值该段到文件开始位置的偏移值,这个值我们想一下就知道他的值和sh_addr的值应该一样的。


还有其他字段需要设置,但是这里没必要做解释了,所以就和.rodata段的值保持一致即可。这里就不再做介绍了。

上面就构造了一个Section Header了,那么这个头部加到哪里呢?肯定也是文件末尾处了,看上面的图就知道了:


第二步:添加New Section 的内容到文件末尾

这一步我们主要是添加一个空白的段在末尾处,大小我们这里设定为1000个字节。

/** * 在文件末尾添加空白段+增加段名String * @param src * @return */ public static byte[] addNewSectionForFileEnd(byte[] src){ byte[] stringByte = newSectionName.getBytes(); byte[] newSection = new byte[newSectionSize + newSectionNameLen]; newSection = Utils.replaceByteAry(newSection, 0, stringByte); //新建一个byte[] byte[] newSrc = new byte[addSectionStartAddr + newSection.length]; newSrc = Utils.replaceByteAry(newSrc, 0, src);//复制之前的文件src newSrc = Utils.replaceByteAry(newSrc, addSectionStartAddr, newSection);//复制section return newSrc; }

这里在添加顺便把Section name也添加进去了,那么长度就是1000+0x10个,位置是在文件的末尾。


第三步:修改String Section Header中的大小

因为我们新加的Section name在String Section中,所以我们还得修改一下String Section的大小了

/** * 修改.strtab段的长度 */ public static byte[] changeStrtabLen(byte[] src){ //获取到String的size字段的开始位置 int size_index = sectionHeaderOffset + (stringSectionInSectionTableIndex)*sectionSize + stringSectionSizeIndex; //多了一个Section Header + 多了一个Section的name的16个字节 byte[] newLen_ary = Utils.int2Byte(addSectionStartAddr - stringSectionOffset + newSectionNameLen); src = Utils.replaceByteAry(src, size_index, newLen_ary); return src; }我们知道String Section Header中的sh_size字段是记录大小的,所以我们找到String Section Header然后修改这个字段的值就可以了,那么现在的String Section的大小是多大呢?

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


新的String Section的大小变成了,new section name的结束位置减去String Section的起始位置,也就是:

文件末尾+0x10 - 0x3075

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


我们需要把0xb8改成最新的值就可以了。这个sh_size字段也是好定位的。

首先知道String Section Header,然后替换sh_size位置的字节数即可。


第四步:修改elf头部中section的count数

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

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