Un estudio preliminar sobre la descompilación de Android: conceptos básicos

prefacio

Objetivos de este artículo:

  1. Herramientas: presenta las herramientas necesarias para la descompilación
  2. Principio: el principio básico de la descompilación
  3. Práctica: reemplace la página de inicio de un apk no ofuscado y no reforzado

herramienta

1. Estudio de Android

Versión: Android Studio Dolphin | 2021.3.1 Parche 1

2.Descompilador de clase Jadx。

Un complemento que integra jadx-gui AndroidStudio/IDEA.
Ventajas: dex2jar&jd-guiuna combinación única, más cómoda de usar.
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

3.apktool

Herramienta de inversión de archivos apk de Android.
https://ibotpeaches.github.io/Apktool/

4. jadx

Dex to Java Decompiler, línea de comandos y herramienta GUI para generar código fuente Java a partir de archivos Android Dex y Apk.
Ventajas: la combinación de dex2jar&jd-gui, esta es suficiente.
Desventajas: No existe un programa ejecutable para mac.
https://github.com/skylot/jadx

5.LibChecker.apk

Esta aplicación se utiliza para ver bibliotecas de terceros utilizadas por aplicaciones en el dispositivo. Puede mirar la arquitectura ABI de las bibliotecas nativas de la aplicación (en general, independientemente de si la aplicación es de 64 bits o de 32 bits). También puede ver bibliotecas conocidas marcadas por The Rule Repository, e incluso ordenarlas y verlas por el número de referencias de bibliotecas.

Software de análisis de aplicaciones de Android muy fácil de usar, utilizado principalmente para analizar la estructura básica de la aplicación, verificar el nombre del paquete, etc.
https://github.com/LibChecker/LibChecker

6.dex2jar

Descompile el archivo dex en un archivo jar.
https://github.com/pxb1988/dex2jar

7. jd-gui

Ver el programa ejecutable del código fuente del jar.
http://java-decompiler.github.io/
El programa ejecutable mac no se puede ejecutar en m1, consulte: La solución JD-GUI no se puede abrir en Mac

8. java2smali

Un complemento que puede convertir el código java y kotlin en smali AndroidStudio/IDEA.
Parece que el código puro de java y kotlin solo se puede compilar en smali. Se dice que el código de AndroidX informará un error, y también informé un error al compilar la Actividad yo mismo.

9.smali2java

smali2java es una herramienta para descompilar código smali en código java.
Desventajas: No hay versión para Mac disponible.
http://www.hensence.com/cn/smali2java/

10. J2S2J

Herramientas de java a smali, de smali a java.
Desventajas: No hay versión para Mac disponible.
http://lzonel.cn/3056.html

principio

apk

Haga doble clic en un apk en AndroidStudio para abrirlo y ver los detalles en el apk, o descomprímalo directamente con un software de compresión.
inserte la descripción de la imagen aquí

en:

  1. Carpeta META_INF : almacena la información de la firma sobre el apk. Al instalar el apk, el sistema verificará la información de la firma del apk para juzgar la integridad del programa.
  2. carpeta res : almacena archivos de recursos utilizados por apk.
  3. Carpeta de activos : archivos de recursos nativos, los archivos colocados en esta carpeta no serán compilados por archivos R, se usarán cuando dex se cargue dinámicamente, etc.
  4. Carpeta lib : almacena la biblioteca so compilada por c++.
  5. AndroidManifest.xml : un archivo de manifiesto que almacena la información de configuración del programa apk.
  6. class.dex : archivo DEX (DalvikVM ejecuta), como su nombre indica, es el programa de ejecución en la máquina virtual Android Dalvik, es decir, el código de bytes de Dalvik, y el código del programa está dentro.
  7. resources.arsc : el archivo de recursos binario compilado.

apktool

La herramienta principal para descompilar apk es apktool.

Una herramienta para la ingeniería inversa de aplicaciones de Android binarias, cerradas y de terceros.
Puede decodificar recursos en una forma casi original y reconstruirlos después de realizar algunas modificaciones.
También facilita el trabajo con la aplicación debido a proyectos como la estructura de archivos y automatiza algunas tareas repetitivas como crear apk, etc.

dex es un archivo que contiene código de programa, y ​​el programa de Android se inicia y ejecuta a través del cargador de clases ClassLoader para leer el código en dex para operar.
Por lo tanto, cómo modificar el código en dex es la clave para la descompilación, y apktool puede descompilar dex en archivos pequeños, y completamos el "objetivo" modificando archivos pequeños.
Por lo tanto, el proceso general de descompilación es:

反编译
编译
apktool d test.apk
将dex转换为smali
修改smali
apktool b test
未签名的新apk
重新签名apk

pequeño

Smali y Baksmali se refieren respectivamente al ensamblador y desensamblador de un archivo de formato .dex utilizado por la máquina virtual Java (Dalvik) en el sistema Android.
Su sintaxis es una sintaxis relajada de Jasmin/dedexer e implementa todas las funciones del formato .dex (anotaciones, información de depuración, información de línea, etc.).

Hay tres formas de modificar Smali:

  1. Comprenda la gramática de Smali, ábrala y juegue directamente.
  2. Use las herramientas mencionadas anteriormente para convertir a código Java y modificarlo.
  3. Cree un nuevo proyecto de AndroidStudio, el nombre del paquete es exactamente el mismo que el apk de destino, agregue el código de la clase deseada, empaquételo en un apk de depuración después de la modificación, luego use apktool para descompilar para obtener el archivo smali correspondiente y cópielo al archivo descompilado del apk de destino Reemplace el smali correspondiente.

práctica

Como no conozco la gramática de smali y no he encontrado una herramienta de conversión de smali adecuada para mac, adopto el tercer método de modificación de Smali anterior.

Primero empaquete un apk sin ofuscar y sin endurecer como el apk de destino.

1. Abrir con AndroidStudio

Abra la aplicación de destino en AndroidStudio, ábrala AndroidManifest.xml, lea el nombre del paquete e inicie la Actividad.
inserte la descripción de la imagen aquí
Como se puede ver en la figura anterior:
Nombre del paquete: com.demon.demonnewest
Iniciar actividad es:com.demon.demonnewest.module.StartActivity

2. Cree un nuevo proyecto de AndroidStudio basado en el nombre del paquete anterior

Añadir código de prueba:

TestActivity.kt

package com.demon.demonnewest

import android.content.Intent
import android.os.Bundle
import android.widget.Button
import android.widget.LinearLayout
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
class TestActivity : AppCompatActivity() {
    
    
    override fun onCreate(savedInstanceState: Bundle?) {
    
    
        super.onCreate(savedInstanceState)
        val layout = LinearLayout(this)
        layout.orientation = LinearLayout.VERTICAL
        val text = TextView(this)
        val button = Button(this)
        button.text = "Click"
        layout.addView(text)
        layout.addView(button)
        setContentView(layout)
        val sb: StringBuilder = StringBuilder()
        sb.append("TestActivity\n")
        intent.extras?.run {
    
    
            keySet().forEach {
    
    
                sb.append("$it=${
      
      get(it)}\n")
            }
        }
        text.text = sb.toString()
        button.setOnClickListener {
    
    
           Toast.makeText(this@TestActivity,"Button~",Toast.LENGTH_SHORT).show()
            startActivity(Intent(this@TestActivity, TestJavaActivity::class.java))
        }
    }
}

TestJavaActivity.java

package com.demon.demonnewest;
import android.os.Bundle;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
public class TestJavaActivity extends AppCompatActivity {
    
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        TextView tv = new TextView(this);
        tv.setText("TestJavaActivity");
        Button btn = new Button(this);
        btn.setOnClickListener(view -> Toast.makeText(TestJavaActivity.this,"Button~",Toast.LENGTH_SHORT).show());
        LinearLayout layout = new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);
        layout.addView(tv);
        layout.addView(btn);
        setContentView(layout);
    }
}

3. Empaqueta el nuevo proyecto

Haga doble clic directamente gradle---Tasks---other---assembleDebugpara ejecutar y abrir el paquete de depuración.

Luego app/build/outputs/apk/debug/app-debug.apkbusque la aplicación empaquetada.

Ejecute apktool d app-debug.apkla descompilación en la línea de comandos y encuentre el pequeño que se debe agregar.

inserte la descripción de la imagen aquí

4. Use apktool para descompilar el apk de destino

Obtenga la carpeta de la aplicación descompilada.

apktool d app.apk

inserte la descripción de la imagen aquí

5. Modifique AndroidManifes.xml después de descompilar el apk de destino

El editor puede abrir y modificar directamente.

//...
//修改启动Activty为TestActivity
<activity android:exported="true" android:name="com.demon.demonnewest.TestActivity" android:theme="@style/Theme.Start">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
//添加TestJavaActivity
<activity android:name="com.demon.demonnewest.TestJavaActivity"/>
//...        

6. Agregar nuevo pequeño

Copie el smali obtenido después de agregar el código en el tercer paso a la carpeta smali_classes. Simplemente busque un directorio
que contenga el nombre del paquete de destino: .com.demon.demonnewest
inserte la descripción de la imagen aquí

7. apktool recompilar

El siguiente comando compila la carpeta descompilada modificada en new.apk.

apktool b app -o new.apk

El apk obtenido no está firmado y no se puede instalar, y debe firmarse.

8. Vuelva a firmar new.apk

No se recomienda usar la versión anterior de jarsigner para firmar, solo se puede usar la firma v1 y es posible que los teléfonos móviles de versión alta no puedan instalarla.
La nueva versión de la herramienta de firma v1 y v2 apksigner está en SDK\build-tools\ de la versión >25.

//windows
java -jar apksigner.jar sign  --ks 你的密钥  --ks-key-alias 别名  --ks-pass pass:密钥密码  --key-pass pass:别名密码  --out 签名后的apk路径  待签名的apk 
//mac
./apksigner sign --ks 你的密钥  --ks-key-alias 别名  --ks-pass pass:密钥密码  --key-pass pass:别名密码  --out 签名后的apk路径  待签名的apk

9. Instala y ejecuta el apk firmado

Inicie la aplicación después de la instalación, la página de inicio se ha reemplazado normalmente, el botón puede saltar normalmente y la práctica de descompilación preliminar es exitosa.

referencia

La descompilación de Android es sencilla y práctica

Supongo que te gusta

Origin blog.csdn.net/DeMonliuhui/article/details/128616434
Recomendado
Clasificación