7aGiven / PhiGBot

基于Mirai Console的Phigros查分机器人
5 stars 0 forks source link

[QUESTION]存档解析 #1

Open Dragon-ts opened 1 year ago

Dragon-ts commented 1 year ago

7aGiven,您好,我在GitHub众多代码中发现了您的优秀代码,现想向您问一下您关于解析此phigros云存档的方式 通过您的SaveManager.java内的以下代码 `public static byte[] decrypt(byte[] data) throws Exception { byte[] key = new byte[] {-24,-106,-102,-46,-91,64,37,-101,-105,-111,-112,-117,-120,-26,-65,3,30,109,33,-107,110,-6,-42,-118,80,-35,85,-42,122,-80,-110,75}; byte[] iv = new byte[] {42,79,-16,-118,-56,13,99,7,0,87,-59,-107,24,-56,50,83}; Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key,"AES"),new IvParameterSpec(iv)); return cipher.doFinal(data); }

public static byte[] encrypt(byte[] data) throws Exception {
    byte[] key = new byte[] {-24,-106,-102,-46,-91,64,37,-101,-105,-111,-112,-117,-120,-26,-65,3,30,109,33,-107,110,-6,-42,-118,80,-35,85,-42,122,-80,-110,75};
    byte[] iv = new byte[] {42,79,-16,-118,-56,13,99,7,0,87,-59,-107,24,-56,50,83};
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key,"AES"),new IvParameterSpec(iv));
    return cipher.doFinal(data);
}`

鄙人想这也许即为存档内解密的代码,通过save内各文件(如gameRecord)跳过第一个字节随后进行decrypt函数解密 然而我将这段代码提取出来单独测试时,却发现输出的二进制文件仍不是易读模式,请问是我这里出现了问题,还是您在其他位置放入了新的解析函数呢? 恳请解答,如有打扰请多多见谅

7aGiven commented 1 year ago

7aGiven,您好,我在GitHub众多代码中发现了您的优秀代码,现想向您问一下您关于解析此phigros云存档的方式 通过您的SaveManager.java内的以下代码 `public static byte[] decrypt(byte[] data) throws Exception { byte[] key = new byte[] {-24,-106,-102,-46,-91,64,37,-101,-105,-111,-112,-117,-120,-26,-65,3,30,109,33,-107,110,-6,-42,-118,80,-35,85,-42,122,-80,-110,75}; byte[] iv = new byte[] {42,79,-16,-118,-56,13,99,7,0,87,-59,-107,24,-56,50,83}; Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key,"AES"),new IvParameterSpec(iv)); return cipher.doFinal(data); }

public static byte[] encrypt(byte[] data) throws Exception {
    byte[] key = new byte[] {-24,-106,-102,-46,-91,64,37,-101,-105,-111,-112,-117,-120,-26,-65,3,30,109,33,-107,110,-6,-42,-118,80,-35,85,-42,122,-80,-110,75};
    byte[] iv = new byte[] {42,79,-16,-118,-56,13,99,7,0,87,-59,-107,24,-56,50,83};
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key,"AES"),new IvParameterSpec(iv));
    return cipher.doFinal(data);
}`

鄙人想这也许即为存档内解密的代码,通过save内各文件(如gameRecord)跳过第一个字节随后进行decrypt函数解密 然而我将这段代码提取出来单独测试时,却发现输出的二进制文件仍不是易读模式,请问是我这里出现了问题,还是您在其他位置放入了新的解析函数呢? 恳请解答,如有打扰请多多见谅

感谢您光临我的github项目。 云存档本身就非易读的文本,而是二进制存储。

7aGiven commented 1 year ago

@Dragon-ts 您的问题是否已被解决?

Dragon-ts commented 1 year ago

@Dragon-ts 您的问题是否已被解决?

我最近在努力理解您的代码逻辑,现在在思考您这里对于aes/cbc对称解密后的二进制文件如何解析

7aGiven commented 1 year ago

@Dragon-ts

具体的解析逻辑在GameKey.java和Score.java内,分别对应gameKey和gameRecord内的内容。

里面的内容基本上就是对二进制内容的迭代。

顺带说一句,Phigros是使用protobuf对内容进行编码,但是我无法使用protobuf库进行解码。如果您有任何能够使用protobuf库直接解码的办法,请务必告诉我,或者为项目Pull Request。

7aGiven commented 1 year ago

@Dragon-ts

如果您也使用java语言进行编程,可以等待我新开一个lib仓库,打算将Phigros解析部分分离出这个项目。

7aGiven commented 1 year ago

@Dragon-ts 解析部分已被分离至该项目的package given.phigros下。

如果您可以用protobuf库解析二进制,务必告诉我,万分感激。

7aGiven commented 1 year ago

@Dragon-ts 对于GameRecord的新解析方式已编码完成。 考虑到可能的大量修改GameRecord内容,优化了该类。