1.使用Charles+Postern配合抓取目标APP登录数据包(测试用户名:13211112222、口令123456)。
2.简单分析登录数据包我们可以发现,我们输入的账号数据被保存在uid字段,而口令字段非明文显示,可能是vkey或者auth字段。进一步,我们尝试使用不同的口令登录,发现仅仅auth字段发送了改变,其他字段保持不变,故初步判断app使用特定的算法对我们输入的口令进行了加密。
3.查看app的加固情况,发现app未加壳,使用jadx对app进行反编译分析。
4.为了确认具体的加密方法,我们利用hook技术,在程序运行时打印hashmap的输入与输出情况,从中我们发现我们输入的账号与口令信息确实保存在hashmap中。
5.打印系统的堆栈信息,进一步确认调用hashmap存储auth的值的具体方法名。
6.基于以上分析我们可知,登录过程中,app调用了activity.LoginActivity.login这个方法对输入的数据进行了处理,故我们对该方法进行静态/动态分析。
7.从代码我们可以看成,login方法本身不具备参数,同时也没有返回值,故我们输入的数据应该是在login方法体中调用的某个方法实现的。根据方法语义, ZhongYiBangUtil.getMD5()方法的最后返回值赋值给了md5TwicePwd,很大可能该方法的返回值就是我们需要的加密结果,故我们进入ZhongYiBangUtil.getMD5()中,利用hook技术,打印相关输入输出信息。
8.根据方法的名字(getMD5),以及我们输入参数与加密后的结果进行对比,发现该算法确实为md5,同时auth的值(7fc6cc53f75e8308039437c9d11d247e)是由(e10adc3949ba59abbe56e057f20f883e6ea43c70f3c0d6f9fb2a238a62a7c744)进行md5算法得到的,而e10adc3949ba59abbe56e057f20f883e6ea43c70f3c0d6f9fb2a238a62a7c744由e10adc3949ba59abbe56e057f20f883e与6ea43c70f3c0d6f9fb2a238a62a7c744拼接而成,e10adc3949ba59abbe56e057f20f883e为我们口令的md5值,6ea43c70f3c0d6f9fb2a238a62a7c744为固定字符串xi**y的md5值。至此,通过逆向,我们发现该auth字段的加密规则为,先对用户输入的口令进行md5运算,运算的结果与6ea43c70f3c0d6f9fb2a238a62a7c744拼接起来,再进行一次md5算法即可得到。我们用helloworld这个口令来验证我们的猜想。
原文始发于微信公众号(Matrix1024):某简单APP登录算法分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论