最近在调研 小米开放平台 API 的能力,发现能力支持的实在有点少,没办法只能另辟蹊径去逆向 Consule UI 的能力。
逆向工程最重要解决的就是“认证”。有没有办法自动登录鉴权,或者使用一个长久可靠、可续期的 token,直接决定了该 Consule UI 是否可逆向。
把这个 cUrl 精简一下:
然后发现我们需要解决的问题有 user、hash、captCode、EUI。
然后,就去翻小米 js 中加密这些的逻辑,在这个 JS 里面。核心代码是下面这段(有些变量被我重命名了):
直接说结论,随机生成 16 位字符串作为密钥,先 Base64 后,再 RSA 加密,publicKey 就是这串:
加密出来的信息和 "user" 字符串的 Base64 拼接就是 EUI,并传递给服务端;user 是用 AES 加密的,密钥就是随机生成的 16 位字符串,iv 向量是固定的 0102030405060708
, padding 方式是 AES/ECB/PKCS5Padding
; hash 是密码简单 MD5,没有加 salt 操作;captCode 触发时机无法知晓。
有了以上信息后,我们就能直接通过 username + password 的方式登录小米开放平台了,返回信息如下:
然后直接访问返回的 location 地址,在 reponse 的 header 的 set-cookie 信息里面就能找到 serviceToken 的信息,这个就是开放平台的鉴权信息,Consule UI 所有的接口都能用 serviceToken 来访问。