Избранное сообщение

Фетісов В. С. Комп’ютерні технології в тестуванні. Навчально-методичний посібник. 2-ге видання, перероблене та доповнене / Мои публикации

В 10-х годах я принимал участие в программе Европейского Союза Tempus "Освітні вимірювання, адаптовані до стандартів ЄС". В рамк...

Благодаря Интернету количество писателей и поэтов увеличивается в геометрической прогрессии. Поголовье читателей начинает заметно отставать.

четверг, 13 сентября 2018 г.

Склейка двух apk-файлов в один / Android. Разработка приложений

image
Решил я как-то сделать склейку двух apk файлов, но информации о том, как это сделать на просторах интернета не особо то много. Тогда вооружившись трояном Ahmyth для android (его исходниками), началось путешествие в мир склейки apk своими руками. Коротко об этом далее…


Кратко о сути задачи:


Есть два apk файла( допустим 1.apk и 2.apk). Задача состоит в том, чтоб создать 3.apk, который будет склейкой 1 и 2 apk(и будет выполнять их функции). 


В итоге(код на python):

Имеем:

1. Папка apk — для файлов с apk;

2. Папка tmp — для декомпилированных файлов;
3. Папка tools — с дополнительным софтом(таким как apktool.jar,sign.jar,testkey).



Сначала определяем текущую папку, в которой работаем и папки куда будем декомпилировать:


#!/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


Затем производим декомпилирование apk файлов в папку 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 )


После этого шага у нас есть две папки /tmp/1 и /tmp/2 с декомпилированными файлами. Теперь самое интересное — объединение манифестов!


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()


Теперь по порядку в этом коде:



Находим файл AndroidManifest.xml в папке /tmp/1:


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


В этом файле находим все заявленные сервисы и классы:


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


В AndroidManifest.xml папки /tmp/1 Копируем все от тега "<uses-permission" до тега "<application ". Тут находятся все разрешения, которые нужны программе:


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


Находим файл AndroidManifest.xml в папке /tmp/2:


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


После этого нам надо объединить все это в один файл, так, чтоб все было на своих местах.



Новый манифест (new_mainfest2) состоит из:


  1. Начало AndroidManifest.xml приложения 2.apk(от начала до конца необходимых разрешений);
  2. Прибавляем сюда разрешения приложения 1.apk (permission1);
  3. Добавляем все, что есть в AndroidManifest.xml приложения 2.apk от тега "<application" до "


Добавляем все службы приложения 1.apk (service1); 

Дописываем остатки 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>")]


Перезапись AndroidManifest.xml в папке /tmp/2:


# перезапись созданного манифеста
new_mainfest = open(apkFolder2+"/AndroidManifest.xml", "w")
new_mainfest.write(new_mainfest2 )
new_mainfest.close()


На этом сборка AndroidManifest закончена. Осталось скопировать все классы из /tmp/1 в /tmp/2. А точнее будем копировать папки smali(тут все классы приложения) и unknown:


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


Ну и в завершение надо собрать все это в файл формата apk, подписать:


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 )


В результате этого в папке tmp появляется файл 3.apk, который и является склейкой двух других.



P.S. В данном варианте при склейке разрешений двух приложений не проверяется их сравнение и добавление только тех, которых нет. Может( и возникнет) дублирование при декларации разрешений. Но на данном этапе все работает и с дублированием.



Источники:



→ AhMyth-Android-RAT


Смотри также:


Учимся программировать под Андроид. http://fetisovvs.blogspot.com/2017/08/android.html
Новости Android-разработки, на которые стоит подписаться. http://fetisovvs.blogspot.com/2018/02/android-android.html
Советы по созданию современного Android-приложения. Лекция Яндекса. http://fetisovvs.blogspot.com/2017/12/android-android.html
Несколько книг для начинающего и продолжающего разработчика под Android. http://fetisovvs.blogspot.com/2018/01/android-android.html
Модульная разработка Android приложений. http://fetisovvs.blogspot.com/2018/04/android-android_21.html

8 учебных проектов. http://fetisovvs.blogspot.com/2017/12/8-android.html
Советы по чистому коду новичкам в Java/Android. http://fetisovvs.blogspot.com/2017/12/javaandroid-android.html
Файловые системы Android | Losst. http://fetisovvs.blogspot.com/2017/12/android-losst-android.html
Android и архитектура. http://fetisovvs.blogspot.nl/2017/05/android-android_20.html
Новая архитектура Android-приложений — пробуем на практике. http://fetisovvs.blogspot.nl/2017/06/android-android.html
Шпаргалка по тестированию требований к мобильным приложениям. http://fetisovvs.blogspot.com/2017/09/android_6.html
Обновление строк на лету в мобильных приложениях: часть 1. http://fetisovvs.blogspot.com/2018/01/1-android.html
Как Android запускает MainActivity. http://fetisovvs.blogspot.com/2017/12/android-mainactivity-android.html
Для чего нужен Android-эмулятор BlueStacks. http://fetisovvs.blogspot.com/2016/11/android-bluestacks-android.html
Теория по Service в Android. http://fetisovvs.blogspot.com/2017/09/service-android-android.html
Пример использования ScrollView в Android. http://fetisovvs.blogspot.com/2016/09/scrollview-android-android.html
Пример использования ViewFlipper в Android. Обзор контейнера ViewFlipper. http://fetisovvs.blogspot.com/2016/09/viewflipper-android-viewflipper-java.html
Remix OS Player – новый эмулатор Android для Windows. http://fetisovvs.blogspot.com/2016/09/remix-os-player-android-windows-android.html
Руководство по фоновой работе в Android. Часть 1. http://fetisovvs.blogspot.com/2018/02/android-1-android.html
Анимации в Android по полочкам. http://fetisovvs.blogspot.com/2018/02/android-3-android.html
Стабилизация экрана в Android. http://fetisovvs.blogspot.com/2016/12/android-android.html
Android и звук: как делать правильно. http://fetisovvs.blogspot.com/2017/10/android-android.html
Разработан инструмент для проверки Android-приложений на уязвимости. http://fetisovvs.blogspot.com/2018/02/android-android_16.html
Интеграция Android-приложения с фискальным принтером и кардридером. http://fetisovvs.blogspot.com/2017/04/android-android.html
Создание простейшей 2D игры на андроид. http://fetisovvs.blogspot.com/2017/06/2d-android.html
Как я создала прибыльное Android приложение по распознаванию текста. http://fetisovvs.blogspot.com/2018/09/android-android_5.html

Комментариев нет:

Отправить комментарий