一次逆向失败

记一次失败的逆向&未完待续???

据说失败是成功之母。。汪汪汪。。

于是记录下这次失败的逆向过程。。汪汪汪。。
希望有朝一日能够成功~蠢真脸。

一次逆向获取接口的过程

抓包过程

抓包图片

返回的值做一些处理可以得到查询者的个人信息~

这些值不会变动一次获得可以反复使用~

以上已经验证~所以现在只要知道每个参数应该怎么填写就可以了

逆向apk搜索关键字

使用的工具是apkIDE 和 jadx

接下来就是搜索定位关键代码。首先通过反复抓包可以定位些固定值。这样我们除去了:
username,是提交的信息,
signatureMethod signatureVersion format appId 是固定值,
timestamp 为时间戳。

所以只剩下了
signatureNonce signature

逆向中没有 .so文件 所以加密算法应该都存在于代码中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   public static String doPost(String url, String appId, String appKey, Map<String, String> params, String agent) throws Exception {
Map<String, String> apiparamsMap = new HashMap();
if (params != null) {
apiparamsMap.putAll(params);
}
apiparamsMap.put("appId", appId);
apiparamsMap.put("format", "json");
apiparamsMap.put("timestamp", formatTimestamp(new Date(System.currentTimeMillis())));
apiparamsMap.put("signatureMethod", "HMAC-SHA1");
apiparamsMap.put("signatureVersion", "1.0");
apiparamsMap.put("signatureNonce", UUID.randomUUID().toString());
apiparamsMap.put("signature", computeSignature(apiparamsMap, appKey));
return getResult(url, paramsToQueryString(apiparamsMap), agent);
}

}

发现”signatureNonce”是由 UUID.randomUUID().toString()随机生成的~所以只剩下了signature。
同样查找signaturesc生成的方法。

继续探索signature的生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private static String computeSignature(Map<String, String> parameters, String accessKeySecret) throws Exception {
String[] sortedKeys = (String[]) parameters.keySet().toArray(new String[0]);
Arrays.sort(sortedKeys);
String SEPARATOR = "&";
StringBuilder canonicalizedQueryString = new StringBuilder();
for (String key : sortedKeys) {
canonicalizedQueryString.append("&").append(percentEncode(key)).append("=").append(percentEncode((String) parameters.get(key)));
}
StringBuilder stringToSign = new StringBuilder();
stringToSign.append(HttpPostHC4.METHOD_NAME).append("&");
stringToSign.append(percentEncode("/")).append("&");
stringToSign.append(percentEncode(canonicalizedQueryString.toString().substring(1)));
return calculateSignature(accessKeySecret + "&", stringToSign.toString());
}

将经过处理的字符串传到了另外一个方法 进行加密

以这样的方式可以找出涉及到的方法和主要参数

1
2
3
4
5
6
private static String calculateSignature(String key, String stringToSign) throws Exception {
String ALGORITHM = "HmacSHA1";
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(new SecretKeySpec(key.getBytes(CharEncoding.UTF_8), "HmacSHA1"));
return Base64.encodeToString(mac.doFinal(stringToSign.getBytes(CharEncoding.UTF_8)), false);
}

…以下省略部分加密函数和参数。
然后全部找齐了
注:这个过程中可能会涉及到一些java包里面的方法。需要自行下载添加。而不是一直找下去。因为逆向的文件会把依赖的java包
全部以代码的形式表示出来,所以每次从其他包找到需要的方法时,都要看一看是不是依赖的java包。否则会一直找下去。

现在所有方法都齐了。

然而问题来了。。签名错误。。
这是一个失败了也没找出错在哪的过程【掩面
所有的参数都可以生成来着..

跟进。。在核对签名方式小进展+1

希望可以来写后记TUT

9.25 更新!加密方式已破解!撒花撒花撒花~
突破点 base64加密用的包是import android.util.Base64;
用AS码了一遍就对了~
解密成功
。。此贴终结

备注:以上只是为了个人学习所做的尝试

`