Xposed Hook confundido y endurecido APP

Hace un tiempo, acabo de comprar un Nexus 6 hijo de Google de la oficina central. Después de Rooting, usé Xposed. Solo quería hacerlo genial, pero cuando se abrió una de las aplicaciones, se convirtió en una virtuosa.

 

De ninguna manera, ya que no me enfriará, lo haré yo mismo.

 

Análisis APK

El análisis más básico puede usar Android Studio, copiamos el paquete de instalación al directorio del proyecto abierto por Android Studio y lo verificamos aproximadamente

 

No hay ningún com.huimai365paquete en el archivo dex , y el archivo so en lib representó más del 50%. Mi corazón se sintió frío por un tiempo, lo limpié, ¡está reforzado!

 

No, como programador de primera línea, ¿cómo puede darse por vencido a la ligera?

 

Bombardeo

Después de muchas reflexiones (google), finalmente encontré una herramienta de bombardeo al estilo tonto dumpDex , que no esperaba que fuera muy fácil de usar.

 

Después de "hacer clic en desempaquetar", /data/data/com.huimai365/dumpencontramos muchos archivos dex debajo de la carpeta, ¡y sentimos que estábamos un paso más cerca del éxito!

 

El siguiente paso es el trabajo físico. Bajamos todos los dex y usamos la herramienta dex2jar para convertir dex en jar uno por uno. Para esto escribí un script de operación por lotes, el directorio "xxx" almacena todos los archivos dex

 

dir=../xxx/
 
for file in $dir/*; do
    ./d2j-dex2jar.sh $file
done
复制代码

Luego use JD-GUI para encontrar el nombre del paquete que necesitamos com.huimai365. Afortunadamente, finalmente lo encontré. Desafortunadamente, el código es confuso. ¡Ustedes pueden!

 

 

Código de análisis

 

Primero analicemos con los dedos de los pies, esta detección Xposed se ejecuta básicamente en Applicationel onCreatemétodo, y luego aparece la ventana. Bien, entonces buscaremos las Applicationclases que ellos mismos implementan .

 

Luego analiza onCreateel método

 

Encontré una ar.a();manera, haga clic y eche un vistazo, ¡seguro! (Aquí solo se muestra una parte del código) No solo detecta Xposed, sino que también quiero apagar Xposed, Woj!

 

public class ar
{
  public static void a()
  {
    try
    {
      Field localField = ClassLoader.getSystemClassLoader().loadClass("de.robv.android.xposed.XposedBridge").getDeclaredField("disableHooks");
      localField.setAccessible(true);
      localField.set(null, Boolean.valueOf(true));
      return;
    }
    catch (Throwable localThrowable) {}
  }
  
  public static boolean a(Context paramContext)
  {
    return (b(paramContext)) || (c(paramContext)) || (b()) || (c());
  }
  
  private static boolean b(Context paramContext)
  {
    paramContext = paramContext.getPackageManager().getInstalledApplications(128);
    if (paramContext == null) {
      return false;
    }
    paramContext = paramContext.iterator();
    boolean bool = false;
    if (paramContext.hasNext())
    {
      ApplicationInfo localApplicationInfo = (ApplicationInfo)paramContext.next();
      if (localApplicationInfo.packageName.equals("de.robv.android.xposed.installer"))
      {
        ac.d("HookDetection", "Xposed found on the system.");
        bool = true;
      }
      if (!localApplicationInfo.packageName.equals("com.saurik.substrate")) {
        break label92;
      }
      ac.d("HookDetection", "Substrate found on the system.");
      bool = true;
    }
    label92:
    for (;;)
    {
      break;
      return bool;
    }
  }
  
  private static boolean c()
  {
    try
    {
      Object localObject = ClassLoader.getSystemClassLoader().loadClass("de.robv.android.xposed.XposedHelpers").newInstance();
      if (localObject != null) {
        if ((!a(localObject, "fieldCache")) && (!a(localObject, "methodCache")))
        {
          boolean bool = a(localObject, "constructorCache");
          if (!bool) {}
        }
        else
        {
          return true;
        }
      }
    }
    catch (Throwable localThrowable) {}
    return false;
  }
}
复制代码

Método de gancho

Del análisis anterior, solo necesitamos arel método de a()suma a(Context paramContext)en Hook . ¡Entonces hacerlo!

public class XposedHookInit implements IXposedHookLoadPackage {
    private static final String TAG = "XposedHookInit";

    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {

        if ("com.huimai365".equals(lpparam.packageName)) {
            Log.e(TAG, "Find 优品惠 " + lpparam.packageName);
            hookCheckoutXposed(lpparam.classLoader);
        }
    }

    private void hookCheckoutXposed(ClassLoader classLoader) {
        XposedHelpers.findAndHookMethod("com.huimai365.util.ar", classLoader, "a", new XC_MethodReplacement() {
            @Override
            protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
                Log.e(TAG, "Replace close xposed");
                return null;
            }
        });

        XposedHelpers.findAndHookMethod("com.huimai365.util.ar", classLoader, "a", Context.class, new XC_MethodReplacement() {
            @Override
            protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
                Log.e(TAG, "Replace find xposed");
                return false;
            }
        });
    }
}
复制代码

Pero las cosas no son tan simples como se imaginaban, se informó un error

 

 

2019-01-17 12:46:17.038 5888-5888/? E/Xposed: de.robv.android.xposed.XposedHelpers$ClassNotFoundError: java.lang.ClassNotFoundException: com.huimai365.util.ar
        at de.robv.android.xposed.XposedHelpers.findClass(XposedHelpers.java:71)
        at de.robv.android.xposed.XposedHelpers.findAndHookMethod(XposedHelpers.java:260)
        at com.example.xposeddemo.XposedHookInit.hookCheckoutXposed(XposedHookInit.java:35)
        at com.example.xposeddemo.XposedHookInit.handleLoadPackage(XposedHookInit.java:20)
        at de.robv.android.xposed.IXposedHookLoadPackage$Wrapper.handleLoadPackage(IXposedHookLoadPackage.java:34)
        at de.robv.android.xposed.callbacks.XC_LoadPackage.call(XC_LoadPackage.java:61)
        at de.robv.android.xposed.callbacks.XCallback.callAll(XCallback.java:106)
        at de.robv.android.xposed.XposedInit$2.beforeHookedMethod(XposedInit.java:134)
        at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:340)
        at android.app.ActivityThread.handleBindApplication(<Xposed>)
        at android.app.ActivityThread.-wrap2(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1546)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6121)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
        at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:107)
     Caused by: java.lang.ClassNotFoundException: com.huimai365.util.ar
        at java.lang.Class.classForName(Native Method)
        at java.lang.Class.forName(Class.java:400)
        at external.org.apache.commons.lang3.ClassUtils.getClass(ClassUtils.java:823)
复制代码

analizar el problema

 

¿Por qué existe esta clase pero ClassNotFoundError? Para entender el principio de refuerzo, aprendí que después de empaquetar la aplicación original, se cambió el cargador de clases, por lo tanto, cuando usemos el cargador de clases original, se informará una excepción de que no se puede encontrar la clase. Esta aplicación usa Legu de Tencent, y vemos que AndroidManifest.xmlla aplicación interna ha sido reemplazada porcom.tencent.StubShell.TxAppEntry

 

Entonces echemos un vistazo a TxAppEntryesta clase nuevamente , está en el classes.dexarchivo descomprimido .

 

  protected void attachBaseContext(Context paramContext)
  {
    super.attachBaseContext(paramContext);
    SystemClassLoaderInjector.fixAndroid(paramContext, this);
    if (!b(this)) {
      return;
    }
    d(paramContext);
    a(this);
  }
复制代码

¿Resulta que el cargador de clases se cambia aquí, por lo que podemos obtener el cargador de clases cambiado y luego engancharlo? ! De acuerdo, de acuerdo, de acuerdo, cambiemos la posición y hagámoslo de nuevo

public class XposedHookInit implements IXposedHookLoadPackage {
    private static final String TAG = "XposedHookInit";

    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {

        if ("com.huimai365".equals(lpparam.packageName)) {
            Log.e(TAG, "Find 优品惠 " + lpparam.packageName);
            XposedHelpers.findAndHookMethod("com.tencent.StubShell.TxAppEntry", lpparam.classLoader,
                    "attachBaseContext", Context.class, new XC_MethodHook() {
                        @Override
                        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                            super.afterHookedMethod(param);
                            //获取到Context对象,通过这个对象来获取classloader
                            Context context = (Context) param.args[0];
                            //获取classloader,之后hook加固后的就使用这个classloader
                            ClassLoader realClassLoader = context.getClassLoader();
                            //下面就是将classloader修改成壳的classloader就可以成功的hook了
                            hookCheckoutXposed(realClassLoader);

                        }
                    });
        }
    }

    private void hookCheckoutXposed(ClassLoader classLoader) {
        XposedHelpers.findAndHookMethod("com.huimai365.util.ar", classLoader, "a", new XC_MethodReplacement() {
            @Override
            protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
                Log.e(TAG, "Replace close xposed");
                return null;
            }
        });

        XposedHelpers.findAndHookMethod("com.huimai365.util.ar", classLoader, "a", Context.class, new XC_MethodReplacement() {
            @Override
            protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
                Log.e(TAG, "Replace find xposed");
                return false;
            }
        });

    }
}
复制代码

finalizando

 

 

Ah, el mundo entero está en silencio. Cuando el cuerpo se estremeció, esta aplicación se volvió aburrida ...

 

para resumir

De hecho, solo estoy integrando varias herramientas aquí, y la mayor parte del conocimiento se obtiene de Internet. Espero que sea un buen comienzo, para que los lectores puedan ganar un poco. Además, admirando sinceramente a estos grandes fabricantes de herramientas, ¡parece que todavía tengo un largo camino por recorrer!

De hecho, esta es la primera vez que escribo un artículo técnico. Lo puse específicamente en los Nuggets, porque esta es mi plataforma doméstica favorita (nadie). Espero que los Nuggets mejoren cada vez más. No olviden el ¡intención original!

Referencia

Lo siento, Xposed realmente puede hacer lo que quieras: 5. ¿Por qué no uso Xposed que me cepillé yo mismo?

bombardeo dumpDex-Android

Android camino inverso --- bombardeo 360 refuerzo

Supongo que te gusta

Origin blog.csdn.net/THMAIL/article/details/112061570
Recomendado
Clasificación