título: Android-packing refuerzo
categorías: Android
etiquetas: [android, embalaje, refuerzo, confusión]
fecha: 2022-06-20 18:00:23
comentarios: falso
mathjax: verdadero
toc: verdadero
Empaquetador de Android
precuela
- Paquete de Apk para Android - https://blog.csdn.net/LVXIANGAN/article/details/84956476
- Análisis del mecanismo Dex de carga dinámica de Android: https://blog.csdn.net/wy353208214/article/details/50859422
- Apk refuerzo principio aprendizaje y reproducción (buen artículo) - https://www.anquanke.com/post/id/247644
- Serie de tecnología negra de Android - Análisis e implementación del principio de refuerzo (empaquetado) de Apk (buen texto) - https://www.cnblogs.com/chenxd/p/7820087.html
- Endurecimiento inicial de Android (buen texto) - https://www.jianshu.com/p/8e578dc2c5db
- Desarrollo de Android y ruta de aprendizaje: práctica de refuerzo (buen artículo, parece provenir del enlace anterior): https://blog.csdn.net/eastmoon502136/article/details/103703950
- demostración - https://github.com/eastmoon1117/StudyTestCase/tree/master/DexPack/ShellApk
- https://github.com/longtaoge/AndroidShell
- Hablando de archivos Android Dex: https://www.infoq.cn/article/u5ld584clblpyln8extu
- Android dex, odex, avena, vdex, estructura de archivos de arte
- Comparta un shell de extracción de funciones hecho a sí mismo: https://bbs.pediy.com/thread-271139.htm
- https://github.com/luoyesiqiu/dpt-shell
- Cargue la tecnología de archivos DEX a través de la memoria para completar el script de refuerzo DEX con un solo clic: https://github.com/yongyecc/dexshellerInMemory
- Uso de AppComponentFactory para realizar el análisis de estrategia de la protección de shell de cifrado amor variante - https://bbs.pediy.com/thread-268008-1.htm
- dpt-shell extrae el código fuente del proyecto shell y su análisis inverso- http://tttang.com/archive/1728/
- La batalla de las vulnerabilidades de la aplicación Android (11): explicación detallada del principio general de empaque y las habilidades de desempaquetado: https://bbs.pediy.com/thread-273293.htm#msg_header_h2_1
- Principio de refuerzo de la aplicación de Android e historial técnico: https://juejin.cn/post/6844904176070164488
- Detección e investigación del tipo de refuerzo de la aplicación (buen artículo) - https://zhuanlan.zhihu.com/p/509957240
- Complemento de generación de código basura de Android: https://github.com/qq549631030/AndroidJunkCode
como confusión nativa Proguard es inútil
- Introducción a varias herramientas de ofuscación y reversión de Android: https://blog.51cto.com/u_15060511/4080326
El método de ofuscación de Proguard consiste en eliminar el significado correspondiente del nombre de la clase y el nombre del método, porque la ingeniería inversa puede adivinar el significado de la función de acuerdo con el nombre de la clase y el nombre del método, lo que puede reducir en gran medida la dificultad de la ingeniería inversa, pero Proguard lo hace. no cambie las instrucciones Por lo tanto, la intensidad de la ofuscación con Proguard es relativamente baja.
proceso general
- Fortalecimiento inicial de Android: https://www.jianshu.com/p/8e578dc2c5db
cargador de clases
- Comprensión y uso de ClassLoader: https://juejin.cn/post/6844903998013571086
tabla de símbolos de vista de archivo
-
ver comando
$ nm -D libx8a3pjbix.so
-
Solo muestra T (método), agrega un awk
$ nm -D libx8a3pjbix.so | awk '{if($2=="T"){print $3}}'
Paso en el hoyo
La fuente de Java Shell Kotlin falla
No se encontró la identificación del recurso de informe de error:java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jared.testshell/com.jared.apktest.MainActivity}: android.content.res.Resources$NotFoundException: Drawable com.jared.apktest:dimen/abc_text_size_display_4_material with resource ID #0x7f050040
- Se desconoce el motivo, pero el shell kotlin/java no tiene problemas con la fuente java, y el shell kotlin no tiene problemas con la fuente kotlin
entonces el desarrollo de la biblioteca
- Desarrollo de JNI y NDK de AS - Primeros pasos - https://juejin.cn/post/6844903873866366984
así que bombardeo de curry
- [Original] Refuerzo de nivel de entrada: registros de aprendizaje de 3 métodos de refuerzo: https://bbs.pediy.com/thread-255220.htm
- Exploración de la tecnología de refuerzo APK de Android (2) - Cómo descifrar archivos dex - https://juejin.cn/post/6985040096042942495/
ida analisis asi
- Archivo de análisis estático IDA - https://zhuanlan.zhihu.com/p/358218034
gancho
- Marco del complemento Hook (utilice Hook para reemplazar la variable miembro mResources de la actividad del complemento) - https://blog.51cto.com/u_14202100/5080958
- ¿Qué pasa con el despellejamiento de Android, el flujo de empaquetado de recursos? Flujo de reemplazo de AssetManager: https://juejin.cn/post/6844903902060478477
- [Complemento de Android] Marco del complemento Hook (utilice Hook para reemplazar la variable miembro mResources de la actividad del complemento) - https://blog.csdn.net/shulianghan/article/details/119619952
- https://github.com/han1202012/Plugin_Hook
Enchufar
- Hablando del complemento de Android: https://juejin.cn/post/6973888932572315678
- Principio de implementación y marco general del complemento de Android: https://blog.csdn.net/chuhe1989/article/details/104622513
- Comparación de marcos comunes de complementos de Android: https://www.jianshu.com/p/a73b4b0288ea
- El complemento de Android ClassLoader carga archivos Dex: https://github.com/13767004362/HookDemo
- [Complemento de Android] Iniciar la Actividad que no está registrada en el Manifiesto (buen artículo) - https://blog.csdn.net/u013293125/article/details/105407056
- https://github.com/ydslib/PluginTest01
Comparación de marcos de complementos
- VirtualAPK de Didi (parece estar fuera de mantenimiento desde hace 4 años) - https://github.com/didi/VirtualAPK
- RePlugin de 360: https://github.com/Qihoo360/RePlugin
- https://github.com/Qihoo360/RePlugin/wiki/%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B
registro de código fuente
- Análisis del código fuente del proceso de inicio de actividad: https://hitendev.github.io/2018/03/29/Activity%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B%E6 %BA%90%E7%A0%81%E5%88%86%E6%9E%90/
confundir
- 6 herramientas comunes de protección del código fuente de Java (ofuscación, cifrado, capa inferior) - https://www.cnblogs.com/mq0036/p/14922232.html
- ¡Cuente los 5 ofuscadores de código Java comúnmente utilizados! - https://zhuanlan.zhihu.com/p/105409587
- La ofuscación de Allatori puede cifrar cadenas: https://blog.csdn.net/Viviha/article/details/104801930
Proceso de refuerzo medido
-
Descomprima directamente el apk como un zip en un directorio a
-
Reforzar la dex y así en el futuro
-
Luego comprima el directorio a en un archivo apk con zip
Durante el proceso de compresión, el archivo resources.arsc no se puede comprimir y debe almacenarse en forma de documento
ZIP_STORED
; de lo contrario, se producirá este error [instalado en Android 11+ (API nivel 30) la máquina no está alineada con 4 bytes o recursos. arsc está comprimido](#instalación Para Android 11+ (nivel de API 30) el dispositivo no está alineado en 4 bytes o resources.arsc está comprimido) -
Realice la alineación de 4 bytes en el apk comprimido
$ zipalign.exe -p -f -v 4 I:/unalign.apk I:/align.apk
-
Para apk alineado de 4 bytes, use apksigner (no jarsigner) para firmar.
$ java -jar apksigner.jar sign -verbose --v1-signing-enabled false --v2-signing-enabled true --ks "E:/test_jks.jks" --ks-key-alias test_alias --ks-pass pass:test_pass --key-pass pass:test_pass --out I:/signed.apk --in I:/align.apk
Paso en el hoyo
Al compilar apk con apktool, se produce el error de valores-v31
Error:res\values-v31\colors.xml:3: error: Error: Resource is not public.
Este error es causado por sdk usando 31+ , apktool aún no es compatible con 31+,
-
La solución es poner el sdk a 30
compileSdkVersion 30 buildToolsVersion "30.0.2" defaultConfig { minSdkVersion 19 targetSdkVersion 30 }
Cuando apktool compila apk, la biblioteca de referencia sdk supera los 30
informar error
Execution failed for task ':app_shell:checkDebugAarMetadata'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.CheckAarMetadataWorkAction
> The minCompileSdk (31) specified in a
dependency's AAR metadata (META-INF/com/android/build/gradle/aar-metadata.properties)
is greater than this module's compileSdkVersion (android-30).
Dependency: androidx.appcompat:appcompat:1.4.1.
AAR metadata file: C:\Users\wilker\.gradle\caches\transforms-3\34a5f42d2f1863af6e2f0b71a2ab8437\transformed\appcompat-1.4.1\META-INF\com\android\build\gradle\aar-metadata.properties.
La biblioteca de referencia en el shell apk androidx.appcompat:appcompat:1.4.1
se compila usando SDK 31
- La solución es hacer referencia a no más de la biblioteca compilada SDK 30
implementation 'androidx.appcompat:appcompat:1.3.1'
Apktool compila apk e informa una solicitud de errorLegacyExternalStorage
Error:AndroidManifest.xml:42: error: No resource identifier found for attribute 'requestLegacyExternalStorage' in package 'android'
- Solución: elimine la configuración 'requestLegacyExternalStorage'
No se pudo iniciar la actividad cuando se está ejecutando el shell
informar error
Process: com.rmgrummy.pro, PID: 15023
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{
com.rmgrummy.pro/com.yang.androidaar.ReferrerActivity}: java.lang.ClassNotFoundException: Didn't find class "com.yang.androidaar.ReferrerActivity" on path: DexPathList[[zip file "/data/user/0/com.rmgrummy.pro/app_payload_odex/payload.apk"],nativeLibraryDirectories=[/data/user/0/com.rmgrummy.pro/app_payload_lib, /system/lib, /vendor/lib]]
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2570)
Porque el elemento de inicio está configurado en el apk de origen com.yang.androidaar.ReferrerActivity
, pero no hay loadClass en el shell
- hay dos soluciones
- Cargue la actividad de inicio configurada en AndroidManifest.xml en el shell apk en el código de shell al inicio
- Modifique la actividad de inicio configurada en AndroidManifest.xml en el apk de shell para que sea la actividad de carga del código de shell
La reflexión de kotlin no es compatible cuando se ejecuta la aplicación de origen después de desempaquetar
Error:kotlin.jvm.KotlinReflectionNotSupportedError: Kotlin reflection implementation is not found at runtime. Make sure you have kotlin-reflect.jar in the classpath
informar errorjava.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter cookieJar
Puede ser que el sdk de terceros al que se hace referencia en el apk de origen contenga una biblioteca compilada con kotlin, por lo que se informa este error
-
Solución: haga referencia a la biblioteca de reflejos de kotlin en el proyecto de shell:
implementation "org.jetbrains.kotlin:kotlin-reflect:1.4.32"
Referencia: https://stackoverflow.com/questions/36440295/kotlin-jvm-kotlinreflectionnotsupportederror-kotlin-reflection-implementation-i
La biblioteca so correspondiente a la cpu no se puede encontrar cuando se ejecuta el apk de origen después de desempaquetar
Informar un error de Android y no poder encontrar una ventana emergente correspondiente a la CPU, por lo que
Aunque hay una biblioteca so correspondiente en el directorio de cpu especificado después de desempaquetar, pero se informa un error
-
Solución: cree un directorio correspondiente a la CPU en el proyecto de shell y cree una biblioteca libXXX.so vacía (no sé por qué), como
lib\armeabi-v7a\libBugly.so
olib\arm64-v8a\libBugly.so
!!!PD: si crea dos directorios de cpu
lib\armeabi-v7a\libBugly.so
o al mismo tiempolib\arm64-v8a\libBugly.so
, aparecerá un error y solo podrá crear el archivo so correspondiente a la cpuSi está en la lista de Google, puede crear dos, porque Google distribuirá diferentes apks a los usuarios para su instalación de acuerdo con la CPU.
No se puede encontrar el dex correspondiente a la cpu cuando se ejecuta el apk de origen después de desempaquetar
informar error
java.lang.IncompatibleClassChangeError: Structural change of androidx.fragment.app.Fragment is hazardous (/data/user/0/com.rmgrummy.pro/app_payload_odex/payload.dex at compile time, /data/app/com.rmgrummy.pro-1/oat/x86/base.odex at runtime): Virtual method count off: 179 vs 184
Landroidx/fragment/app/Fragment; (Compile time):
Static fields:
Este error se informó al llamar al código de la interfaz de pantalla, porque el paquete apk de origen no habilitó la CPU de la máquina en ejecución, por lo que
- Solución: empaquete y ejecute la biblioteca so de la máquina al abrir el apk fuente
Instalado en Android 11+ (API nivel 30) la máquina no está alineada en 4 bytes o resources.arsc está comprimido
Error:adb: failed to install xxx.apk: Failure [-124: Failed parse during installPackageLI: Targeting R+ (version 30 and above) requires the resources.arsc of installed APKs to be stored uncompressed and aligned on a 4-byte boundary]
-
Puede haber dos problemas aquí
-
recursos.arsc está comprimido
-
Solución: al comprimir el archivo del directorio apk, se le da un tratamiento especial a resources.arsc sin compresión
El tipo de compresión zip predeterminado es
ziplib.ZIP_DEFLATED
, que debe configurarse para este archivoziplib.ZIP_STORED
, código de referencia de Python# 压缩 srcDir 目录为 dstFile def zipDir(srcDir: str, dstFile: str, mode: int = ziplib.ZIP_DEFLATED, isIncludeParent: bool = True): with ziplib.ZipFile(dstFile, 'w', mode) as zip: pDir = isIncludeParent and os.path.dirname(srcDir) or srcDir for root, dirs, files in os.walk(srcDir): for file in files: absDir = os.path.join(root, file) relativeDir = absDir.replace(pDir, "") if "resources.arsc" in relativeDir: # 特殊处理这个文件 zip.write(absDir, relativeDir, ziplib.ZIP_STORED) else: zip.write(absDir, relativeDir)
-
Referencia: NEPTUNE ANDROID11 RESOURCES.ARSC no admite la resolución de problemas de compresión: https://www.freesion.com/article/75641402392/
-
-
El paquete apk no está alineado en 4 bytes
- Antes de firmar, se alinean 4 bytes y luego se firman
$ zipalign -p -f -v 4 in_unalign.apk out_align.apk
Referencia: Android firma manualmente apk a través de apksigner - https://blog.csdn.net/q610098308/article/details/105138228
-
Instale en una máquina Android 11+ e informe un error al menos esquema v2
Error:ERROR: Target SDK version 32 requires a minimum of signature scheme v2; the APK is not signed with this or a later signature scheme
-
Solución: use
apksigner.jar
para firmar, no usejarsigner.jar
$ java -jar apksigner.jar sign -verbose --v1-signing-enabled false --v2-signing-enabled true --ks [证书文件.jks] --ks-key-alias [证书别名] --ks-pass pass:[证书密码] --key-pass pass:[别名密码] --out [out_sign.apk] --in [in_unsign.apk]
La descompresión de la biblioteca nativa falló
Error:INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, res=-2
-
Solución: abra AndroidManifest.xml y agregue el nodo de la aplicación:
android:extractNativeLibs="true"
Referencia: https://blog.csdn.net/kidults/article/details/106570878