Vinculación de dos archivos apk en uno

imagen

De alguna manera decidí pegar dos archivos apk, pero no hay mucha información sobre cómo hacerlo en Internet. Luego, armado con el troyano Ahmyth para Android (su fuente ), comenzó un viaje al mundo de pegar apk con sus propias manos. Brevemente sobre esto más ...

Brevemente sobre la esencia del problema:

Hay dos archivos apk (digamos 1.apk y 2.apk). La tarea es crear 3.apk, que pegará apk 1 y 2 (y realizará sus funciones).

En resumen (código python):


Tenemos:


1. Carpeta apk - para archivos con apk;
2. Carpeta tmp : para archivos descompilados;
3. Carpeta de herramientas : con software adicional (como apktool.jar, sign.jar, testkey).

Primero, determinamos la carpeta actual en la que trabajamos y las carpetas donde descompilaremos:

#!/usr/bin/python # -*- coding: utf-8 -*- import re import codecs import os from os import listdir import shutil import subprocess import datetime pwd = os.getenv("PWD", os.getcwd()) #   apkFolder1=pwd+"/tmp/1" #  apk1 apkFolder2=pwd+"/tmp/2" #  apk2 

Luego descompilamos los archivos apk en la carpeta tmp:

 print " "+pwd+"/apk/1.apk" subprocess.call("java -jar "+ pwd+"/tools/apktool.jar d "+pwd+"/apk/1.apk -f -o " + pwd+"/tmp/1" , shell=True ) print " "+pwd+"/apk/2.apk" subprocess.call("java -jar " + pwd+"/tools/apktool.jar d "+pwd+"/apk/2.apk -f -o " + pwd+"/tmp/2" , shell=True ) 

Después de este paso, tenemos dos carpetas / tmp / 1 y / tmp / 2 con archivos descompilados. ¡Ahora la parte divertida es la unión de manifiestos !

 print "  " mainfest1 = open(apkFolder1+"/AndroidManifest.xml", "r").read() #   ,       service1 = mainfest1[(mainfest1.find("</activity>")+len("</activity>")):mainfest1.find("</application>")] #      permission1=mainfest1[ mainfest1.find("<uses-permission"):mainfest1.find("<application ")]#    mainfest2 = open(apkFolder2+"/AndroidManifest.xml", "r").read() #       new_mainfest2 = mainfest2[0:mainfest2.find("<application")] +permission1+ mainfest2[mainfest2.find("<application"):mainfest2.find("</application")] +service1 + mainfest2[mainfest2.find("</application>"):mainfest2.find("</manifest>")+len("</manifest>")] #    new_mainfest = open(apkFolder2+"/AndroidManifest.xml", "w") new_mainfest.write(new_mainfest2 ) new_mainfest.close() 

Ahora en orden en este código:

Encontramos el archivo AndroidManifest.xml en la carpeta / tmp / 1:

 mainfest1 = open(apkFolder1+"/AndroidManifest.xml", "r").read() 

En este archivo encontramos todos los servicios y clases declarados:

 service1 = mainfest1[(mainfest1.find("</activity>")+len("</activity>")):mainfest1.find("</application>")] 

En la carpeta AndroidManifest.xml / tmp / 1, copie todo de la etiqueta "<usos-permiso" a la etiqueta "<aplicación". Aquí están todos los permisos que necesita el programa:

 permission1=mainfest1[ mainfest1.find("<uses-permission"):mainfest1.find("<application ")] 

Encontramos el archivo AndroidManifest.xml en la carpeta / tmp / 2:

 mainfest1 = open(apkFolder2+"/AndroidManifest.xml", "r").read() 

Después de eso, necesitamos combinar todo esto en un solo archivo , para que todo esté en su lugar.

El nuevo manifiesto (new_mainfest2) consta de:

  1. El comienzo de la aplicación AndroidManifest.xml 2.apk (desde el principio hasta el final de los permisos necesarios);
  2. Agregamos aquí los permisos de la aplicación 1.apk (permiso1);
  3. Agregue todo lo que está en AndroidManifest.xml de la aplicación 2.apk desde "<aplicación" a "

Agregue todos los servicios de la aplicación 1.apk (servicio1);
Agregue los restos de la aplicación AndroidManifest.xml 2.apk.

 new_mainfest2 = mainfest2[0:mainfest2.find("<application")] +permission1+ mainfest2[mainfest2.find("<application"):mainfest2.find("</application")] +service1 + mainfest2[mainfest2.find("</application>"):mainfest2.find("</manifest>")+len("</manifest>")] 

Sobrescribir AndroidManifest.xml en la carpeta / tmp / 2:

 #    new_mainfest = open(apkFolder2+"/AndroidManifest.xml", "w") new_mainfest.write(new_mainfest2 ) new_mainfest.close() 

Esto completa la compilación de AndroidManifest. Queda por copiar todas las clases de / tmp / 1 a / tmp / 2. Más precisamente, copiaremos las carpetas smali (aquí están todas las clases de aplicación) y desconocidas :

 subprocess.call("cp -rn "+apkFolder1+"/smali "+apkFolder2 , shell=True ) #   /smali apkFolder1  /smali apkFolder2 subprocess.call("cp -rn "+apkFolder1+"/unknown "+apkFolder2 , shell=True ) #   /unknown apkFolder1  /unknown apkFolder2 

Bueno, en conclusión, debe recopilar todo esto en un archivo apk, firme:

  print " apk   "+ pwd+"/tmp/3.apk" subprocess.call("java -jar " + pwd+"/tools/apktool.jar b "+pwd+"/tmp/2 -o " + pwd+"/tmp/3.apk" , shell=True ) print "  "+ pwd+"/tmp/3.apk" subprocess.call("java -jar " + pwd+"/tools/sign.jar "+pwd+"/tmp/3.apk --override", shell=True ) 

Como resultado de esto, el archivo 3.apk aparece en la carpeta tmp, que es el pegado de los otros dos.

PD En esta realización, cuando se pegan los permisos de dos aplicaciones, no se verifica su comparación y la adición de solo aquellas que no lo son. Puede haber (y habrá) duplicación en la declaración de permisos. Pero en esta etapa, todo funciona con duplicación.

Fuentes:

AhMyth-Android-RAT

Source: https://habr.com/ru/post/es422885/


All Articles