● MD5
● RC4
● 斐波那契数列
● BAS64
● SHA-1
● UTHASH
● 单项链表
● ZIP
参考资料的2和3是关于UTHASH与sha1withRDA的介绍,感兴趣的话可以看一下。
2.3 自定义的结构变量
2.3.1 APK\assets\meta-data\ manifest.mf文件格式
BB在其防篡改功能说明中说到,会为每个文件分配一个识别指纹,那么这个指纹到底存在哪里呢。经过分析发现APK\assets\meta-data\ manifest.mf文件存放的就是对应的指纹信息。下面介绍一下这个文件的格式。
图 2‑1 [APK\assets\meta-data\ manifest.mf]
从上图中可以看到这个文件的内容看起来像是BASE64编码,实际上是不是呢,我们可以验证一下,先将文件开始像base64编码复制出来如下:
表 2‑1 [[APK\assets\meta-data\ manifest.mf文件格式]
整个签名校验的过程就是验证上面的4个文件指纹。在后面的分析中我们会真正的了解。
2.3.2 BB_HashTable 数据结构
BB_HashTable主要用于存储APK\\META-INF\ MANIFEST.MF文件内容的。APK\\META-INF\ MANIFEST.MF文件存储的是APK包中所有文件的SHA1签名:
其定义如下:
这个结构主要是保存加固时APK的原始签名。如果实现防篡改功能,势必要保存原始APK的指纹信息,然后与当前APK的指纹信息进行对比,从而来判断是否被篡改。
这个结构对应的数据内容在如下目录:APK\assets\meta-data\ manifest.mf,其定义如下:
本文件是识别指纹的核心文件,里面共存储了4种类型的文件指纹如下;
● 指纹1:原始APK单个文件sha1字符串的前4个字节
● 指纹2:原始APK单个文件对应的CRC32的低4个字节
● 指纹3:指纹1组合起来的SHA1的base64
● 指纹4:指纹2组合起来的SHA1的base64
其中ras.sig保存的是manifest.mf的RSA加密后的签名。Ras.pub保存的是RSA的公钥信息。BB不大可能拿到APP开发者签名的私钥,因此这个ras.pub应该是BB自己的公钥。这2个文件的作用其实就是验证原始的文件指纹是否被篡改。
3.1 识别指纹生成流程
4 验证流程
整个验证流程可以分为如下8个步骤:
1、 验证原始APK的文件指纹(manifest.mf)、文件指纹的签名(cert.sig)以及公钥文件(cer.pub)是否被篡改,如果被篡改,则终止应用;
2、 提取原始manifest.mf的4种类型的文件指纹;
3、 提取当前文件的sha1,其中包括当前文件指纹1;
4、 提取当前文件的CRC32,包括当前文件指纹2;
5、 对当前文件指纹1与原始文件指纹1比较,如果不一致,则终止应用;
6、 对当前文件指纹2与原始文件指纹2比较,如果不一致,则终止应用;
7、 将当前APK所有文件指纹1组合成一个字符串,并计算其整体的SHA1,然后再base64,即获得当前APK的文件指纹3,与原始的文件指纹3进行比较,如果不一致,则终止应用;
原始APK文件指纹文件包括如下三个文件:
● manifest.mf:原始APK的文件指纹,文件格式见2.3.1;
● cert.sig:manifest.mf经过RSA加密后的签名;
● cer.pub:用于验证cert.sig的RSA公钥。
这里的RSA签名,并不是APK开发者的签名,而是BB自己的签名。
在BB的libdexhelper.so文件中保存着cert.pub的MD5值,但是这个MD5值是经过加密后的,而且其加密的流程还是比较复杂的。解密流程首先 实现了一个从APK文件中提取文件的C语言版本解压程序,包括如下函数:
● dexZipOpenArchive //打开zip文件获得ZipArchive结构
● dexZipFindEntry //从ZIP中获取指定文件的入口结构
● dexZipGetEntryInfo //得到指定文件入口结构对应的信息
● ReadToBufFromZipFile //将指定文件的内容读到BUF中
● dexZipCloseArchive //关闭zip文件
利用上面的函数,将cert.pub读取到内存中,然后计算其MD5值。接着开始获取原始APK的MD5值,其经过如下4个步骤:
1、计算0x52600开始0x1000个字节的MD5 值;
2、构造一个斐波那契数列,1 1 2 3 5 8 13 21 34 55;
3、以斐波那契数列为索引从数组0x52600取出对应的数值,然后与步骤1得到的MD5值按字节亦或,获得一个0x10大小的KEY。实际上是下面RC4解密的KEY
4、利用步骤3获得的RC4 KEY ,对525E0开始的0x10大小的数据,进行RC4解密。解密的结果就是原始的cer.pub对应的MD5值。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课