Реверс мобильных приложений на cocos2dx
Что нужно?
Как не странно — нам понадобится apk нашего приложения
Так же для автоматизации процесса понадобится немного собственного софта. Я предпочитаю использовать питон
Среда для разработки, у меня это vs-code
Любой 16-ричный редактор, у меня это расширение для vs code
Let`s start!
Для начала посмотрим что мы вообще имеем
APK файлы представляют из себя самый обычный zip архив, который можно открыть любым архиватором. Распакуем файлы в какую нибудь папку
Файлы в приложении
Бегло пробежав по файлам можно обнаружить файлы с кодом на lua
Файлы приложения
Открыть эти файлы просто так не получится — они зашифрованы. Но все эти файлы объеденяет одно — слово signatr в самом начале. Пока что отложим эту информацию и пойдем дальше
Зайдем в папку lib и перейдем к нужной архитектуре — я обнаружил один единственный .so файл
папка lib
Попробуем просмотреть его через hex-редактор
Много непонятного текста, но если полистать ниже — можно найти читаемые строки!
Введем в поиск слово которое получили ранее — signatr
Слева от этого результата есть непримечательное слово. Чтож, это слово — это наш ключ шифрования. Давайте попробуем им воспользоваться
Напишу простой скрипт на питоне для дешифровки методом xxtea
import xxtea # pip install xxtea
file = 'client.luac'
sign = 'signatr'
key = 'anyxteakey'
with open(file, 'rb') as f:
filedata = f.read()
filedata = filedata[len(sign):] # обрежем начало файла чтоб убрать 'signatr'
data = xxtea.decrypt(filedata, key) # Дешифруем ключом
with open('test.lua', 'wb') as f:
f.write(data)
Запустим скрипт и получим файл test.lua
Все сработало! Мы получили расшифрованный файл
Осталось только сделать обертку для скрипта декодирования и реализовать рекурсивное декодирование в папках
import os
import xxtea
sign = 'signatr'
key = 'anyxteakey'
def recursive_decrypt(directory):
files = os.listdir(directory)
for f in files:
if os.path.isdir(directory + "/" + f):
recursive_decrypt(directory + "/" + f)
else:
if f.endswith(".luac"):
print("Decrypting", f)
data = b""
with open(directory + "/" + f, "rb") as file:
data = file.read()[len(sign):]
decrypted = xxtea.decrypt(data, key)
if decrypted:
with open(directory + "/" + f[:-1], "wb") as file:
file.write(decrypted)
os.remove(directory + "/" + f)
else:
print("Failed to decrypt", f)
От себя я так же добавил функцию очистки, что бы убрать пустые папки и не lua файлы
import shutil
def post_clean(directory):
# delete all not lua files
ls = os.listdir(directory)
if not ls:
shutil.rmtree(directory)
print("Removed", directory)
return
for file in os.listdir(directory):
if os.path.isdir(directory + "/" + file):
post_clean(directory + "/" + file)
elif not file.endswith(".lua"):
os.remove(os.path.join(directory, file))
print("Removed", file)
if not os.listdir(directory):
shutil.rmtree(directory)
print("Removed", directory)
Вот и все.
Спасибо за внимание:)