Как выполнить baksmali.jar в устройстве Android
Для разработки Антивируса на Android мне нужно иметь smali
представление АПК.
Я пытаюсь выполнить baksmali.jar
прямо на устройстве. Я спросил у автора инструмента GitHub: Выполнение баксмали на устройстве Android.
Я выполнил шаги в соответствии с пост переполнением стека: Как выполнить файл dex в Android с помощью команды?
- Я скачал версию v2.2b4
dx --dex --output=classes.dex baksmali.jar
Я использовалdx
инструмент изandroid/Sdk/build-tools/25.0.2
zip baksmali.zip classes.dex
adb push baksmali.zip /sdcard/
Я использую эмулятор genymotioncustom phone-4.4.4 API 19
adb shell mkdir /sdcard/dalvik-cache
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:
После запуска приложения вы должны увидеть папки в /data/data/com.example.bartman.baksmalihelloworld/<name_of_baksmali_output>