Xposed Hookは、APPを難読化および強化しました

さっき、本社からグーグルの息子ネクサス6を手に取ったところ、root化後、Xposedを使ってクールにしたかったのですが、アプリを開くと美徳になりました。

 

まさか、かっこよくならないので、自分でやります。

 

分析APK

最も基本的な分析ではAndroidStudioを使用できます。インストールパッケージを、Android Studioによって開かれたプロジェクトディレクトリにコピーし、大まかに確認します。

 

dexファイルにはcom.huimai365パッケージがなく、libの下のsoファイルが50%以上を占めています。しばらく心が冷たくなり、ふき取って補強しました!

 

いいえ、第一線のプログラマーとして、どうすれば軽くあきらめることができますか?

 

砲撃

何度も考えた結果(グーグル)、ついにばかスタイルの砲撃ツールdumpDexを見つけました。これは、非常に使いやすいとは思っていませんでした。

 

「解凍をクリック」した後/data/data/com.huimai365/dump、フォルダの下にたくさんのdexファイルが見つかり、成功に一歩近づいたと感じました。

 

次のステップは物理的な作業です。すべてのdexをプルダウンし、dex2jarツールを使用してdexを1つずつjarに変換します。このために私はバッチ操作スクリプトを書きました、「xxx」ディレクトリはすべてのdexファイルを保存します

 

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

次に、JD-GUIを使用して、必要なパッケージ名を見つけますcom.huimai365。幸い、ついに見つけました。残念ながら、コードがわかりにくいです。君たちはできる!

 

 

分析コード

 

まずつま先で分析してみましょう。この検出Xposedは基本的ApplicationonCreateメソッドで実行さ次にウィンドウがポップアップします。さて、それから私たちは彼らが彼ら自身を実装するApplicationクラスを探します

 

次にonCreate、メソッドを分析します

 

私はar.a();方法を見つけました、クリックして見てください、確かに!(ここに示されているコードの一部のみです)Xposedを検出するだけでなく、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;
  }
}
复制代码

フック方式

上記の分析から、我々は唯一の必要のメソッドフックをじゃやれ!ara()a(Context paramContext)

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;
            }
        });
    }
}
复制代码

しかし、物事は想像したほど単純ではなく、エラーが報告されました

 

 

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)
复制代码

問題を分析する

 

なぜこのクラスがあるのにClassNotFoundErrorがあるのですか?強化の原理を理解するために、元のAPPがパックされた後、クラスローダーが変更されたことがわかりました。したがって、元のクラスローダーを使用すると、クラスが見つからないという例外が報告されます。このアプリはTencentのLeguを使用しAndroidManifest.xmlており、内部のアプリケーションがに置き換えられていることがわかりますcom.tencent.StubShell.TxAppEntry

 

次に、TxAppEntryこのクラスをもう一度見てみましょうclasses.dexこれは、解凍されたファイルにあります。

 

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

ここでクラスローダーが変更されていることが判明したので、変更されたクラスローダーを取得してフックすることができますか?OK、OK、OK、位置を変えてもう一度やりましょう

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;
            }
        });

    }
}
复制代码

エンディング

 

 

ああ、全世界は静かです。体が震えると、このアプリは鈍くなった...

 

総括する

実際、私はここでさまざまなツールを統合しているだけであり、知識のほとんどはインターネットから得られます。読者が少しでも多くのことを学べるように、良いスタートになることを願っています。さらに、これらのツールを作る偉人を心から賞賛しているので、私はまだ長い道のりがあるようです!

実際、私が技術記事を書くのはこれが初めてです。これは私のお気に入りの国内プラットフォーム(誰もいない)なので、特にナゲッツに載せました。ナゲッツがどんどん良くなっていくことを願っています。忘れないでください。本来の意図!

参照

申し訳ありませんが、Xposedは本当にあなたがやりたいことを何でもすることができます-5。自分でブラッシングしたXposedを使用しないのはなぜですか?

dumpDex-Androidシェル

Androidの逆道---砲撃360補強

おすすめ

転載: blog.csdn.net/THMAIL/article/details/112061570