本帖最后由 asdnasiudn 于 2022-9-12 21:50 编辑
第二篇 小爱控制美的空调(美的美居app 分析) 二
第三篇 小爱控制美的空调(blinker集成) 完 -
起因:家里是小米全家桶,但是空调是华凌的,前段时间太热了,空调使用频率比较高,这款空调又不配遥控,每次都要打开app去操作就很烦,想着怎么让小爱来做这件事。
===================================================
本人第一次搞安卓,思路步骤可能和各位大佬不同,有可以改进的地方烦请指出
===================================================
大概流程应该就是
1. 模拟登录
2. 获取设备列表
3. 根据设备id进行操作
首先电脑打开 charles/fiddler , 手机代{过}{滤}理设置为电脑的ip和 charles/fiddler 的端口 ,一般默认 8888
然后开始抓包,发现是 https 抓不到,这个时候一般有两种处理方法
1: 安装 sslunpinning 模块
2: 把 charles/fiddler 导出的证书 导入到 cert 目录
这里我选择方式1 ,因为安卓11上 root 了好像也没法导入证书 还得解锁system 分区,有点麻烦
安装好 sslunpinning 模块 后,重新打开app抓包。
点击登录查看抓包结果,如图所示
很明显第二个接口是登录的,但是它前面还有一个 接口:
[Java] 纯文本查看 复制代码 /v1/user/login/id/get
根据我的经验一般登录接口会用到第一个接口的返回参数,所以我直接没有分析登录接口,直接看的第一个
可以看到 它 idget 接口 的请求头里面有几个关键参数
mc-trace-id | LoginTrackadd07f18e35d443fb05e9264e20bf17e$33c0ad18f210428f8fdcdd78bb601537 | mc-trace-path | 85d64fb37e1045248d4d1e2d4656996f:Android_7.12.0.115#login#getLoginId | mc-trace-timestamp | 1661865238463 | User-Agent | meiju/7.12.0.115 (Android;cepheus11) | sign | ee3f2ccee237b3a9c35b0c67657f397941ddfb29fae67dc87af0f0df423a6f2a |
trace-id ,trace-path 这两个参数可能和后续的登录是串起来的,待定
sign 很明显就是签名了
再看请求体
[Asm] 纯文本查看 复制代码 {"loginAccount":"138****1234","stamp":"1661865138463","reqId":"5f819625a9f943e2b7bea1bca3b6d9c2"}
请求体看着就很简洁
手机号 + 时间戳 + 请求id
那我们现在要处理的就是获取加密算法以及哪些参数参与了加密
现在我们把 app 用jadx打开 ,搜索 sign
搜出来1w多,那怎么找出来我们想要的呢?
其实我也不晓得,于是我搜索了一下 这个请求地址,运气很好只有一个地方在用
找到初始调用的地方,看到 loginAccount 差不多就能确定没找错了
但是浏览了一下代码没有发现和sign有关的, trace 相关的倒是都有,那我们就只差sign参数了.
[Java] 纯文本查看 复制代码
private final Map<String, String> getTrackHeaders() {
LinkedHashMap linkedHashMap = new LinkedHashMap();
linkedHashMap.put(Common.TRACE_ID, LoginLogTrackHelper.INSTANCE.getTrackerId());
linkedHashMap.put(Common.TRACE_PATH, LoginLogTrackHelper.INSTANCE.getTrackerPath());
linkedHashMap.put(Common.TRACE_TIMESTAMP, String.valueOf(System.currentTimeMillis()));
return linkedHashMap;
}
回过头我们看
看着 LoginApi 这个类像是 feign 的写法,上面的import里面也有 okhttp 的类,猜测可能是 okhttp 的拦截器在做加密
于是我们可以搜索
[Asm] 纯文本查看 复制代码 implements Interceptor
查找所有的拦截器
一共50个, 没办法,只能一个一个的看,不过我们也可以筛选一下只需要 看 com.midea 这个包下面的
终于我们在 HeaderInterceptor 这个类里面看到了 sign 相关的代码
核心就是 这句话
[Java] 纯文本查看 复制代码 newBuilder.header("sign", signUtil.sign(request, valueOf))
sign 是由 request 和 valueOf 参数构成, valueOf 看上面的代码发现是时间戳,不用管
那我们直接看 signUtil.sign 这个方法
看到这里基本上就得到了sign 的算法
[Java] 纯文本查看 复制代码 HMAC_SHA256.bytesToLcHexString(HMAC_SHA256.hmac_sha256(mAS_KEY$http_release, DOFConfig.INSTANCE.getIOT_SECRET$http_release() + ((Object) sb) + random));
这里有个很奇怪的问题,我本来是想 写个模块hook 这个 HMAC_SHA256.hmac_sha256 方法 来看一下出入参,但是死活 hook 不到 ,不知道是什么原因,望有知道的大佬不吝赐教..
先得到 IOT_SECRET, 搜一下就能直接得到,这里不做演示
mAS_KEY 需要处理一下 ,需要把搜索到的 mas_key decode 一下
ps: 但是这里的 IEncryption 是一个接口,没法hook, 然后我也忘了我当时是怎么找到实现类的了(最后写代码用).....只记得最后是hook得到的.
sb 就是 request的body 体,
random 是前面传过来的时间戳.
那么至此我们可以获取到 loginId ,为登录做好准备.
核心代码入下:
其实就是把里面的类都抠出来,自己改了一下,这里一定要注意配置忽略ssl,不然会访问不通.
下一篇我们开始分析登录流程.主要是论坛的帖子没法保存草稿..
|