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

от автора

Что нужно?

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

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

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

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

Let`s start!

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

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

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

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

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

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

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

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

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

папка lib

папка 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)

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


ссылка на оригинал статьи https://habr.com/ru/articles/771922/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *