- 本博客以技术交流为主,提供的内容可操作性不得用于任何商业用途和违法违规场景。
- 本人对任何原因在使用教程中提供的策略以及技术分享可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。
- 如有侵权,请联系我 feilang235 进行删除。
目标
本文主要介绍了贝壳app的加密算法。
贝壳版本: 2.59.0
加密参数:Authorization
加密算法:sha1
研究成果:成果逆向获得贝壳完整的加密算法,并且用python复现了该算法。
抓包
从豌豆荚下载最新版的贝壳app。目前最新版的是 2.59.0。因此就直接分析最新版了。
首先抓包,为了避免信息太多就抓一个房源信息的吧。
通过分析,我们知道了 这个 Authorization 就是加密的字段了。分析过程就不表了,这个很简单。多抓几个包,或者修改下参数对比下就行了。
既然知道了加密字段,接下来,我们就用jadx 打开 app 然后分析下代码。
查看源码
用 jadx 打开 apk 代码。首先查看包名。
在 AndroidManifest.xml 中可以看到包名是:com.lianjia.beike
直接搜索关键词:Authorization 一共出来 232个。
接下来需要分析哪个是我们需要找的加密代码段。这个部分一般是耗时比较长的。当然如果你做的足够多了也有一些技巧。我大概花了十分钟定位到了这个函数。
点击去后查看,就是 包名是:com.bk.base.netimpl.a
为了确认我的想法,用 frida hook 一下c 这个函数,加一个日志。
Hook 代码。
1 2 3 4 5 6 7 | var netimpl = Java.use("com.bk.base.netimpl.a");
netimpl.c.overload('java.lang.String', 'java.util.Map').implementation = function (a1, a2) {
console.log("netimpl:"+a1.toString());
var res = this.c(a1, a2);
console.log("Auth:" + res.toString());
return res;
};
|
果然每次请求涉及到Authorization的都会调用这个方法,稳了。既然找到了加密方法,接下来就是对加密的参数进行分析了。
Frida 调试代码
我在分析的过程中喜欢用 frida 进行调试,而且随时可以加 hook 代码。动态的谁不喜欢呢。
Authorization 就是调用 c 这个参数生成的。如果不想分析了,只是简单调用,那就简单了。用 frida 写一个 rpc 方法。提供一个 flask api 就可以生产加密后的结果了。
当然我们今天的目的还是分析算法。
算法分析
通过上面的截图可以看到 生成Authorization 的是 c 方法。实际是在 a 方法里面调用的。调用 c 有两个参数 一个是 url 另一个是 map,但是传进来的是空。所以只有一个字段。
c 函数分析。
- 获取所有请求的参数,然后变成一个map
- 如果 参数2 有值,则把 参数2更新到 map 里面
- 对 map 取entrySet 并且按照key 排序,结果是ArrayList
- 从 JniClient 里面获取 httpAppSecret 字段
- 继续从 JniClient 里面获取 httpAppId 字段
- 用 httpAppSecret 和 arrayList 进行组合得到一个字符串 sb
- 将 sb 送到 DeviceUtil.SHA1ToString 这个方法加密得到 SHA1ToString
- 将 httpAppId和 SHA1ToString 组合并且进行 base64.encodeToString 转换得到最后的结果。
那么上面流程最重要的就是 4 and 5 获取了 httpAppSecret and httpAppId 加密字段。还有 DeviceUtil.SHA1ToString 这个加密算法了。
首先分析 httpAppSecret 和 httpAppId 的获取。使用 frida 写一个 hook 函数,主动调用一下。很容易就获取到了。
接下来分析 SHA1ToString 方法。方法截图如下:对应看过来就是一个 SHA-1 的加密。简单。
最后用 python 实现下 Authorization 的加密算法逻辑。



