xposed 関連アプリケーションがインストールされているかどうかを検出し、スタックを呼び出す不審なメソッドを検出し、ネイティブであるべきではないネイティブ メソッドを検出し、/proc/[pid]/maps を通じて不審な共有オブジェクトまたは JAR を検出します。



パッケージ com.greens1995.myapplication;


android.content.Contextをインポートします。
android.content.pm.ApplicationInfoをインポートします。
android.content.pm.PackageManager をインポートします。
android.util.Log をインポートします。


java.io.BufferedReaderをインポートします。
java.io.FileReaderをインポートします。
java.util.HashSet をインポートします。
java.util.Listをインポートします。
java.util.Setをインポートします。


/**
 * 2018/1/29 にベンによって作成されました。
 */


public class CheckHook {     public static boolean isHook(Context context) {         return isHookByPackageName(context) || isHookByStack(コンテキスト) || isHookByJar();     }     /**      * 包名检测     *      * @param context      * @return












     */
    public static boolean isHookByPackageName(Context context) {         boolean isHook = false;         パッケージマネージャー packageManager = context.getPackageManager();         List<ApplicationInfo> applicationInfoList = packageManager.getInstalledApplications(PackageManager.GET_META_DATA);         if (null == applicationInfoList) {             return isHook;         }         for (ApplicationInfo applicationInfo : applicationInfoList) {             if (applicationInfo.packageName.equals("de.robv.android.xused.installer")) {                 Log.wtf("HookDetection", "システム上で Xused が見つかりました。");                 isHook = true;             }











            if (applicationInfo.packageName.equals("com.saurik.substrate")) {                 isHook = true;                 Log.wtf("HookDetection", "システム上で基板が見つかりました。");             }         }         return isHook;     }  // 1. Xused フレームワーク フックがある場合      // (1) de.robv.android.xused.XusedBridge.main 呼び出しが dalvik.system.NativeStart.main メソッドの後に表示されます      // (2) Xused がコール スタック内のメソッドをフックする場合,       // de.robv.android.xused.XusedBridge.handleHookedMethod も存在します      // および de.robv.android.xused.XusedBridge.invokeOriginalMethodNative 呼び出し      // 2. Substrate フレームワーク フックがある場合      // (1) dalvik .system.NativeStart.com.android.internal.os.ZygoteInit.main は、メイン呼び出しの後に 1 回ではなく 2 回表示されます。  











  


    // (2) Substrate がコール スタック内のメソッドをフックする場合、  
    // com.saurik.substrate.MS$2.invoked、com.saurik.substrate.MS$MethodPointer.invoke および関連する Substrate 拡張機能も存在します。 Method 
    public static boolean isHookByStack(Context context) {         boolean isHook = false;         try {             throw new Exception("blah");         } catch (Exception e) {             int zygoteInitCallCount = 0;             for (StackTraceElement stackTraceElement : e.getStackTrace()) {                 if (stackTraceElement) .getClassName().equals("com.android.internal.os.ZygoteInit")) {                     zygoteInitCallCount++;                     if (zygoteInitCallCount == 2) {









                        Log.wtf("HookDetection", "デバイス上でサブストレートがアクティブです。");
                        isHook = true;
                    if (stackTraceElement.getClassName().equals("com.saurik.substrate.MS $
                2
                ") &&
                        stackTraceElement.getMethodName().equals("invoked")) {                     Log.wtf("HookDetection", "A メソッドスタック トレースは Substrate を使用してフックされています。");                     isHook = true;                 if (stackTraceElement.getClassName().equals("de.robv.android.xused.XownedBridge") &&                 stackTraceElement.getMethodName                         ().





                    Log.wtf("HookDetection", "デバイス上で Xused がアクティブです。");
                    isHook = true;
                if (stackTraceElement.getClassName().equals("de.robv.android.xused.XusedBridge "
                ) &&
                        stackTraceElement.getMethodName().equals("handleHookedMethod")) {                     Log.wtf("HookDetection", "A メソッドスタック トレースは Xused を使用してフックされています。");                     isHook = true;                 isHookを            返し        ます        。    }     public static boolean isHookByJar() {         boolean isHook = false;














            Set<String> ライブラリ = new HashSet();
            文字列マップファイル名 = "/proc/" + android.os.Process.myPid() + "/maps";
            BufferedReader リーダー = new BufferedReader(new FileReader(mapsFilename));
            文字列行;
            while ((line = Reader.readLine()) != null) {                 if (line.endsWith(".so") || line.endsWith(".jar")) {                     int n = line.lastIndexOf(" ") ;                     library.add(line.substring(n + 1));                 }             }             for (文字列ライブラリ : ライブラリ) {                 if (library.contains("com.saurik.substrate")) {







                    Log.wtf("HookDetection", "基板共有オブジェクトが見つかりました: " + ライブラリ);
                    isHook = true;
                if
                (library.contains("XownedBridge.jar")) {                     Log.wtf("HookDetection", "Xowned JAR が見つかりました: " + library);                     isHook = true;                 Reader.close             (             );         catch (例外 e) {             Log.wtf("HookDetection", e.toString());         isHook を返し        ます。    } }













  

Guess you like

Origin blog.csdn.net/qq_37599041/article/details/80110088
Recommended