refuerzo de Android-Shell


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

  1. ver comando

    $ nm -D libx8a3pjbix.so
    

    como

  2. 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

  1. Descomprima directamente el apk como un zip en un directorio a

  2. Reforzar la dex y así en el futuro

  3. 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)

  4. Realice la alineación de 4 bytes en el apk comprimido

    $ zipalign.exe -p -f -v 4 I:/unalign.apk I:/align.apk
    
    
  5. 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.1se compila usando SDK 31

  • La solución es hacer referencia a no más de la biblioteca compilada SDK 30implementation '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
    1. Cargue la actividad de inicio configurada en AndroidManifest.xml en el shell apk en el código de shell al inicio
    2. 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.soolib\arm64-v8a\libBugly.so

    imagen-20221009102156129

    !!!PD: si crea dos directorios de cpu lib\armeabi-v7a\libBugly.soo al mismo tiempo lib\arm64-v8a\libBugly.so, aparecerá un error y solo podrá crear el archivo so correspondiente a la cpu

    Si 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í

    1. 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 archivo ziplib.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/

    2. 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.jarpara 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


Supongo que te gusta

Origin blog.csdn.net/yangxuan0261/article/details/128047927
Recomendado
Clasificación