如何从 Android .apk 资产文件夹中解压缩 LUA 脚本?

Posted

技术标签:

【中文标题】如何从 Android .apk 资产文件夹中解压缩 LUA 脚本?【英文标题】:How to decompress LUA script from Android .apk assets folder? 【发布时间】:2016-10-22 09:42:59 【问题描述】:

我正在尝试对一款 android 游戏进行逆向工程,以找出其计算背后的逻辑。

.apk 文件解压后,/assets/lua 文件夹中有 lua 脚本,它们都有 .lua 扩展名。但是,如果使用 Text/HEX 编辑器打开,它们是不可读的。

例如:this file

所有文件的内容都以“droi.lua”签名结尾,让我觉得这不是一个 LUA 脚本,而是某种用于 Android 的压缩 LUA 脚本。 Android 有一种机制来压缩文件以用于发布目的。

以前有人经历过吗?有没有办法让这样的文件可读?

有没有什么方法/程序可以解压从.apk资产中提取的文件(如png、lua等)?

【问题讨论】:

May be helpful 【参考方案1】:

该文件中数据的熵非常高(香农熵约为 7.98,其中 8 是理论最大值)。我将此与压缩或 7zipped 文本文件的熵进行了比较,得到的熵更像是 6 到 7。

高熵,再加上它似乎没有任何可识别的标头字节,这表明它可能是加密的。

如果我是你,我会寻找嵌入在应用程序中的对称加密密钥。

如果你有兴趣,这里是我用来计算熵的python脚本:

import sys
import math

print('Calculating entropy of: '.format(sys.argv[1]))
with open(sys.argv[1], 'rb') as fp:
    data = fp.read()

# Trim off droi.lua
data = data[:-8]

# Calculate the frequency of each byte value in the file
frequencies = []
for b in range(256):
    ctr = 0
    for byte in data:
        if byte == b:
            ctr += 1
    frequencies.append(float(ctr) / len(data))

# Shannon entropy
ent = 0.0
for freq in frequencies:
    if freq > 0:
        ent = ent + freq * math.log(freq, 2)
ent = -ent

print('Shannon entropy:')
print(ent)

【讨论】:

【参考方案2】:

我会尝试调试它并在加载脚本后暂停应用程序。我会假设该应用程序会在某个时候解密/解压缩/...文件并将它们存储在内存中,以便它可以正确访问/执行它们。如果你设法在正确的位置设置断点,然后搜索应用程序的内存,你应该能够找到它。 这种方法的优点是,无论使用哪种加密或压缩方式,都无需了解算法。

我之前没有尝试在 Android 上做类似的事情,但我已经使用 Cheat Engine 等工具在 Windows 上成功完成了。 既然有Cheat Engine for Android这个版本,应该比较简单。

另一个想法是使用Preferences Manager 之类的应用程序并检查您是否可以找到任何有趣的东西,例如加密密钥或隐藏的开发人员选项,以某种方式让您能够看到未加密的文件内容。

【讨论】:

以上是关于如何从 Android .apk 资产文件夹中解压缩 LUA 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

C#:在 Android 上复制资产

Android Apk的反编译和加密

Android 解读.apk解压后文件详细说明

什么是 AAPT(Android 资产打包工具),它是如何工作的?

Android:如何从资产中播放视频?

Apk转Aab(Android App Bundle)