这是什么加密/压缩,以及如何对其进行编码/解码?

逆向工程 加密 解压 函数挂钩 嗅探
2021-07-11 06:22:46

我一直在尝试使用 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 结构,它是一种通用编码方法,还是应用程序开发人员自己制作的一种。

提前致谢。

0个回答
没有发现任何回复~