Как распаковать скрипт 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, это должно быть относительно просто.
Еще одна идея - использовать приложение, например, " Менеджер предпочтений", и проверить, можете ли вы найти что-нибудь интересное, например, ключ шифрования или, возможно, скрытый параметр разработчика, который каким-то образом позволит вам увидеть содержимое незашифрованного файла.