Reversing d'applications android (dalvik vm)

Modifié le lundi, 23 novembre 2009 01:41 par syl_ — Catégorisé en: Android, Android - Logiciels, Android - Personnalisation, Généralités

""Le Reversing, ou Reverse Engineering, est la traduction anglaise de l'expression "Ingénierie Inverse". C'est l'art d'étudier un objet afin d'en découvrir les mécanismes et les finalités. Appliquée à l'informatique, cette science vise à observer et étudier un programme pour comprendre les algorithmes qu'il utilise. Cela peut se faire dans le but de les reproduire ou de les améliorer, ou simplement pour la compréhension.

A ne pas confondre avec le Cracking, pratique illégale visant à casser les protections des logiciels afin de les utiliser sans les acheter.""

pré-requis :

♥ un magic et son câble (un câble mini-usb doit le faire pareil, sauf pour les écouteurs)
♥ Connaitre un minimum l'ASM ou le basic (ou mieux, la syntaxe Jasmin), et les concepts de la programmation. Lire les opcodes dalvik peut s'avérer utile. Il faut comprendre que java-vm et dalvik-vm, c'est différent. Google a choisi d'emprunter le java à Sun pour sa syntaxe, mais en fait une fois compilé, ce n'est plus du jvm, mais du dalvik-vm.
♥ Avoir le sdk android (pour adb), sun java (pour que smali fonctionne) et le sdk sun java (pour signer). Vous avez tout cela si vous possédez Eclipse avec le plugin ADT, c.a.d un environnement de développement (et de debug, mais depuis le code source java) complet pour Android.
♥ Suivre ce tutoriel pour créer son jeu de clés de signature. Le script fonctionne pour moi sur Linux Gentoo, placez le sous tools du sdk android
♥ Autoriser dans les options de votre android sous paramètre des applications --> développement "débogage usb" (dans mon cas "sources inconnues" s'avère inutile)
♥ Téléchargez baksmali et smali de... JesusFreke .. ! merci petit wink C'est smali qui permet le RE de dalvik !


notes :

♥ j'ai la SPF 2.7 sur un HTC magic
♥ je n'ai pas vu de tutoriel sur le reversing android c'est pourquoi vous pouvez lire ceci, mais d'habitude je ne publie rien, alors je ne fournirai pas d'apk téléchargeable (ok, est-ce qu'une appli développée par trois intérimaires d'atos est une peinture rupestre ..lol.)
♥ le reversing est pratiqué pour apprendre, mais il est utilisé pour son usage personnel UNIQUEMENT !
♥ le premier lancement d'adb doit se faire en tant qu'administrateur, ou avec sudo, pour pouvoir communiquer sur usb


désassembler :

./adb pull /data/app/com.sfr.android.mobiletv.apk .
./adb pull /system/app/YouTube.apk .

On lit system au lieu de data parce que sur SPF youtube est installé avec l'OS vu qu'il y reste un peu d'espace, inconvénient : updates par changement de firmware, ou suppression par adb puis install par le market
vous avez maintenant les 2 apk dans votre répertoire tools du sdk android
Placez les 2 jar smali et baksmali dans ce même répertoire
décompressez sous un répertoire "youtube" l'apk avec ark (ou unzip ou winzip ?), en spécifiant le type d'archive : zip.


Décompilez maintenant classes.dex de youtube, et rendez-vous compte comme c'est génial wink

java -Xmx512m -jar baksmali-0.94.jar youtube/classes.dex

Vous obtenez le répertoire "out" contenant la clé de votre nouvel univers magnifique (le full expirieince pourrait-on dire). Vous pouvez renommer ce répertoire out.youtube par exemple


sfrtv :

L'idée, c'est que nous allons profiter en même temps du HSDPA et de la télé. En fait, le problème vient d'android qui ne classe pas le 3G+ en "umts ou mieux" (ce qui est logique en fait du point de vue americanos). Ce patch vous permettra du même coup de profiter de la télé en edge.

aller dans MobileTV$1.smali, à la .line 150
if-nez v0, cond_15:
remplacer par
goto cond_15:

aller dans TV$5.smali, à la .line 405
if-nez v0, cond_3b:
remplacer par
goto cond_3b:

Pour résumer nous avons remplacé deux "sauts conditionnels" (if) par "aller à" (goto). L'un se trouve au moment de l'initialisation de l'application, l'autre avant la visualisation d'une chaine.


youtube :

L'idée : nous allons aussi profiter du HSDPA, mieux, nous allons paramétrer youtube par défaut en HD.

aller dans YouTubeActivity.smali, procédure getNetworkSpeed
.line 926
    goto_21:
    return v2
remplacer "return v2" par
    return v5

Là nous avons juste expliqué en toute diplomatie à youtube, qu'après tout la vitesse c'est toujours la même : à fond les ballons ! :p Il se trouve que maintenant ça lit tout par défaut en haute définition (v5 est fixe). Visiblement un peu trop haute parfois (pc ?). Donc pas besoin de 2ème patch pour ce qui est du choix par défaut, cela signifie que c'est relativement précis.

Je vous invite à lire autour des lignes que vous modifiez afin de comprendre comment fonctionnent dans la machine les programmes que vous utilisez au quotidien smile


xgalaga :

Il y a différentes triches à inventer, je vais vous en montrer une smile Sous Player.smali, procédure .method public reset()V Cette procédure sert à réinitialiser l'état de votre vaisseau, après une vie, ou au début du jeu. On peut par exemple s'adjoindre le triple-shot par défaut :

    .line 285
    # syl: weapon triple au lieu de simple (0x2 au lieu de 0x0)
    add-int/lit8 v2, v2, 0x2
    iput v2, v3, Lcom/dcsoft/games/xgalaga/Player;->weapon:I
Nous pourrions aussi écrire const/4 v2, 0x2 à la place de add-int, cela revient au même car la valeur initiale est 0. Si vous observez bien le code vous verrez que cela devrait aussi booster deux autres valeurs dans le jeu... Sinon vous rajoutez const/4 v2, 0x0 en dessous du iput weapon.


ré-assembler, et ressentez comment c'est bueno wink Cette étape particulièrement, on la doit à JesusFreke smile

java -Xmx512m -jar smali-0.94.jar out/

Copiez le fichier out.dex obtenu dans le répertoire youtube, avec les fichiers décompressés tout à l'heure.
Au passage, vous pourriez tenter de modifier des icônes. Renommez-le classes.dex et supprimez le répertoire META-INF qui contient les informations de signature des fichiers originaux.
Avec ark (ou autre) créez une archive zip contenant les fichiers présents sous le répertoire youtube.
En ouvrant cette archive, on doit voir directement (à la racine) le fichier AndroidManifest.xml, le classes.dex, resources.arsc, et le répertoire res.
Renommez cette archive en youtube.apk (si vous êtes sous windows, vous devez afficher les extensions sous les options de l'explorateur). Remettez l'archive dans le répertoire tools si nécessaire.


recréez des signatures

(ce seront les vôtres) pour le nouvel apk :
./my-release-key.keystore.sh youtube.apk


réinstaller (il faut d'abord supprimer) :

pour youtube, ça peut être installé en mémoire interne, dans ce cas :
./adb remount
./adb shell
rm /system/app/YouTube.apk
sync
reboot
pour sfrtv, vous devriez avoir la possibilité de le désinstaller par le market (sous "mes téléchargements")

installer :
./adb install youtube.apk
vous devriez lire "success"

par la suite, si vous souhaitez désinstaller ces apk maison :
./adb uninstall com.google.android.youtube
vous devriez lire "success"

L'appli apparait comme non installée dans le market car sa copie réversée (notre apk maison) est signée différemment, par contre à l'installation, il y aura conflit si l'une est déjà installée, car le nom de classe publique com.sfr.android.mobiletv reste identique.
Vous pouvez toutefois changer toutes les occurrences de celui-ci si vous voulez absolument avoir les 2 versions simultanément installées.

Si vous souhaitez lire la partie "avancé", cela se passe ici

vous pouvez venir sur le forum poser des questions complémentaires :)

Voici un script.sh (linux/mac) pour automatiser la compilation de xgalaga depuis le code smali (ce code se trouverait sous le répertoire out.xgalaga, et le contenu de l'apk se trouve sous le répertoire xgalaga) :
#!/bin/sh
# build script for xgalaga from disassembly with baksmali

echo "" && echo "compilation"
java -Xmx512m -jar smali-0.94.jar out.xgalaga/ -o xgalaga/classes.dex
echo "" && echo "compression"
cd xgalaga/
zip -0 -r xgalaga.apk *
mv xgalaga.apk ../
cd ../
echo "" && echo "signature"
./my-release-key.keystore.sh xgalaga.apk
echo "" && echo "desinstallation"
./adb uninstall com.dcsoft.games.xgalaga
echo "" && echo "reinstallation"
./adb install xgalaga.apk