Android implémente l'accrochage d'autres codes d'application et appels de méthode (pas de racine)

La dernière fois, j'ai parlé de copier les données internes d'autres applications sans root. Cette fois, je parlerai d'accéder directement au processus d'application cible sans root, puis de le hooker. Le principe de ce hook inter-processus repose sur l'injection dex et le fichier de ressources. modification à réaliser.

Créez d'abord un module dans Android Studio, créez une activité dans le module et ajoutez du code de test à la méthode onCreate de l'activité, par exemple : Nom du package actuel de Toast :

Toast.makeText(appContext, this.getPackageName(), Toast.LENGTH_SHORT).show();

Ensuite, compilez et générez l'apk, ouvrez-le avec winRAR, faites glisser le fichier classes.dex à l'intérieur et recherchez une application hôte à tester, telle que WeChat.apk. Utilisez winRAR pour ouvrir WeChat.apk et vérifiez les fichiers dex à l'intérieur, qui peuvent être plusieurs fichiers dex. , jetez un œil au nombre maximum du fichier dex. S'il est 12, renommez votre dex en classes13.dex, qui est la valeur maximale plus 1, puis faites glisser votre fichier dex dans l'apk WeChat pour intégrez-le à WeChat.

La deuxième étape consiste à créer un projet temporaire et à y ajouter du code d'exécution. Tout d'abord, importez la bibliothèque arsclib, puis utilisez le code pour modifier le fichier de configuration des ressources AndroidManifest de WeChat apk, ajoutez l'instruction d'activité dans le module tout à l'heure et définissez exporté vers true :

<activity android:name="com.plugin.test.TestActivity"
            android:exported="true" />

            
Le code principal est le suivant :

ApkModule module = ApkModule.loadApkFile(new File("/sdcard/微信.apk"));
AndroidManifestBlock manifestBlock = module.getAndroidManifestBlock();
ResXmlElement applicationElement = manifestBlock.getApplicationElement();
ResXmlElement activityElement = manifestBlock.getOrCreateActivity("com.plugin.test.TestActivity", false);
ResXmlAttribute exportedAttr = activityElement.getOrCreateAndroidAttribute("exported", android.R.attr.exported);
exportedAttr.setValueAsBoolean(true);

Vous pouvez définir launcherMode sur singleInstance pour éviter de le démarrer une seule fois. Si vous définissez singleTask, l'activité racine sera ouverte à chaque fois.

ResXmlAttribute launcherModeAttr = activityElement.getOrCreateAndroidAttribute("launcherMode", android.R.attr.launchMode);
launcherModeAttr.setTypeAndData(ValueType.DEC, 3); //singleInstance


        
Enfin, ajoutez le code pour démarrer l'activité dans le projet temporaire :

Intent intent = new Intent();
intent.setClassName("com.tencent.mm", "com.plugin.test.TestActivity");
startActivity(intent);

L'exécution du code ci-dessus démarrera notre propre activité. En fait, l'application WeChat est démarrée, donc le nom du package imprimé est le nom du package WeChat. Dans cette activité, nous pouvons faire certaines choses par nous-mêmes, comme accéder au processus WeChat, surveiller son comportement, configurer des agents, etc. Cependant, cette méthode présente un inconvénient, c'est-à-dire que chaque fois que le code du module est modifié, l'application cible doit être reconditionnée, puis re-signée et installée. La façon de résoudre ce problème est d'utiliser le mode plug-in. L'application cible ne met que du code de chargement, et le module est placé à l'extérieur, puis le même principe s'applique aux modules de chargement cibles et aux plug-ins WalxPlugin. Pour les méthodes d'implémentation spécifiques, veuillez consulter
l'article « Explication détaillée de l'utilisation du framework sans racine WalxPlugin et exemple de code ».

Voici la liste obtenue des contrôles de l'interface principale de WeChat :

 

Je suppose que tu aimes

Origine blog.csdn.net/zzmzzff/article/details/131553201
conseillé
Classement