Как выполнить baksmali.jar в устройстве Android

Для разработки Антивируса на Android мне нужно иметь smali представление АПК.

Я пытаюсь выполнить baksmali.jar прямо на устройстве. Я спросил у автора инструмента GitHub: Выполнение баксмали на устройстве Android.

Я выполнил шаги в соответствии с пост переполнением стека: Как выполнить файл dex в Android с помощью команды?

  1. Я скачал версию v2.2b4
  2. dx --dex --output=classes.dex baksmali.jar Я использовал dx инструмент из android/Sdk/build-tools/25.0.2
  3. zip baksmali.zip classes.dex
  4. adb push baksmali.zip /sdcard/ Я использую эмулятор genymotion custom phone-4.4.4 API 19
  5. adb shell mkdir /sdcard/dalvik-cache
  6. adb shell ANDROID_DATA=/sdcard dalvikvm -cp /sdcard/baksmali.zip org.jf.baksmali.Main

После этого я получаю это сообщение об ошибке Unable to locate class 'org/jf/baksmali/Main'Точно

Unable to locate class 'org/jf/baksmali/Main'
java.lang.NoClassDefFoundError: org/jf/baksmali/Main
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: Didn't find class "org.jf.baksmali.Main" on path: DexPathList[[zip file "/sdcard/baksmali.zip"],nativeLibraryDirectories=[/system/lib]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
    ... 1 more
    Suppressed: java.io.IOException: unable to open DEX file
        at dalvik.system.DexFile.openDexFileNative(Native Method)
        at dalvik.system.DexFile.openDexFile(DexFile.java:296)
        at dalvik.system.DexFile.<init>(DexFile.java:80)
        at dalvik.system.DexFile.<init>(DexFile.java:59)
        at dalvik.system.DexPathList.loadDexFile(DexPathList.java:263)
        at dalvik.system.DexPathList.makeDexElements(DexPathList.java:230)
        at dalvik.system.DexPathList.<init>(DexPathList.java:112)
        at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:48)
        at dalvik.system.PathClassLoader.<init>(PathClassLoader.java:38)
        at java.lang.ClassLoader.createSystemClassLoader(ClassLoader.java:116)
        at java.lang.ClassLoader.access$000(ClassLoader.java:65)
        at java.lang.ClassLoader$SystemClassLoader.<clinit>(ClassLoader.java:81)
        at java.lang.ClassLoader.getSystemClassLoader(ClassLoader.java:125)
        ... 1 more

Я не понимаю эту ошибку, путь classe правильный.

Как я могу это исправить?

Заранее спасибо.

1 ответ

Решение

После перемещения я наконец нашел решение следующей проблемы:

"выполнить baksmali.jar в устройстве Android в идеале запуск запускается приложением, нацеленным на другое приложение. "

Итак, допустим, мы не будем разрабатывать приложение, способное "baksmali" (дизассемблировать) другое приложение, не требуя какого-либо специального разрешения.

Вот шаги, чтобы сделать работу:

  • скачать baksmali.jar v1.2.3
  • добавить jar к app/libs каталог проекта андроид студии
  • щелкните правой кнопкой мыши на jar и выберите опцию "Добавить как библиотеку" (используйте вид "Проект-> проект", чтобы увидеть libs каталог, вы можете не увидеть его в представлении "Project->android")
  • Вы можете использовать org.jf.baksmali.main.mainметод, передавая CLIаргументы этого метода, используя String[]

Вот приложение helloWorld, иллюстрирующее использование cas:

GitHub: Баксмали Привет, мир

После запуска приложения вы должны увидеть папки в /data/data/com.example.bartman.baksmalihelloworld/<name_of_baksmali_output>

Другие вопросы по тегам