脱壳之常用的加固样本特征

梆梆加固样本特征

清单文件入口

android:name=“com.SecShell.SecShell.ApplicationWrapper”

特征

  1. 免费版
    在这里插入图片描述
  2. meta-data
    meta-data
  3. 总结
    assets/secData0.jar
    lib/armeabi/libSecShell.so
    lib/armeabi/libSecShell-x86.so
    梆梆企业版
    assets/classes0.jar
    lib/armeabi-v7a/libDexHelper.so
    lib/armeabi-v7a/ libDexHelper-x86.so
    梆梆是把原dex文件加密放到了secData0.jar,所以直接拿到dex文件,修复配置文件的程序入口点就可以重打包完美运行。
    通过还原加密算法,解密secData0.jar,直接解压解密jar就是原dex。
    secData0.jar文件保存在.cache的classes.dex是加密的,主要是通过hook实现,打开时解密,关闭时加密(open、mmap)。
    /data/app/com.qianyu.helloworld-47o1HjF-eZJXXlpOoPX_nA==/lib/arm/libSecShell.so CC688000 1B6AB000

清单文件

package com.SecShell.SecShell;import android.annotation.TargetApi;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.res.Configuration;
import android.view.LayoutInflater;
import java.lang.reflect.Field;/* loaded from: classes.dex */
public class ApplicationWrapper extends Application {public static Application realApplication = null;static {d.a();System.loadLibrary("SecShell");if (Helper.PPATH != null) {System.load(Helper.PPATH);}if (Helper.J2CNAME.equals("SECNEOJ2C")) {return;}System.loadLibrary(Helper.J2CNAME);}@Override // android.content.ContextWrapperprotected void attachBaseContext(Context context) {super.attachBaseContext(context);if (Boolean.parseBoolean(Helper.ABCCHECK)) {e.a(context);}try {if (!"".equals(Helper.APPNAME)) {realApplication = (Application) getClassLoader().loadClass(Helper.APPNAME).newInstance();}} catch (Exception e) {realApplication = null;}Helper.attach(realApplication, context);}@Override // android.content.ContextWrapper, android.content.Contextpublic boolean bindService(Intent intent, ServiceConnection serviceConnection, int i) {if (realApplication != null) {Helper.b(realApplication);return realApplication.bindService(intent, serviceConnection, i);}return super.bindService(intent, serviceConnection, i);}@Override // android.app.Application, android.content.ComponentCallbackspublic void onConfigurationChanged(Configuration configuration) {super.onConfigurationChanged(configuration);if (realApplication != null) {realApplication.onConfigurationChanged(configuration);}}@Override // android.app.Applicationpublic void onCreate() {super.onCreate();try {Helper.c();} catch (Throwable th) {}if (realApplication != null) {Helper.attach(realApplication, null);realApplication.onCreate();LayoutInflater from = LayoutInflater.from(getApplicationContext());try {Field declaredField = LayoutInflater.class.getDeclaredField("mContext");declaredField.setAccessible(true);declaredField.set(from, realApplication);} catch (Exception e) {}}}@Override // android.app.Application, android.content.ComponentCallbackspublic void onLowMemory() {super.onLowMemory();if (realApplication != null) {realApplication.onLowMemory();}}@Override // android.app.Applicationpublic void onTerminate() {super.onTerminate();if (realApplication != null) {realApplication.onTerminate();}}@Override // android.app.Application, android.content.ComponentCallbacks2@TargetApi(14)public void onTrimMemory(int i) {try {super.onTrimMemory(i);if (realApplication != null) {realApplication.onTrimMemory(i);}} catch (Exception e) {}}@Override // android.app.Application@TargetApi(14)public void registerActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks activityLifecycleCallbacks) {super.registerActivityLifecycleCallbacks(activityLifecycleCallbacks);if (realApplication != null) {realApplication.registerActivityLifecycleCallbacks(activityLifecycleCallbacks);}}
}

Helper

package com.SecShell.SecShell;import android.app.Application;
import android.content.Context;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;/* loaded from: classes.dex */
public class Helper {public static ClassLoader cl;public static String PPATH = null;public static String JNIPPATH = null;public static String PKGNAME = "com.qianyu.helloworld";public static String APPNAME = "";public static String J2CNAME = "SECNEOJ2C";public static String ABCCHECK = "SECNEOCHECK";public static String ISMPASS = "SECNEOMPASS";public static native void attach(Application application, Context context);public static native void b(Application application);public static native void c();public static native String d(String str);public static native Object[] e(Object obj, List list, String str);public static void f(ClassLoader classLoader, String str, String str2) {b.a(classLoader, str, str2);}public static void g(Object obj) {b.a(obj);}public static Object h(ClassLoader classLoader) {return new f(":", classLoader);}public static boolean isInstalled(String str) {BufferedReader bufferedReader;String readLine;try {bufferedReader = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec("pm path " + str).getInputStream()));} catch (IOException e) {e.printStackTrace();}do {readLine = bufferedReader.readLine();if (readLine == null) {return false;}} while (!readLine.startsWith("package:"));return true;}public static void stub() {}
}

a

public final class a {public static final String[] a = {"com.noshufou.android.su", "com.noshufou.android.su.elite", "eu.chainfire.supersu", "com.koushikdutta.superuser", "com.thirdparty.superuser", "com.yellowes.su"};public static final String[] b = {"com.koushikdutta.rommanager", "com.koushikdutta.rommanager.license", "com.dimonvideo.luckypatcher", "com.chelpus.lackypatch", "com.ramdroid.appquarantine", "com.ramdroid.appquarantinepro"};public static final String[] c = {"com.devadvance.rootcloak", "com.devadvance.rootcloakplus", "de.robv.android.xposed.installer", "com.saurik.substrate", "com.zachspong.temprootremovejb", "com.amphoras.hidemyroot", "com.amphoras.hidemyrootadfree", "com.formyhm.hiderootPremium", "com.formyhm.hideroot"};public static final String[] d = {"/data/local/", "/data/local/bin/", "/data/local/xbin/", "/sbin/", "/su/bin/", "/system/bin/", "/system/bin/.ext/", "/system/bin/failsafe/", "/system/sd/xbin/", "/system/usr/we-need-root/", "/system/xbin/"};public static final String[] e = {"/system", "/system/bin", "/system/sbin", "/system/xbin", "/vendor/bin", "/sbin", "/etc"};
}

b

/* loaded from: classes.dex */
public class b {private static ArrayList a = new ArrayList();/* JADX INFO: Access modifiers changed from: private *//* loaded from: classes.dex */public static final class a {private static Object[] a(Object obj, ArrayList arrayList, File file) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {return (Object[]) b.b(obj, "makeDexElements", ArrayList.class, File.class).invoke(obj, arrayList, file);}/* JADX INFO: Access modifiers changed from: private */public static void b(ClassLoader classLoader, List list, File file) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, InvocationTargetException, NoSuchMethodException {Object obj = b.b(classLoader, "pathList").get(classLoader);b.b(obj, "dexElements", a(obj, new ArrayList(list), file));}}/* JADX INFO: Access modifiers changed from: private *//* renamed from: com.SecShell.SecShell.b$b  reason: collision with other inner class name *//* loaded from: classes.dex */public static final class C0000b {/* JADX INFO: Access modifiers changed from: private */public static void b(ClassLoader classLoader, List list, File file) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, InvocationTargetException, NoSuchMethodException {IOException[] iOExceptionArr;Object obj = b.b(classLoader, "pathList").get(classLoader);ArrayList arrayList = new ArrayList();b.b(obj, "dexElements", b(obj, new ArrayList(list), file, arrayList), Build.VERSION.SDK_INT < 28);if (arrayList.size() > 0) {Iterator it = arrayList.iterator();while (it.hasNext()) {IOException iOException = (IOException) it.next();}Field b = b.b(classLoader, "dexElementsSuppressedExceptions");IOException[] iOExceptionArr2 = (IOException[]) b.get(classLoader);if (iOExceptionArr2 == null) {iOExceptionArr = (IOException[]) arrayList.toArray(new IOException[arrayList.size()]);} else {IOException[] iOExceptionArr3 = new IOException[arrayList.size() + iOExceptionArr2.length];arrayList.toArray(iOExceptionArr3);System.arraycopy(iOExceptionArr2, 0, iOExceptionArr3, arrayList.size(), iOExceptionArr2.length);iOExceptionArr = iOExceptionArr3;}b.set(classLoader, iOExceptionArr);}}/* JADX INFO: Access modifiers changed from: private */public static Object[] b(Object obj, ArrayList arrayList, File file, ArrayList arrayList2) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {Method method = null;try {method = b.b(obj, "makeDexElements", ArrayList.class, File.class, ArrayList.class);} catch (Exception e) {}if (method == null) {try {method = b.b(obj, "makePathElements", List.class, File.class, List.class);} catch (Exception e2) {}}return (Object[]) method.invoke(obj, arrayList, file, arrayList2);}}/* JADX INFO: Access modifiers changed from: private *//* loaded from: classes.dex */public static final class c {/* JADX INFO: Access modifiers changed from: private */public static void b(ClassLoader classLoader, List list) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, IOException {int size = list.size();Field b = b.b(classLoader, "path");StringBuilder sb = new StringBuilder((String) b.get(classLoader));String[] strArr = new String[size];File[] fileArr = new File[size];ZipFile[] zipFileArr = new ZipFile[size];DexFile[] dexFileArr = new DexFile[size];ListIterator listIterator = list.listIterator();while (listIterator.hasNext()) {File file = (File) listIterator.next();String absolutePath = file.getAbsolutePath();sb.append(':').append(absolutePath);int previousIndex = listIterator.previousIndex();strArr[previousIndex] = absolutePath;fileArr[previousIndex] = file;zipFileArr[previousIndex] = new ZipFile(file);dexFileArr[previousIndex] = DexFile.loadDex(absolutePath, absolutePath + ".dex", 0);}b.set(classLoader, sb.toString());b.b(classLoader, "mPaths", strArr);b.b(classLoader, "mFiles", fileArr);b.b(classLoader, "mZips", zipFileArr);b.b(classLoader, "mDexs", dexFileArr);}}private static void a(ClassLoader classLoader, File file, List list) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, InvocationTargetException, NoSuchMethodException, IOException {if (list.isEmpty()) {return;}if ((Build.VERSION.RELEASE.equals("P") || Build.VERSION.SDK_INT >= 28) && !Boolean.parseBoolean(Helper.ISMPASS)) {a(classLoader, ((File) list.get(0)).getAbsolutePath());} else if (Build.VERSION.SDK_INT >= 19) {C0000b.b(classLoader, list, file);} else if (Build.VERSION.SDK_INT >= 14) {a.b(classLoader, list, file);} else {c.b(classLoader, list);}}private static void a(ClassLoader classLoader, String str) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, InvocationTargetException, NoSuchMethodException {IOException[] iOExceptionArr;Object obj = b(classLoader, "pathList").get(classLoader);ArrayList arrayList = new ArrayList();b(obj, "dexElements", Helper.e(obj, arrayList, str), false);if (arrayList.size() > 0) {Iterator it = arrayList.iterator();while (it.hasNext()) {((IOException) it.next()).printStackTrace(System.out);}Field b = b(classLoader, "dexElementsSuppressedExceptions");IOException[] iOExceptionArr2 = (IOException[]) b.get(classLoader);if (iOExceptionArr2 == null) {iOExceptionArr = (IOException[]) arrayList.toArray(new IOException[arrayList.size()]);} else {IOException[] iOExceptionArr3 = new IOException[arrayList.size() + iOExceptionArr2.length];arrayList.toArray(iOExceptionArr3);System.arraycopy(iOExceptionArr2, 0, iOExceptionArr3, arrayList.size(), iOExceptionArr2.length);iOExceptionArr = iOExceptionArr3;}b.set(classLoader, iOExceptionArr);}}public static void a(ClassLoader classLoader, String str, String str2) {try {a(classLoader, new File(str2), Arrays.asList(new File(str)));} catch (Exception e) {}}public static void a(Object obj) {Object[] objArr;try {ArrayList arrayList = new ArrayList();Field b = b(obj, "dexElements");for (Object obj2 : (Object[]) b.get(obj)) {DexFile dexFile = (DexFile) b(obj2, "dexFile").get(obj2);if (dexFile != null) {arrayList.add(new File(dexFile.getName()));a.add(dexFile);}}b.set(obj, C0000b.b(obj, arrayList, null, new ArrayList()));} catch (Exception e) {}}/* JADX INFO: Access modifiers changed from: private */public static Field b(Object obj, String str) throws NoSuchFieldException {for (Class<?> cls = obj.getClass(); cls != null; cls = cls.getSuperclass()) {try {Field declaredField = cls.getDeclaredField(str);if (!declaredField.isAccessible()) {declaredField.setAccessible(true);}return declaredField;} catch (NoSuchFieldException e) {}}throw new NoSuchFieldException("Field " + str + " not found in " + obj.getClass());}/* JADX INFO: Access modifiers changed from: private */public static Method b(Object obj, String str, Class... clsArr) throws NoSuchMethodException {for (Class<?> cls = obj.getClass(); cls != null; cls = cls.getSuperclass()) {try {Method declaredMethod = cls.getDeclaredMethod(str, clsArr);if (!declaredMethod.isAccessible()) {declaredMethod.setAccessible(true);}return declaredMethod;} catch (NoSuchMethodException e) {}}throw new NoSuchMethodException("Method " + str + " with parameters " + Arrays.asList(clsArr) + " not found in " + obj.getClass());}/* JADX INFO: Access modifiers changed from: private */public static void b(Object obj, String str, Object[] objArr) throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException {b(obj, str, objArr, true);}/* JADX INFO: Access modifiers changed from: private */public static void b(Object obj, String str, Object[] objArr, boolean z) throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException {Field b = b(obj, str);Object[] objArr2 = (Object[]) b.get(obj);Object[] objArr3 = (Object[]) Array.newInstance(objArr2.getClass().getComponentType(), objArr2.length + objArr.length);if (z) {System.arraycopy(objArr2, 0, objArr3, objArr.length, objArr2.length);System.arraycopy(objArr, 0, objArr3, 0, objArr.length);} else {System.arraycopy(objArr2, 0, objArr3, 0, objArr2.length);System.arraycopy(objArr, 0, objArr3, objArr2.length, objArr.length);}b.set(obj, objArr3);}
}

c

/* loaded from: classes.dex */
public class c {public static int a(String[] strArr) {try {int i = 0;for (String str : strArr) {try {if (b(str)) {i++;}} catch (Throwable th) {return i;}}return i;} catch (Throwable th2) {return 0;}}public static boolean a(String str) {try {return new File(str).exists();} catch (Exception e) {return false;}}public static boolean b(String str) {try {return a(str);} catch (Throwable th) {th.printStackTrace();return false;}}
}

d

/* loaded from: classes.dex */
public class d extends FileObserver {private static d a;private static Object b = new Object();private static boolean c = true;public d(String str, int i) {super(str, i);}public static void a() {Thread[] threadArr = new Thread[20];int enumerate = Thread.currentThread().getThreadGroup().enumerate(threadArr);boolean z = false;for (int i = 0; i < enumerate; i++) {if ("FileObserver".equals(threadArr[i].getName())) {z = true;}}if (z) {String b2 = b();new File(b2, "miui_notify" + Process.myPid()).delete();a = new d(b2, 256);a.startWatching();try {new File(b2, "miui_notify" + Process.myPid()).createNewFile();} catch (IOException e) {}synchronized (b) {try {if (c) {b.wait(1000L);}} catch (InterruptedException e2) {}}new File(b2, "miui_notify" + Process.myPid()).delete();}}private static String b() {try {Class<?> cls = Class.forName("android.app.ActivityThread");Method method = cls.getMethod("currentActivityThread", new Class[0]);Field declaredField = cls.getDeclaredField("mBoundApplication");boolean isAccessible = declaredField.isAccessible();declaredField.setAccessible(true);Object obj = declaredField.get(method.invoke(null, new Object[0]));declaredField.setAccessible(isAccessible);Field declaredField2 = obj.getClass().getDeclaredField("appInfo");boolean isAccessible2 = declaredField2.isAccessible();declaredField2.setAccessible(true);declaredField2.setAccessible(isAccessible2);return ((ApplicationInfo) declaredField2.get(obj)).dataDir;} catch (Exception e) {return "/data/data/" + Helper.PKGNAME;}}@Override // android.os.FileObserverpublic void onEvent(int i, String str) {stopWatching();synchronized (b) {c = false;b.notify();}try {Thread.sleep(3000L);} catch (InterruptedException e) {}}
}

e

/* loaded from: classes.dex */
public class e {private final Context a;private boolean b = true;public e(Context context) {this.a = context;}public static void a(Context context) {if (new e(context).a()) {System.exit(0);}}private boolean a(List list) {boolean z = false;PackageManager packageManager = this.a.getPackageManager();Iterator it = list.iterator();while (true) {boolean z2 = z;if (!it.hasNext()) {return z2;}try {packageManager.getPackageInfo((String) it.next(), 0);z = true;} catch (PackageManager.NameNotFoundException e) {z = z2;}}}public boolean a() {return b() || c() || a("su") || d() || e() || f() || h();}public boolean a(String str) {String[] strArr;int length = a.d.length;boolean z = false;for (int i = 0; i < length; i++) {if (new File(strArr[i] + str).exists()) {z = true;}}return z;}public boolean a(String[] strArr) {ArrayList arrayList = new ArrayList();arrayList.addAll(Arrays.asList(a.a));if (strArr != null && strArr.length > 0) {arrayList.addAll(Arrays.asList(strArr));}return a(arrayList);}public boolean b() {return a((String[]) null);}public boolean b(String[] strArr) {ArrayList arrayList = new ArrayList();arrayList.addAll(Arrays.asList(a.b));if (strArr != null && strArr.length > 0) {arrayList.addAll(Arrays.asList(strArr));}return a(arrayList);}public boolean c() {return b(null);}/* JADX WARN: Code restructure failed: missing block: B:14:0x0072, code lost:if (r3.equals("0") != false) goto L18;*//*Code decompiled incorrectly, please refer to instructions dump.To view partially-correct code enable 'Show inconsistent code' option in preferences*/public boolean d() {/*r8 = this;r4 = 0r0 = 1r2 = 0java.lang.ProcessBuilder r1 = new java.lang.ProcessBuilder     // Catch: java.lang.Exception -> L78 java.lang.Throwable -> L82r3 = 2java.lang.String[] r3 = new java.lang.String[r3]     // Catch: java.lang.Exception -> L78 java.lang.Throwable -> L82r5 = 0java.lang.String r6 = "getprop"r3[r5] = r6     // Catch: java.lang.Exception -> L78 java.lang.Throwable -> L82r5 = 1java.lang.String r6 = "ro.debuggable"r3[r5] = r6     // Catch: java.lang.Exception -> L78 java.lang.Throwable -> L82r1.<init>(r3)     // Catch: java.lang.Exception -> L78 java.lang.Throwable -> L82r3 = 1r1.redirectErrorStream(r3)     // Catch: java.lang.Exception -> L78 java.lang.Throwable -> L82java.lang.Process r1 = r1.start()     // Catch: java.lang.Exception -> L78 java.lang.Throwable -> L82java.io.BufferedReader r3 = new java.io.BufferedReader     // Catch: java.lang.Exception -> L78 java.lang.Throwable -> L82java.io.InputStreamReader r5 = new java.io.InputStreamReader     // Catch: java.lang.Exception -> L78 java.lang.Throwable -> L82java.io.InputStream r1 = r1.getInputStream()     // Catch: java.lang.Exception -> L78 java.lang.Throwable -> L82r5.<init>(r1)     // Catch: java.lang.Exception -> L78 java.lang.Throwable -> L82r3.<init>(r5)     // Catch: java.lang.Exception -> L78 java.lang.Throwable -> L82java.lang.String r1 = ""java.lang.String r1 = r3.readLine()     // Catch: java.lang.Throwable -> L88 java.lang.Exception -> L8dif (r1 == 0) goto L97java.lang.String r2 = "1"boolean r1 = r1.equals(r2)     // Catch: java.lang.Throwable -> L88 java.lang.Exception -> L8dif (r1 == 0) goto L97r1 = r0L3c:if (r1 != 0) goto L94java.lang.ProcessBuilder r2 = new java.lang.ProcessBuilder     // Catch: java.lang.Throwable -> L88 java.lang.Exception -> L8dr5 = 2java.lang.String[] r5 = new java.lang.String[r5]     // Catch: java.lang.Throwable -> L88 java.lang.Exception -> L8dr6 = 0java.lang.String r7 = "getprop"r5[r6] = r7     // Catch: java.lang.Throwable -> L88 java.lang.Exception -> L8dr6 = 1java.lang.String r7 = "ro.secure"r5[r6] = r7     // Catch: java.lang.Throwable -> L88 java.lang.Exception -> L8dr2.<init>(r5)     // Catch: java.lang.Throwable -> L88 java.lang.Exception -> L8dr5 = 1r2.redirectErrorStream(r5)     // Catch: java.lang.Throwable -> L88 java.lang.Exception -> L8djava.lang.Process r5 = r2.start()     // Catch: java.lang.Throwable -> L88 java.lang.Exception -> L8djava.io.BufferedReader r2 = new java.io.BufferedReader     // Catch: java.lang.Throwable -> L88 java.lang.Exception -> L8djava.io.InputStreamReader r6 = new java.io.InputStreamReader     // Catch: java.lang.Throwable -> L88 java.lang.Exception -> L8djava.io.InputStream r5 = r5.getInputStream()     // Catch: java.lang.Throwable -> L88 java.lang.Exception -> L8dr6.<init>(r5)     // Catch: java.lang.Throwable -> L88 java.lang.Exception -> L8dr2.<init>(r6)     // Catch: java.lang.Throwable -> L88 java.lang.Exception -> L8djava.lang.String r3 = r2.readLine()     // Catch: java.lang.Throwable -> L8a java.lang.Exception -> L8fif (r3 == 0) goto L92java.lang.String r5 = "0"boolean r3 = r3.equals(r5)     // Catch: java.lang.Throwable -> L8a java.lang.Exception -> L8fif (r3 == 0) goto L92L74:com.SecShell.SecShell.g.a(r2)L77:return r0L78:r0 = move-exceptionr3 = r2L7a:r0.printStackTrace()     // Catch: java.lang.Throwable -> L88com.SecShell.SecShell.g.a(r3)r0 = r4goto L77L82:r0 = move-exceptionr3 = r2L84:com.SecShell.SecShell.g.a(r3)throw r0L88:r0 = move-exceptiongoto L84L8a:r0 = move-exceptionr3 = r2goto L84L8d:r0 = move-exceptiongoto L7aL8f:r0 = move-exceptionr3 = r2goto L7aL92:r0 = r1goto L74L94:r0 = r1r2 = r3goto L74L97:r1 = r4goto L3c*/throw new UnsupportedOperationException("Method not decompiled: com.SecShell.SecShell.e.d():boolean");}public boolean e() {BufferedReader bufferedReader;BufferedReader bufferedReader2 = null;try {ProcessBuilder processBuilder = new ProcessBuilder("mount");processBuilder.redirectErrorStream(true);Process start = processBuilder.start();bufferedReader = new BufferedReader(new InputStreamReader(start.getInputStream()));boolean z = false;while (true) {try {String readLine = bufferedReader.readLine();if (readLine == null) {start.waitFor();g.a(bufferedReader);return z;}String[] split = readLine.split(" ");if (split.length >= 4) {String str = split[1];String str2 = split[3];for (String str3 : a.e) {if (str.equalsIgnoreCase(str3)) {String[] split2 = str2.split(",");int length = split2.length;int i = 0;while (true) {if (i >= length) {break;} else if (split2[i].equalsIgnoreCase("rw")) {z = true;break;} else {i++;}}}}}} catch (Exception e) {bufferedReader2 = bufferedReader;g.a(bufferedReader2);return false;} catch (Throwable th) {th = th;g.a(bufferedReader);throw th;}}} catch (Exception e2) {} catch (Throwable th2) {th = th2;bufferedReader = null;}}public boolean f() {BufferedReader bufferedReader;Process start;BufferedReader bufferedReader2;try {ProcessBuilder processBuilder = new ProcessBuilder("which", "su");processBuilder.redirectErrorStream(false);start = processBuilder.start();bufferedReader2 = new BufferedReader(new InputStreamReader(start.getInputStream()));} catch (Throwable th) {bufferedReader = null;}try {String readLine = bufferedReader2.readLine();start.waitFor();g.a(bufferedReader2);if (readLine != null) {if (readLine.endsWith("su")) {return true;}}return false;} catch (Throwable th2) {bufferedReader = bufferedReader2;if (bufferedReader != null) {g.a(bufferedReader);}return false;}}public boolean g() {return true;}public boolean h() {if (g()) {String[] strArr = new String[a.d.length];for (int i = 0; i < strArr.length; i++) {strArr[i] = a.d[i] + "su";}return c.a(strArr) > 0;}return false;}
}

f

/* loaded from: classes.dex */
class f extends PathClassLoader {private final ClassLoader a;public f(String str, ClassLoader classLoader) {super(str, classLoader.getParent());this.a = classLoader;}@Override // dalvik.system.BaseDexClassLoader, java.lang.ClassLoaderpublic Class findClass(String str) throws ClassNotFoundException {return (str == null || !str.equals(Helper.class.getName())) ? super.findClass(str) : this.a.loadClass(str);}
}

g


/* loaded from: classes.dex */
public class g {public static void a(Closeable closeable) {if (closeable != null) {try {closeable.close();} catch (Exception e) {}}}
}

乐谷加固样本特征(ELF区段加密和案例)

主要看assets文件夹和lib文件夹

so文件

lib-shell.so

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/780788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第一次运行 Python 项目,使用 python-pptx 提取 ppt 中的文字和图片

人工智能时代&#xff0c;最需要学习的编程语言是&#xff1a;python 。笔者是个 python 小白&#xff0c;昨天花了两个小时&#xff0c;第一次成功运行起来 python 项目 。 项目是 powerpoint-extractor &#xff0c;可以将 ppt 文件中的图片提取出来&#xff0c;并输出到固定…

Windows安装tomcat,以服务的方式管理,如何设置虚拟内存

之前工作中&#xff0c;部署tomcat都是使用Linux服务器&#xff0c;最近遇到个客户&#xff0c;提供的服务器是Windows server&#xff0c;并且需要通过服务的方式管理tomcat&#xff1b;以自己多年的码农经验&#xff0c;感觉应该没有问题&#xff0c;结果啪啪打脸了&#xf…

双向BFS

P1032 [NOIP2002 提高组] 字串变换 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 方法学自于B19 双向BFS 字串变换_哔哩哔哩_bilibili #include<iostream> #include<algorithm> #include<cstdio> #include<queue> #include<map> using namesp…

Adaboost集成学习 | Matlab实现基于BiLSTM-Adaboost双向长短期记忆神经网络结合Adaboost集成学习时间序列预测(股票价格预测)

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 Matlab实现基于BiLSTM-Adaboost双向长短期记忆神经网络结合Adaboost集成学习时间序列预测(股票价格预测) 模型设计 股票价格预测是一个具有挑战性的时间序列预测问题,可以使用深度学习模型如双向长短期记忆…

python爬虫之selenium4使用(万字讲解)

文章目录 一、前言二、selenium的介绍1、优点&#xff1a;2、缺点&#xff1a; 三、selenium环境搭建1、安装python模块2、selenium4新特性3、安装驱动WebDriver驱动选择驱动安装和测试 基础操作1、属性和方法2、单个元素定位通过id定位通过class_name定位一个元素通过xpath定位…

【OJ】动归练习五之子组串

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 1. 53. 最大子数组和1.1 分析1.2 代码 2. 918. 环形子数组的最大和2.1 分析2.2 代码 3. 152. 乘积最大子数组3.1 分析3.2 代码 4. 1567. 乘积为正数的最长子数组长度4.1 分析4.2 代码 1. 53. 最大子数组和 1.1 分析 一、…

密码学基础-对称密码/公钥密码/混合密码系统 详解

密码学基础-对称密码/公钥密码 加解密说明1.加密解密必要因素加密安全性说明 什么是对称密码图示说明对称密码详解什么是DES?举例说明 什么是3DES什么是AES? 公钥密码什么是RSA? 对称密钥和公钥密码优缺点对比对称密码对称密码算法总结对称密码存在的问题? 公钥密码公钥密码…

npm ERR! errno CERT_HAS_EXPIRED

1 问题描述 使用npm命令安装相关依赖报错&#xff1a;npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/vue%2fcli failed, reason: certificate has expired报错示例图如下所示&#xff1a; 2原因分析…

Spring Boot 整合分布式搜索引擎 Elastic Search 实现 自动补全功能

文章目录 ⛄引言一、分词器⛅拼音分词器⚡自定义分词器 二、自动补全查询三、自动补全⌚业务需求⏰实现酒店搜索自动补全 四、效果图⛵小结 ⛄引言 本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;…

谈一谈BEV和Transformer在自动驾驶中的应用

谈一谈BEV和Transformer在自动驾驶中的应用 BEV和Transformer都这么火&#xff0c;这次就聊一聊。 结尾有资料连接 一 BEV有什么用 首先&#xff0c;鸟瞰图并不能带来新的功能&#xff0c;对规控也没有什么额外的好处。 从鸟瞰图这个名词就可以看出来&#xff0c;本来摄像头…

阿里云Salesforce CRM功能差异列表 - Winter‘24

阉割版的阿里云Salesforce由于技术和监管等因素与国际版的Salesforce差距很大&#xff01; 一、Winter‘ 24版差异概况&#xff1a; 1.1. 主要版本&#xff1a; 阿里云上的 Salesforce 提供两个版本&#xff0c;用于生产用途的 CN 版本&#xff08;CN Edition&#xff09;和用…

day4 linux上部署第一个nest项目(java转ts全栈/3R教室)

背景&#xff1a;上一篇吧nest-vben-admin项目&#xff0c;再开发环境上跑通了&#xff0c;并且build出来了dist文件&#xff0c;接下来再部署到linux试试吧 dist文件夹是干嘛的&#xff1f; 一个pnpn install 直接生成了两个dist文件夹&#xff0c;前端admin项目一个&#xf…

Jenkins磁盘空间批量清理脚本

一、简介 Jenkins如果没有设置保留构建历史数&#xff0c;磁盘会随着使用次数增加而越来越满&#xff0c;于是需要批量清理一下。 二、清理脚本 找到Script Console 输入脚本&#xff0c;并点击执行&#xff0c;需要注意期望删除的构建历史编号&#xff08;可以查看下面的效果…

14. Springboot集成RabbitMQ

目录 1、前言 2、什么是RabbitMQ 3、安装RabbitMQ 4、Springboot集成RabbitMQ 4.1、添加依赖 4.2、添加配置 4.3、添加controller&#xff0c;作为生产者 4.4、设置生产者消息确认CallBack 4.5、添加Consumer&#xff0c;作为消费者 4.6、启动程序&#xff0c;访问 1…

关键字:this总结

this关键字的使用1. 目前可能出现的问题&#xff1f;及解决方案&#xff1f;我们在声明一个属性对应的setXxx方法时&#xff0c;通过形参给对应的属性赋值。如果形参名和属性名同名了&#xff0c;那么该如何在方法内区分这两个变量呢&#xff1f;解决方案&#xff1a;使用this。…

YOLOv9改进策略 :block优化 | 无需TokenMixer也能达成SOTA性能的极简ViT架构 | CVPR2023 RIFormer

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a; token mixer被验证能够大幅度提升性能&#xff0c;但典型的token mixer为自注意力机制&#xff0c;推理耗时长&#xff0c;计算代价大&#xff0c;而RIFormers是无需TokenMixer也能达成SOTA性能的极简ViT架构…

java寻找递增子序列(力扣Leetcode491)

寻找递增子序列 力扣原题链接 问题描述 给定一个整数数组 nums&#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中至少有两个元素。你可以按任意顺序返回答案。数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也可以视作递增序…

Raspberry Pi Pico 可以充当 GPU 吗?

来自 element14 的克莱姆的任务是探索将 Raspberry Pi Pico 转化为 GPU 的可能性&#xff0c;以便在游戏中渲染超级流畅的图形。是的&#xff0c;你没有看错&#xff01;他不是在尝试使用我们的怪物级新 Raspberry Pi 5&#xff0c;甚至不是 Pi 4&#xff0c;他是在尝试使用我们…

数据结构:归并排序

归并排序 时间复杂度O(N*logN) 如果两个序列有序,通过归并,可以让两个序列合并后也有序,变成一个有序的新数组 对于一个数组,如果他的左右区间都有序,就可以进行归并了 归并的方法 将数组的左右两个有序区间比较,每次都取出一个最小的,然后放入临时数组(不能在原数组上修改…

PermissionError: [WinError 5] 拒绝访问。: ‘..\\data‘ 怎么解决

问题 在b站跟着沐神学深度学习&#xff0c;刚开始就遇到问题了&#xff0c;代码如下&#xff1a; import osos.makedirs(os.path.join(..,data),exist_okTrue) data_fileos.path.join(..,data,house_tiny.csv) with open(data_file,w) as f:f.write(NumRooms,Alley,Price\n)f…