才来论坛不久,也没啥贡献,就把以前分析的合富app的加密算法整理一下,希望对新手有点帮助,望各位大神勿喷。
合富app登录的数据包是加密的,通过fiddler抓包如下:
[HTML] 纯文本查看 复制代码 GET https://www.hfmoney.com/app/services?OPT=1&_t=2017-03-15+21%3A55%3A24&body=&channelId=&deviceType=1&name=15228092368&pwd=5351A9FF600213484726DD26015C2CA0&userId=&_s=dada859999a0aa578db4b7e504889319 HTTP/1.1
5351A9FF600213484726DD26015C2CA0的原始参数是s11223344
发现pwd和_s是加密的,我们先来分析_s的加密
把合富APP拖入AndroidKiller反编译,打开java源码然后搜索_s
搜索的结果有两处,类FileProvider和类GeneralRestGateway
打开类FileProvider看了下,发现不是
打开类GeneralRestGateway粗略的浏览边代码,里面有_s的赋值处,很快就定位到加密处,代码如下:
在这处for循环里,通过一些条件判断,最后调用Encrypt.MD5()来对_s进行加密,
根据以前的经验来看,_s是对参数校验,继续跟进Encrypt.MD5()
发现就是一个MD5加密,_s的静态分析到这就完了,我们利用ddms调试输出下,
在smali的com.shove.security.Encrypt的MD5方法下添加如下代码:
保存编译,拖入模拟器,登录账号,在ddms输出MD5加密前的参数
对输出的值进行MD5加密,发现跟抓包的完全符合,至此,_s的参数MD5校验加密分析完毕。
接下来分析pwd密码的加密
打开java源码然后搜索pwd,发现有一个LoginActivity类
我们直接跟进去
localMap.put("pwd", DataHandler.encrypt3DES(str));这句代码的意思是把DataHandler.encrypt3DES(str)的值赋值给pwd
粗略估计DataHandler.encrypt3DES类方法就是对pwd的原始参数进行DES加密,继续跟进DataHandler.encrypt3DES类方法
发现又调用了Encrypt.encrypt3DES()方法,且传递了两个参数,粗略估计是传递密码跟key进行DES加密
搜索KEY_DATA发现在这个类中有赋值,但java源码查看失败,我们直接看smali代码
发现KEY_DATA的值为GDgLwwdK270Qj1w4
继续跟进Encrypt.encrypt3DES()方法
到这发现加密是通过调用Des.encrypt()方法,然后通过Byte.byte2hex()字节集到16进制的转换返回
分析到这静态分析基本完了,我们利用ddms调试输出下
在smali的com.shove.security.Encrypt的encrypt3DES方法下添加如下代码:
保存编译,拖入模拟器,登录账号,在ddms输出值如下:
然后我们直接把它带入des算法中计算,计算如下:
发现跟抓包的结果一样,所以分析的没问题。
帖子中用到的des算法:
链接:http://pan.baidu.com/s/1dEEzhmD 密码:1m5h
|