パッケージ 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 を返し ます。 } }