声明
本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。
本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。
如有侵权,请联系我进行删除
前言
今天这个app是一个入门级别的app,有刚学安卓逆向的小伙伴可以用来练练手
环境
frida 16
手机:idea自带模拟器 api:31
java: openjdk 11
工具包: hutool
反编译: jadx最新版
app: 2025新湖南v11.1.0老旧历史版本安装包官方免费下载_豌豆荚
反编译
用jadx-gui把apk拖进去就行,最近在反编译app时发现一些app用jadx反编译出来会缺少很多代码,关闭jadx-gui下面选项即可

抓包分析
本次逆向的是 头条的feed流接口,抓包看一下加密参数

经过分析,加密参数是头部的 rmt-device-id,rmt-hash,rmt-request-time三个参数
逆向分析
我自己习惯吧jadx-gui反编译的代码导出到idea中查看,导出后直接搜索关键字 rmt-hash 搜索,定位如下

这段代码下面还有一些其他的加密参数,当前接口没有看到,应该是其他接口需要的,我们就不分析了。
首先 rmt-device-id ,见名知意估计是设备id,可以先写死,其次rmt-request-time,当前时间戳,最后分析rmt-hash ,通过上述代码可以看出他是 常量 + list.get(0) + 常量 + 设备号 + 时间戳 做了一个md5, list.get(0)这个值可以直接用frida hook出入参数,或者直接hook下面的MD5Tools.b的入参

这边可以看到,他的值是个固定值 v5,那么大概代码可以如下(java + hutool + fastjson)
String deviceId = "F0556FBDFB0C46958DF722F29214F664C773A2C1";
String time = System.currentTimeMillis() + "";
String hash = MD5.create().digestHex("C50GIK6GDhQNjtMRVRoQbwxVovXCX8DU" + "v5" + "android" + deviceId + time);
@Cleanup
HttpResponse execute = HttpUtil.createGet("https://xhnapi2.voc.com.cn/v5/xhn/geth5data?page_id=22_toutiao&appid=9&page=1&is_h5=0&adviceid=430105&list_version=" + time + "&pagesize=60")
.header("Host", "xhnapi2.voc.com.cn")
.header("os", "android")
.header("user-agent", "xhn/11.1.0 (google/sdk_gphone64_arm64; android/31; okhttp/4.12.0)")
.header("appversion", "11.1.0")
.header("rmt-device-id", deviceId)
.header("rmt-hash", hash)
.header("rmt-request-time", time)
.header("rmt-device-type", "android")
.header("rmt-build", "1101019")
.header("rmt-app-version", "11.1.0")
.header("rmt-app-id", "9")
.execute();
System.out.println(JSONObject.parseObject(execute.body()).toString(SerializerFeature.PrettyFormat));
执行结果如下


被折叠的 条评论
为什么被折叠?



