常规操作,设置代理准备抓包,启动APP进行登录,对抓取到的包进行分析,最好抓2次进行对比,分析哪些参数的数据有变化:
将APP进行反编译,我用的jeb,通过搜索关键字"nonceStr"定位到代码块:
参数和抓取到的数据包都对的上,应该就是这里了。
通过分析得知this.pwdMD5 = MD5.md5Encode(MD5.md5Encode(v1)); 将密码进行了两次MD5,将密码进行两次MD5后与抓取到的数据包中password的值进行比对确定正确,密码分析完毕接着分析sign:通过以上代码得知最后会将所有参数放进v0然后调用encryptParam方法进行签名;进入encryptParam:
调用了encryptMap方法,接着查看该方法:
该方法使用迭代器将名值对之间使用=连接,名值对之间使用&连接,然后带上"key=09ebcc6549b6fad41e0b857459c5b2be"或者"key=75cba6dd6d4d75154624dbe9d770d451",调用toString()接着进行一次MD5计算v2 = MD5.md5Encode(v4.toString()); ,进入md5Encode(),arg9就是我们要得到的内容:
将string类型的字符串arg9中包含的字符转换成byte类型并且存入一个byte[]数组中。在java中的所有数据底层都是字节,字节数据可以存入到byte数组。
我们需要查看v4,v4对应的为p0,所以我们在v7处下断点,点击登录,断在v7处,光标移动到p0上,查看到对应的寄存器为v9:
查看到v9的值为11111111,跳到下个断点查看v7的值,得到我们需要的sign前的数据:
"countryCode=86&nonceStr=zCQk2LKRX5TPOjEebtzNOYNL2CcONEfA&password=d0521106f6ba7f9ac0a7370fb28d0ec6×tamp=1593148369531&userName=11111111111&key=75cba6dd6d4d75154624dbe9d770d451"
即为签名前的数据,回到v2.toString();查看数据签名后最终的值,在v7处下断点,查看v2的值,发现此时还没有转换为string,点击跳转到下一条语句,查看v7,得到值"6662f70966515739e6e294832cca030b",即为签名的值:
将以上需要签名的值进行MD5计算后与v7得到的sign值比对为一致