解密 Lua 文件

逆向工程 艾达 C++ 安卓 游戏黑客 路亚
2021-07-02 16:54:25

我正在尝试解密一个使用密钥加密的 lua 文件。LUA 文件的一些背景。它来自一个android游戏,我反编译了APK,发现所有的lua文件都被加密了。

游戏是在一个名为 Coco2D 的引擎中制作的,它允许开发人员使用密钥加密他们的文件。在做了一些研究之后,我发现您可以使用 IDA 查看 SO 文件的二进制文件并在名为 ApplicationDidFinishLaunching 的函数中查找加密密钥。我试过了,但我不太确定我在那个函数中寻找什么。

来自 ApplicationDidFinish 函数的 IDA 文本:https : //pastebin.com/9h69PADF

在函数顶部附近,您可以看到这些变量集

.text:00404100 var_90          = -0x90    
.text:00404100 var_84          = -0x84
.text:00404100 var_80          = -0x80
.text:00404100 var_7C          = -0x7C
.text:00404100 var_74          = -0x74
.text:00404100 var_70          = -0x70
.text:00404100 var_6C          = -0x6C
.text:00404100 var_68          = -0x68
.text:00404100 var_64          = -0x64
.text:00404100 var_60          = -0x60
.text:00404100 var_5C          = -0x5C
.text:00404100 var_3C          = -0x3C

我不确定上述变量代表什么,但我不认为它们代表密钥,因为密钥是编码为十六进制的 128 位字符串。

加密密钥示例:https : //static.packt-cdn.com/products/9781783284757/graphics/B0561_11_01.jpg

经过更多挖掘,我在函数https://pastebin.com/N44prr2N 中找到了这一部分

此部分包括 32 个十六进制数字,其中包含 DCB 5 和 DCB 4 的中断。我认为这很可能是关键,但我不确定如何将粘贴箱中的内容组装到 128 位密钥。我也不知道 DCB 是什么(一秒钟后将对其进行研究),我不知道为什么该部分中有 5 和 4 的中断。

我上网找到了一个 Hex to Ascii Converter,发现十六进制数字确实可以转换为 Ascii。7C 转换为 | 和 78 就像评论所暗示的那样转换为 X 但我现在遇到的问题是 0xC 等十六进制值不会转换为 Ascii 值。

APK 链接https : //apkpure.com/taptap-heroes/com.westbund.heros.en 加密 Lua 文件链接 + SO:https : //www.mediafire.com/file/5ypqt5tk0scjwb5/LuaEncrypted.rar/文件

编辑:在查看函数的伪代码后,我没有发现使用 XTEA 密钥的迹象(我可能错了)。虽然我确实发现 RSA 结束编码用于 Lua 文件。如果它使用 RSA,我仍然不知道什么或如何解码它。

RSA 链接:https : //pastebin.com/quNJNzYd

1个回答

xxtea 加密密钥:sxpDM2018

结果 FightLogic.lua

如何找到钥匙

  • IDA 看着 Function window
  • CTRL+F并键入xxtea_decrypt双击第一项并向上滚动以查看cocos2d::FileUtilsAndroid::getData 结果

  • 双击cocos2d::FileUtilsAndroid::getData并按下F5以反编译 结果

  • 看图片xxtea_decrypt,你可以看到v34KEY 向上滚动看看,这是加密密钥

byte *xxtea_decrypt(byte *data, long data_len, byte *key, long key_len, long *ret_length)

结果

  • 我用 javascript 重写代码并使用 Chrome DevTool 运行它
var v45 = [896, 914, 915, 827, 756, 630, 499, 369, 252]
var v18 = 666
var v34 = []
for (var v17=0;v17<9;v17++) {
 v19 = v45[v17]
 v34.push((v19-v18)/2) //((((v19-v18)>>31) + (v19-v18)) << 23) >> 24
 v18 = (v19 - v17) - 222
}
// result sxpDM2018
console.log(String.fromCharCode.apply(null, v34))

最后