Как распаковать скрипт LUA из папки Android.apk?

Я пытаюсь перепроектировать игру Android, чтобы узнать логику их расчета.

После извлечения файла.apk есть сценарий lua в папке /assets/lua, и все они имеют расширение.lua. Однако, если они открыты с помощью редактора Text/HEX, они не читаются человеком.

Например: этот файл

Содержимое всех файлов заканчивается сигнатурой "droi.lua", заставило меня подумать, что это не сценарий LUA, а какой-то сжатый LUA-скрипт для Android. И у Android есть механизм сжатия файла для публикации.

Кто-нибудь испытал это раньше? Есть ли способ сделать такой файл доступным для чтения?

Есть ли какой-либо метод/программа для распаковки файлов, добавленных из.apk-активов (например, png, lua и т.д.)?

Ответы

Ответ 1

Энтропия данных в этом файле очень велика (энтропия Шеннона около 7,98, где 8 - теоретический максимум). Я сравнивал это с энтропией текстового файла с zipped или 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, но я сделал это успешно в Windows с такими инструментами, как Cheat Engine.
Поскольку существует версия Cheat Engine для Android, это должно быть относительно просто.

Еще одна идея - использовать приложение, например, " Менеджер предпочтений", и проверить, можете ли вы найти что-нибудь интересное, например, ключ шифрования или, возможно, скрытый параметр разработчика, который каким-то образом позволит вам увидеть содержимое незашифрованного файла.