Декомпилировать Python APK с помощью ApkTool и подпроцесса

#android #python #file #subprocess #apktool

#Android #python #файл #подпроцесс #apktool

Вопрос:

Я создаю приложение на Python, которое декомпилирует Android APK, вносит некоторые изменения и перекомпилирует его.

Вот код:

 from shutil import copyfile

# Copy the APK to the output directory.
copyfile('./source/rat.apk', './output/rat.apk')

# Decompiles the APK.
subprocess.call(['apktool','d','./output/rat.apk','-f'], stdout=FNULL, stderr=subprocess.STDOUT)

# Modifies address and port.
with open('./output/RAT/app/src/main/res/values/strings.xml','w ') as netaddress:
    address = netaddress.read()
    address.replace('youraddress','x')
    address.replace('yourport','8080')
    netaddress.write(address)
    print(netaddress.read())
    netaddress.close()

# Recompiles it.
subprocess.call(['apktool','b','./output/RAT'], stdout=FNULL, stderr=subprocess.STDOUT)
  

Но он выдает это исключение при запуске:

 with open('./output/RAT/app/src/main/res/values/strings.xml','w ') as netaddress:
FileNotFoundError: [Errno 2] No such file or directory: './output/RAT/app/src/main/res/values/strings.xml'
  

Обновить:

Когда я пытаюсь использовать команду apktool d source/rat.apk

Это результат, который я получаю:

 18:45:51 up 1 min,  0 users,  load average: 0.52, 0.58, 0.59
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
I: Using Apktool 2.0.2-dirty on rat.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /home/stecco/apktool/framework/1.apk
W: Could not decode attr value, using undecoded value instead: ns=android, name=versionCode, value=0x00000001
I: Loading resource table from file: /home/stecco/apktool/framework/1.apk
W: Could not decode attr value, using undecoded value instead: ns=android, name=versionName, value=0x00000014
I: Loading resource table from file: /home/stecco/apktool/framework/1.apk
W: Could not decode attr value, using undecoded value instead: ns=android, name=versionCode, value=0x00000001
I: Loading resource table from file: /home/stecco/apktool/framework/1.apk
W: Could not decode attr value, using undecoded value instead: ns=android, name=versionName, value=0x00000014
Exception in thread "main" java.lang.NullPointerException
        at java.io.Writer.write(Writer.java:157)
        at brut.androlib.res.util.ExtMXSerializer.writeAttributeValue(ExtMXSerializer.java:38)
        at org.xmlpull.mxp1_serializer.MXSerializer.attribute(MXSerializer.java:696)
        at org.xmlpull.v1.wrapper.classic.XmlSerializerDelegate.attribute(XmlSerializerDelegate.java:106)
        at org.xmlpull.v1.wrapper.classic.StaticXmlSerializerWrapper.writeStartTag(StaticXmlSerializerWrapper.java:267)
        at org.xmlpull.v1.wrapper.classic.StaticXmlSerializerWrapper.event(StaticXmlSerializerWrapper.java:211)
        at brut.androlib.res.decoder.XmlPullStreamDecoder$1.event(XmlPullStreamDecoder.java:83)
        at brut.androlib.res.decoder.XmlPullStreamDecoder.decode(XmlPullStreamDecoder.java:141)
        at brut.androlib.res.decoder.XmlPullStreamDecoder.decodeManifest(XmlPullStreamDecoder.java:153)
        at brut.androlib.res.decoder.ResFileDecoder.decodeManifest(ResFileDecoder.java:140)
        at brut.androlib.res.AndrolibResources.decodeManifestWithResources(AndrolibResources.java:199)
        at brut.androlib.Androlib.decodeManifestWithResources(Androlib.java:140)
        at brut.androlib.ApkDecoder.decode(ApkDecoder.java:100)
        at brut.apktool.Main.cmdDecode(Main.java:165)
        at brut.apktool.Main.main(Main.java:81)
  

Решил все проблемы, установив Apktool 2.4.0 кажется, что версия 2.0.2 действительно глючит и даже 2.2.2 и 2.3.2.

Но возникла другая проблема, когда я пытаюсь ее перекомпилировать, она выдает мне classes.dex, а не apk, как я могу это решить?

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

1. Похоже, вы решили свой собственный вопрос, теперь напишите новый ответ. И это будет круто.

2. не совсем, на данный момент это вызывает у меня некоторые проблемы с перекомпиляцией.

Ответ №1:

FileNotFoundError — это явное имя, которое означает, что функция вашего кода не может найти этот файл. Без дополнительной информации о том, где происходит это исключение, единственный ответ, который я могу вам дать, — это проверить, что :

  1. каталог «./output/» существует
  2. файл будет правильно создан после копирования его с помощью shutil

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

1. В ближайшие часы я обновлю вопрос, какие «детали» необходимы? Я могу определенно сказать, что каталог существует, и файл создан правильно.

2. Должен существовать не только .output каталог, все дерево ./output/RAT/app/src/main/res/values/

3. Это не отображается, когда я использую подпроцесс с apktool, возможно, это проблема с командой, я протестирую ее и обновлю вопрос.

4. опять же, поскольку вы получаете эту ошибку, я предлагаю вам убедиться, что вы используете правильный путь к файлу, потому что ошибка с инструкцией «with» кажется тревожной.

5. Когда я выполняю подпроцесс для декомпиляции APK, он не декомпилирует его, поэтому программа вылетает в операторе with, потому что нет каталога с именем RAT, через несколько минут я обновлю вопрос.