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

我正在尝试反向工程一款 Android 游戏,以找出它们计算背后的逻辑。

解压缩 .apk 文件后,/assets/lua 文件夹中有 lua 脚本,并且它们都有 .lua 扩展名。但是,如果用文本/十六进制编辑器打开,它们就不可读了。

例如:这个文件

所有文件的内容都以“droi.lua”标识结尾,这使我想这不是一个 LUA 脚本,而是一种针对 Android 的压缩 LUA 脚本。 Android 有一种机制用于压缩发布目的的文件。

有人曾经遇到过这种情况吗?有没有办法使这样的文件可读?

是否有任何方法/程序可以解压缩从.apk 资产中提取的文件(例如 png、lua 等)?

点赞
用户5696338
用户5696338

将下面翻译成中文并且保留原本的 markdown 格式

该文件中的数据熵非常高(Shannon熵约为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)
2016-07-08 22:08:34
用户2879085
用户2879085

我会试着调试它并在应用程序加载脚本时暂停它。我会假设应用程序在某个时候解密/解压缩/...文件并将它们存储在内存中,以便可以正确访问/执行它们。如果您能够在正确的位置设置断点,然后搜索应用程序的内存,您应该能够找到它。

这种方法的优点是它不在乎使用了什么样的加密或压缩,并且您不必理解算法。

我以前没有在Android上尝试过这样的事情,但是我已经成功地在Windows上使用过Cheat Engine这样的工具。

由于有Cheat Engine for Android的版本,因此这应该相对简单。

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

2018-05-07 08:22:55