想分析下陌陌的一些功能,想不到陌陌还做了蛮多保护。分析使用的是5.2版本,这个版本进行了加壳,先要把壳脱掉,脱壳因为有万能的脱壳机,这里过程就略过了,主要讲下过签名校验吧。
过签名校验看雪上有同学之前有讲过,不过是2012年的,陌陌的文件名已经完全不一样了,不过他的签名获取代码还是跟以前类似,可以借用来定位一下代码位置。
用apk改之理对脱完壳的APK进行分析,然后在工程里搜索collectCertificates字符串,找到签名校验的相关代码的位置。
经过netbeans下断点确认,校验签名是LINE 6016的位置
JEB分析该APK,找到该函数位置,得到该函数比较清晰的JAVA伪码
还是继续用netbeans来分析吧,netbeans查看调用堆栈非常方便(netbeans的调试功能结合JEB的交叉引用识别功能,实在是一大利器)
利用JEB的引用跳转功能,把堆栈途经的几个函数看一下
cp.d函数如下图:
这个函数就是计算MD5的
到这里已经很清楚了,它就是把APK签名的signature计算下MD5,然后发送到服务端,由服务端来判断签名是不是正确,不正确就不让登录了。
那么我们这里只要能够给服务端发送一个正确签名的MD5就万事大吉了。
怎么得到正确签名的MD5呢,从h.d()函数,可以看到,它是从一个APK文件来获取签名计算的。
把原始apk拷贝到/sdcard/目录下,路径名设为/sdcard/momo.apk,然后在netbeans的h.d()函数里,创建文件后的位置下断
然后直接把这里的v4变量里的path改成/sdcard/momo.apk,netbeans修改变量的功能还是蛮爽的。
到这里,签名MD5就跑出来了。直接在这里把v0设为这里跑出来的MD5,然后重新打包,签名就OK啦
小结:陌陌的签名校验是跟登录结合起来的,其实这个时候服务端可以发挥更大的反分析反调试功能,一旦发现是特定签名的MD5,直接把这个陌陌号禁用掉,不让登录,会给调试分析者带来不小烦恼。