根据MTK的文档如果在没有preloader.bin或按下下载键时会以Bootrom的方式下载,否则以Preloader的方式下载版本。

以上两种下载方式都会跳转到DA(下载代理),然后由DA完成下载版本。从代码可以找到跳转DA的控制指令时0xD5。我们现在想进行试验,将0xD5修改为其他值导致跳转DA失败。

由于Bootrom是固化在芯片中的,我们无法修改,所以研究preloader这种方式,首先说一下preloader.bin的生成过程,c文件和asm文件编译为.o中间elf格式文件,再ld 这些中间文件和一些.a库文件生成1.bin,将一个固定的bin文件追加到1.bin尾部得到2.bin,在2.bin基础上会将featrue_bex加到尾部,MTK_Loader_Info加到头部,这个是build preloader阶段,接下来是post process过程,通过key_Encode_Tool工具生成*_NO_GFH.bin,最后通过PBP工具生成最终的preloader.bin。
通过对比*_NO_GFH.bin和preloader.bin文件,发现preloader.bin比*_NO_GFH.bin多了一个头部和一个尾部。再通过平台编译log分析,也能看出加了一个长度为0x300的头部,和长度为292的尾部。

所以我们的想法是以preloader.bin为基础,去掉头尾后即*_NO_GFH.bin,然后再修改二进制文件,再以此文件重新PBP生成新的preloader.bin。
分析二进制文件,找到修改的地方,将d5 2b 修改为 01 2b

修改后验证失败,无法通过0x01指令跳转到DA完成下载。开始时怀疑是不是代码还有完整性的保护措施,为了定位问题,将原二进制文件的某个字符串修改一下,这样可以验证是修改逻辑的问题还是代码中还有完整性的保护措施,修改字符串后多次下载均成功,说明是修改后逻辑出现了问题。
通过查看汇编发现问题如下:
当值大于D2时会进入loc_318,而D5的处理在loc_318中执行。所以如果仅是简单的将0xd5修改为0x01,则永远无法执行,因为0x01小于0xd2,就不会进入loc_318。

确定问题后解决方法有两种:
1. 0xd5 修改为0xd6,0xd6在代码中没有使用。
2. 0xa2的处理过程与0xd5相似,都只是调用BEQ.W,可以将地址改为loc_4AE. 并且通过bus hound工具确认在下载版本和格式化的过程中0xa2指令没有使用,所以可以修改。
找到0xa2的位置将00 f0 30 81修改为00 f0 bf 80

修改后验证失败,经过逆向分析不能直接修改为00 f0 bf 80,因为这是相对地址。所以首先要知道BEQ.W的指令怎么编码的,通过查找资料如下:

很明显与我们的实际数值不相符,但假定0-15位就是偏移地址,并且基址是pc+4。
Bf 80的二进制是10111111 10000000,当运行到BEQ.W loc_4AE时pc+4是0x330,则0x4AE-0x330=0x17E=b 101111110。我们发现这个值相当于在BF(10111111)后增加了一位0。
我们再看一下0x4D,00 f0 4b 81, 4b 81的二进制01001011 10000001,当运行到BEQ.W loc_5BC时pc+4是0x326,则5BC-326=296=b 1010010110。我们发现这个值相当于在4b(01001011)增加了最高位1,又增加了一个最低位0.
总结:最终的偏移地址是10位,其中最高为如果是0x80则为0,如果是0x81则为1,最低位始终为0,中间的8位是这样计算的:目的地址-(pc+4)。
但有一个问题,我们一般是不知道loc_4AE这个地址的,那怎么办呢?

我们从上图可以看出第一函数usbdl_put_byte从代码段的0x04地址开始,内容是07 B5。假定所有的平台这段代码都是以函数usbdl_put_byte开始的,则以usbdl_put_byte为基准,在.bin文件中搜索07 B5,找到第一个出现的位置(根据已知bin情况假定所有bin都出现在第一个位置),例如地址是0x16bcH;再搜索d5 2b,找到d5 2b 00 f0 c7 80, 00 f0 c7 80的地址是0x197aH。那么我们想要找的形如loc_4AE这个地址可以这样求得:197a-16bc = 2be,2be+4=2c2,c7=11001110,因为是80,所以头尾加0,得到18e,18e+(PC+4)=18e+2c2+4=454。所以454就是我们要找的地址。
按此修改试验成功。
新浪博客:
373K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2K6K9h3&6S2i4K6u0W2j5$3!0E0i4K6u0W2j5$3&6Q4x3V1k6#2i4K6u0r3x3K6p5I4z5e0p5%4y4o6x3J5y4H3`.`.
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!