我一直在尝试使用 Xposed 和数据包嗅探的组合对 Android 应用程序的通信协议进行逆向工程。应用程序发送的大多数数据包都设置了以下标头:
Content-Type: application/octet-stream
这让我相信它是某种字节数组。嗅探到的数据包主体是用我不认识的东西编码的,但多亏了 Xposed,我可以获得解码版本。这是我从服务器收到的:http : //i.imgur.com/lIV6BiQ.png(原始数据位于http://bit.ly/2g5JKgH)。我尝试了各种解码方法都无济于事。在 Xposed 中挂钩一些接收最终解码数据的方法后,我发现我嗅探的数据的解码版本是这样的:
{"miis":[{"owner_player_id":"12bea2c3d7654b66","position":"12bea2c3d7654b66"}],"SAKASHO_CURRENT_ASSET_REVISION":"","SAKASHO_CURRENT_MASTER_REVISION":"b324a24d2cf7cd0effb2941e9f5e515456e9e82d","SAKASHO_CURRENT_DATE_TIME":1480231467}
我不确定它是如何被解码的,但我有一些线索。首先,编码数据包的大小为 183 字节,而解码版本的大小为 231 字节。这让我相信它正在使用某种压缩。客户端还向支持此功能的服务器发送 Accept-Encoding: gzip,但是在使用 gzip 对其进行解码后,我仍然得到无法读取的数据,我认为这意味着正在进行某种加密。查看应用程序的代码,从 smali 翻译成一个粗略的 java 等价物,这是应该接受一个字节数组并吐出一个 String 的方法
public static String a(byte[] bArr) {
if (bArr == null) {
return null;
}
try {
return new String(bArr, "UTF-8");
} catch (Throwable e) {
throw new RuntimeException("Can't happen!", e);
}
}
然而,当我试图在我自己的 Java 程序中复制它时,我总是得到数据的原始奇怪字符表示。
我想知道的是,原始数据包数据如何到达最终的、未压缩的 json 结构,它是一种通用编码方法,还是应用程序开发人员自己制作的一种。
提前致谢。