@(某秋航空算法)
逆向某秋航空算法
经抓包分析得知,某秋app每次页面请求,会先向/ECMember/secretKey/getSecret 发送一次请求,很有可能是获取密钥,请求和响应均是base64编码后的密文。
抓包分析
反编译
这里我们用jeb打开
从图中看到,加了壳,从包名可以看到是梆梆的壳,我们用IDA调用,并从内存中dump出dex的方式脱一下壳,并用jadx打开并导出源代码,用idea打开
寻找data和响应报文处理逻辑
直接在idea中打开搜索,并输入"data"
我们选择 HttpRequestUtils的a方法并进去,看到内容如下
public static String a(ReselectSeatArg reselectSeatArg) throws RemoteAccessException {
...
try {
String[] a = DESCrypter.a();
Map hashMap2 = new HashMap();
hashMap2.put("data", DESCrypter.c(JsonConvert.a(hashMap), a[0]));
String a2 = new HttpRequesterProxy(UrlConstant.Y, hashMap2, 30).a();
if (a2.trim().length() != 0) {
return a2;
}
throw new RemoteAccessException(BasicUtils.a((int) R.string.ERR001));
} catch (Exception e) {
throw new RemoteAccessException(BasicUtils.a((int) R.string.ERR001));
}
}
是一个DES算法,进入DESCrypter.a()
public static String[] a() throws Exception {
return a.getSecrets(new HttpRequesterProxy(UrlConstant.N, 30).a());
}
这里跟前面我们抓包分析得一样,是取密钥的。
再进入 DescrypterUtil的getSecrets方法
public java.lang.String[] getSecrets(java.lang.String r1) {
....
}
还原算法
public static String recvData(String str) throws IOException {
...
}
public static String decode(String arg10) throws Exception {
...
byte[] decode = Base64.decodeBase64(arg10);
return new String(v0.doFinal(decode), "utf-8");
}
public static String encode(String arg9) throws Exception {
SecretKey v1 = SecretKeyFactory.getInstance("desede")
.generateSecret(new DESedeKeySpec("**************)".getBytes()));
Cipher v0 = Cipher.getInstance("***/***/****");
v0.init(1, ((Key) v1), new IvParameterSpec("***".getBytes()));
return Base64.encodeBase64String(v0.doFinal(arg9.getBytes("utf-8")));
}
验证算法正确性
将抓包取得的请求参数data和响应报文解密,均还原出了可读的json字符串,说明加解密已完全成功。
有对安卓逆向感兴趣的朋友们,可进群:912146030 共同交流、进步。