prefacio
Objetivos de este artículo:
- Herramientas: presenta las herramientas necesarias para la descompilación
- Principio: el principio básico de la descompilación
- 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-gui
una combinación única, más cómoda de usar.
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.
en:
- 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.
- carpeta res : almacena archivos de recursos utilizados por apk.
- 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.
- Carpeta lib : almacena la biblioteca so compilada por c++.
- AndroidManifest.xml : un archivo de manifiesto que almacena la información de configuración del programa apk.
- 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.
- 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:
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:
- Comprenda la gramática de Smali, ábrala y juegue directamente.
- Use las herramientas mencionadas anteriormente para convertir a código Java y modificarlo.
- 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.
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---assembleDebug
para ejecutar y abrir el paquete de depuración.
Luego app/build/outputs/apk/debug/app-debug.apk
busque la aplicación empaquetada.
Ejecute apktool d app-debug.apk
la descompilación en la línea de comandos y encuentre el pequeño que se debe agregar.
4. Use apktool para descompilar el apk de destino
Obtenga la carpeta de la aplicación descompilada.
apktool d app.apk
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
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.