Реверс мобильных приложений на cocos2dx

Что нужно?

  • Как не странно — нам понадобится apk нашего приложения

  • Так же для автоматизации процесса понадобится немного собственного софта. Я предпочитаю использовать питон

  • Среда для разработки, у меня это vs-code

  • Любой 16-ричный редактор, у меня это расширение для vs code

Let`s start!

Для начала посмотрим что мы вообще имеем

APK файлы представляют из себя самый обычный zip архив, который можно открыть любым архиватором. Распакуем файлы в какую нибудь папку

Файлы в приложении

Файлы в приложении

Бегло пробежав по файлам можно обнаружить файлы с кодом на lua

Файлы приложения

Файлы приложения

Открыть эти файлы просто так не получится — они зашифрованы. Но все эти файлы объеденяет одно — слово signatr в самом начале. Пока что отложим эту информацию и пойдем дальше

fc5f315de6e66c4b27f37a38dda6c60e.png

Зайдем в папку lib и перейдем к нужной архитектуре — я обнаружил один единственный .so файл

папка lib

папка lib

Попробуем просмотреть его через hex-редактор

67b7d93c07ca499aecccb53798a6a625.png

Много непонятного текста, но если полистать ниже — можно найти читаемые строки!

Введем в поиск слово которое получили ранее — signatr

9431ca34ead14b8766d921ca65edc041.png

Слева от этого результата есть непримечательное слово. Чтож, это слово — это наш ключ шифрования. Давайте попробуем им воспользоваться

Напишу простой скрипт на питоне для дешифровки методом 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

f62a5d3bd9a4aa415eb8111b113c1f33.png

Все сработало! Мы получили расшифрованный файл
Осталось только сделать обертку для скрипта декодирования и реализовать рекурсивное декодирование в папках

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)

Вот и все.
Спасибо за внимание:)

© Habrahabr.ru