前言
这一周的应用分析,同样是对数据包网络协议的分析,其中比上一周难度更大的地方在于这一周的应用so文件是用c++写的,由于对c++不是很了解,所以在分析时,使用ida动态调试so的方法来看懂整个函数的逻辑。
分析
网络数据分析
上图可以看到网络数据包与之前的并没有什么变化,有一个sign值和对passoword进行了加密处理。所以同样我们搜索这个网址的url:i.yoyojie.com/user_app_inter/user_login,定位到关键代码。
Java层动态调试
java层的代码与之前两周分析的代码一致,所以并没有什么多说的,动态调试找到进入so层函数的参数值
上图就是传入so层函数生成sign值的参数。其中password很容易就能在java层找到是通过md5加密后的一串数字。接下来我们就应该对so层函数进行分析了。
so层动态调试
之前我们先进行对so层函数的静态分析。
首先函数将输入split,用&为判断条件,存入容器vector中。
函数进入循环,每次循环都取出一个字段的值用find函数找到等于号的位置。然后取出=前边和后边的值,也就是说timestamp=1491102625,我们就取出其中的timestamp和1491102625把他们拼接起来最后做sha1运算
循环中继续用两个substr取出这些值,然后放到map中用于后边的sha1计算
最后是将这些值取出来SHA1UPDATE到最后的计算之前,我们可以看到在字段的头和尾都放入了一个字符串bi2ipxazqodmw9hoety0h1wwgjvkttng一起进行最后的SHA1Final计算。接下来我们动态调试来验证我们的分析。我将断点设置在了两个循环中。ida动态调试的环境配置可以看我之前的关于动态调试的那一篇博客。
首先来看第一个从输入中取值的过程
断点断在了这个函数,一共有四个参数,查看他寄存器的值。
最后一个参数为find函数返回值9,由于第一个字段为device_id=00000000-0231-08c7-f9d0-161d03c74317,“=”号是从第9个字符开始的,再来查看第一个参数和第二个参数,其中r1存放的就是device_id的地址,我们看到上边的代码段有两个substr,其中第一个substr将=之前的key值也就是“device_id”这个字符串放到一个map中去,第二个substr将后边的value值放到一个map中去。动态调试中我们以第二个substr为例来看寄存器和内存的变化过程
跳到b80b479c这个地址去,取出device_id。
通过第二个substr后,此时r0中存的是一个地址值,而这个地址值就正好存放我们的device_id的值。
继续循环直到将四个字段的key和value值分开,分别放入两个map中去后。
直接跳过循环执行到SHA1init中去。
进入循环生成sha1输入的过程,可以很明显的看到这里就执行了两次sha1update也就是每个循环中都连续两次从map中取值,第一次取出key值,第二次取出value值
循环结束再将所有的数进行final运算。这就是sign值生成的全过程。
最后进行sha1运算的数据格式如下
|
|
我们对他进行sha1运算来验证结果的正确性。
与之前数据包中生成的sign值一致。
总结
这个应用又比之前分析的应用难度更大了,由于对c++不是很熟悉,所以用到了静态分析和动态分析结合的方法。so文件在对java层传递给他的参数还进行了处理之后才对其进行sha1运算。总体逻辑是进行了两次循环。所以虽然加密算法非常简单。但在逻辑处理的过程中比较难于分析。