今天我们要分析的app 是5aSn5ram5Y+R5LyY6bKcdjEuNC4w
(base64),小伙伴们可以去各大应用商定自行下载,软件使用360壳且混淆,APP校验了HTTPS证书,需要使用xposed的JustTrustMe模块。
参考链接:https://core.vivcms.com/2020/08/14/420.html,
转载请注明出处:
https://blog.csdn.net/weixin_38819889/article/details/122456132
1.抓个包
打开charles抓个包,里面有一个参数叫paramsMD5
,这就是今天要研究的参数。然后打开jadx,搜索半天发现啥也没有搜到,猜测该app是加壳。
2.查壳
我们先打开查壳工具,查一查壳,这里是mac终端使用的,工具叫ApkScan-PKID
,有些壳查不到,但是这里勉强够用了。
可以看到用的是360的壳。
3. 脱壳
然后我们用下葫芦娃的工具FRIDA-DEXDump
,进到frida_dexdump
所在的目录,直接运行python3 main.py
,默认三秒钟,然后就成功把软件的壳脱掉了,拿到dex文件。
再然后把一个个dex文件重新合并拼装,打包成一个新的apk文件,效果如下:
4.jadx静态分析
这里搜索关键字 "paramsMD5"
,就2个地方,点进去看看这个this.f13604a.put("paramsMD5", b(a2));
然后来到这里,
发现 data = a2
,paramsMD5=b(a2);
,其实这里面的a2就是抓包拿到的data,也就是请求传递的body,b()
方法是个啥,跟进去看看。
来到这里,b()
方法java代码如下:
public static String b(String str) {
try {
JSONObject jSONObject = new JSONObject(str);
boolean z = false;
if (jSONObject.has(f13597d)) {
z = jSONObject.getBoolean(f13597d);
}
String str2 = "";
if (jSONObject.has(f13599f)) {
str2 = jSONObject.getString(f13599f);
}
String str3 = "";
if (jSONObject.has(f13598e)) {
str3 = jSONObject.getString(f13598e);
}
String str4 = "";
if (jSONObject.has(f13600g)) {
str4 = jSONObject.getString(f13600g);
}
return b.a(str + (z + str2 + str3 + str4));
} catch (JSONException e2) {
e2.printStackTrace();
return b.a(str);
}
}
这里直接看返回值 b.a(str + (z + str2 + str3 + str4));
,z和str2和str3和str4到底是个啥,跟进去看看。
看到这里我们大概明白了,就是声明一个JSONObject jSONObject = new JSONObject(str);
,就是json对象,然后依次判断取出这四个字段,组装成一个新的字符串,交给b.a()
方法执行。
b.a()代码如下:
public static String a(String str) {
String str2 = "@456yx#*^&HrUU99";
if (e.f13526e.equals(e.a().b()) || e.f13527f.equals(e.a().b())) {
str2 = "@yx123*&^DKJ##CC";
}
try {
SecretKeySpec secretKeySpec = new SecretKeySpec(str2.getBytes(), "HmacSHA256");
Mac instance = Mac.getInstance(secretKeySpec.getAlgorithm());
instance.init(secretKeySpec);
return Base64.encodeToString(instance.doFinal(str.getBytes()), 2);
} catch (Exception e2) {
e2.printStackTrace();
return null;
}
}
看名字,大概就能猜到这里使用的HmacSHA256+base64
组合算法(如果不了解该算法,请看文章: https://blog.csdn.net/weixin_38819889/article/details/122455802),到这里静态分析差不多,拿出我们的frida动态调试一下。
5.frida动态调试
js代码如下:
Java.perform(function (){
var g_class = Java.use("com.rt.market.fresh.application.g");
g_class.b.overload("java.lang.String").implementation = function(v1){
console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
console.log("Sig入参-参数:" + v1);
var res = g_class.b(v1);
console.log("Sig加密后的数据:" + res);
console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
return res;
}
var b_class = Java.use("com.rt.market.fresh.application.g$b");
b_class.a.overload("java.lang.String").implementation = function(n1){
console.log("a方法入参-参数:" + n1);
var res = b_class.a(n1);
console.log("a方法返回-数据:" + res);
return res;
}
})
执行命令看看效果:
frida -U com.rt.market.fresh -l hook_dufxian.js
好了,到此分析完成。
6.算法还原
加密还算简单,最后已经还原成python,测试对比一下paramsMD5: e675/mblyBuNdX8+uWUpx5FwGOHWclKILz2UDDtPDaw=
,值对得上。
完成,手工!