Un logiciel d'assistant d'analyse super puissant.
1. Compréhension approfondie du processus d'optimisation d'Android
2. Observez de près le code source d'Android
2 Vous pouvez voir les fonctions dans la partie inférieure du déballage du grand patron
1. Autres fonctions pouvant être téléchargées
2. Le processus d'analyse des fichiers dex
3. Peu de connaissances sur le bombardement et la déconnexion
0x01 Un tutoriel simple sur un outil utile (Insight)
Les outils sont disponibles en pièce jointe. Téléchargez et téléchargez simplement séparément.
SI3US-205035-36448
Un code d'enregistrement est fourni ici.
Installez, suivant, suivant et c'est tout.
Créer un nouveau projet
Machine unique OK
Choisissez la première
Sélectionnez Ajouter un arbre, ce qui signifie les ajouter tous.
Une fois le chargement terminé
nous utiliserons ce logiciel pour l'analyse.
Analyse du processus d'optimisation Android
1.extractAndProcessZip
Alors analysons-le étape par étape.
Voici la définition de la variable intermédiaire de extractAndProcessZip. Ce n’est pas l’objet de notre recherche.
DexClassVerifyMode verifyMode = VERIFY_MODE_ALL;
Si nous apportons des modifications ici, pouvons-nous ignorer cette vérification.
Regardons d'autres valeurs.
Si vous avez une idée, vous pouvez définir vous-même cette valeur.
DexOptimizerMode dexOptMode = OPTIMIZE_MODE_VERIFIED;
Continuons la lecture.
Il existe une fonction appelée dexOptCreateEmptyHeader qui, comme son nom l'indique, crée un en-tête vide pour l'optimisation dex.
dexOffset, enregistrez la position du fichier afin que nous puissions revenir ici plus tard, qui est en fait la position de départ de la lecture du fichier dex.
Regardons la fonction suivante.
Ouvrez l'archive zip, recherchez l'entrée DEX.
Ensuite, analysez.
Fonction pour extraire quelques décalages de dex.
Extrayez les données DEX dans le fichier cache au décalage actuel. Enregistrez quelques décalages du fichier dex.
La prochaine chose à aborder est le processus de dex odexing.
C'est là qu'intervient la vérification de l'optimisation.
Vous pouvez modifier le processus d'optimisation ici et même supprimer la vérification de l'optimisation.
Pensez à
d'où proviennent les données ici et où les comparer. ·
Ces données sont comparées dans build.prop.
Faisons le suivi de la fonction dvmContinueOptimization.
PS :
Nous sommes sur le point d'entrer en contact avec un endroit très important et très lié au déballage
Ouvrez la fonction dvmContinueOptimization
La première chose est un jugement.
Ensuite, il y a une écriture dans le fichier dex.
Alors continuez à lire (le point important arrive)
dvmDexFileOpenPartial Si vous avez déjà vu les tutoriels de décompression d'autres personnes, vous devez savoir que c'est le point de terminaison fréquemment utilisé que je connaissais seulement pour le télécharger auparavant, mais maintenant je sais, cette fonction existe dans le code source.
Jetons un coup d'œil à l'appel de la fonction dvmDexFileOpenPartial
Elle est appelée deux fois ici, et l'autre fois est sa propre définition.
Jetons d'abord un coup d'œil au prototype de dvmDexFileOpenPartial
int dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex)
Paramètre 1 : L'adresse de base du fichier DEX chargé en mémoire (c'est-à-dire DEX. .035)
Paramètre 2 : La longueur du fichier DEX chargé,
Paramètre 3 : Paramètre de sortie, le fichier DEX est converti en une structure DvmDex, qui contient les classes, les champs, les méthodes et les informations de chaîne du fichier Dex. L'objet du fichier Dex d'exploitation de Dalivk est la structure de la structure
Enfin, les informations d'en-tête sont écrites ici.
dvmRawDexFileOpen() Cette fonction est la fonction clé que nous devons comprendre, elle se trouve dans la fonction RawDexFile.cpp.
Définissez d’abord les variables de base.
Nous savons tous qu'une chose très importante dans le format de fichier est le nombre magique, voici donc la première étape pour déterminer le nombre magique, verifyMagicAndGetAdler32. La magie ici est le nombre magique.
Voici la vérification de l'heure et de la taille du fichier.
Cette fonction est une fonction clé, et c'est aussi une fonction sur laquelle nous devons nous concentrer sur l'analyse. Sa fonction principale est de générer le fichier odex correspondant à dex, qui est ce qu'on appelle l'odexisation. Suivons la fonction pour voir.
Ce qui suit fait partie de la fonction dexOptGenerateCacheFileName(). Notre principal objectif est de voir où il est produit.
Vous pouvez voir ici qu'il est généré dans le répertoire de données, ALOGV("Le fichier cache pour '%s' '%s' est '%s'", fileName, subFileName, nameBuf);
Il semble comme ce format.
C'est-à-dire que notre fichier odex a été généré ici.
La prochaine chose à faire est d'utiliser la fonction dvmDexFileOpenFromFd(), d'optimiser davantage, de compléter le mappage et de le définir comme fichier lisible. Ouvrez cette fonction. L'emplacement est dans DvmDex.cpp.
Voyons d'abord où cette fonction est appelée.
L'endroit où cette fonction est appelée est notre fonction clé dvmRawDexFileOpen. Cette fonction appelle d'abord dexOptGenerateCacheFileName pour générer odex, puis appelle dvmDexFileOpenFromFd pour une autre optimisation.
La dernière étape de l'optimisation est dexFileParse(), qui consiste à analyser DEX. Ce poste est un bref résumé dans DexFile
Fonction de contrôle principale dvmRawDexFileOpen() - dexOptGenerateCacheFileName() génère l'odex correspondant - dvmDexFileOpenFromFd() optimise davantage - dexFileParse() analyse dex.
Lorsque dexfileopenpartial est dans la section suivante, vous constaterez peut-être qu'il n'y a aucun moyen de le casser, nous pouvons alors choisir dexOptGenerateCacheFileNamePKcS0, dvmdexfileopenfromfd et d'autres fonctions pour passer à la section suivante.
De manière générale, dexfileopenpartial est meilleur pour gérer les choses avec des shells.
D'autres codes sources sont guidés par une fonction de contrôle principale pour guider d'autres fonctions clés à fonctionner. Le processus de chargement de la classe Dex est également comme ça.
Sa fonction de contrôle principale est Dalvik_dalvik_system_DexFile_defineClassNative()
Il y a aussi une fonction qui nécessite une attention particulière, Dalvik_dalvik_system_DexFile_openDexFileNative
Ce qui doit être noté ici, c'est qu'il y a deux endroits où vous pouvez vider.
Regardons notre fonction de contrôle principale.
Il existe un tel appel dans la fonction de contrôle principale.
Cet appel vise à vérifier le cookie, mais ce cookie est probablement le cookie dex déchiffré, vous pouvez donc également vider ce cookie ici.
Alors regarde en bas.
Fonction dvmDefineClass, cette fonction est une fonction pour confirmer le chargement de la classe.
La fonction porte un jugement toute seule, mais ce qui est renvoyé est bien une grosse tête. Suivons cette fonction pour voir.
La chose la plus importante ici est clazz, qui est la classe chargée dynamiquement.
Sa valeur est renvoyée par la fonction loadClassFromDex, nous allons donc y jeter un œil plus approfondi.
Voir une telle structure ici.
Jetons un coup d'œil aux détails de cette structure.
Cette structure est-elle exactement la même que la structure dex ? Cela montre que voici ce dont nous avons besoin.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!