正在查看: Perplexity v2.48.1 应用的 KillerApplication.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
正在查看: Perplexity v2.48.1 应用的 KillerApplication.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
package bin.mt.signature;
import android.app.Application;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.os.Build;
import android.os.Environment;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Base64;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import org.lsposed.hiddenapibypass.HiddenApiBypass;
public class KillerApplication extends Application {
public static final String URL = "https://github.com/L-JINBIN/ApkSignatureKillerEx";
static {
killPM("ai.perplexity.app.android", "MIIFiDCCA3CgAwIBAgIUBASoNuYvIVLCnmnH/7xr71y8THswDQYJKoZIhvcNAQELBQAwdDELMAkG\nA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDAS\nBgNVBAoTC0dvb2dsZSBJbmMuMRAwDgYDVQQLEwdBbmRyb2lkMRAwDgYDVQQDEwdBbmRyb2lkMCAX\nDTIzMDQzMDEzNDgxNloYDzIwNTMwNDMwMTM0ODE2WjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMK\nQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4x\nEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWQwggIiMA0GCSqGSIb3DQEBAQUAA4IC\nDwAwggIKAoICAQDr9gxzLxytBZXfXxxk5e5HNdgXcbZaUYA3ZGPQDo/nIsInKIRTt9gjdtw2thba\nM71MH1zdM7cJ6LB5c3QPLQFGuDFYTLeefnVTBgHRfIWZXTCKtdjqgTT5Hsf94rphqHxrolcL5y/d\nf5tNrX9IUl8KYaMMWiOSXi3tQqo0GRE+ERm8farHdu45V6+vsQCInIWqGIT63WTitad3esnhneRX\n67zPmvBLkqImCqZ3DqXPUVMlHhX8PfpHDoXDEQvM0bp/b4XXXfpTbscJNA2ClXGDhluo0eMcsFla\n7AoQRUopbe7Vm95qg3Bw5YmlJMZKnRA0GPmn5LgIpivKvHHIDh6DUhiEeccb68tdkgtOmEsZ5a15\npolFRWhFfWJxILfjLaPegmej9imlkK1XnzjG61uAFEtfI+GWelqVbPkA6sBZnYxunmBYvLA+MNe6\nqJPGv/xE2QkDTHN3jt2sAJltswIziQun1yIo67DICkzScOFHyXWX2r3YWqeExYa1PPFaombNZ0aq\nazm3WLeQiBkZQnZbQewg5/dKCEsd/IwYmuQaGOoRkH2Uky+t+tYF7dLqcUClGqlqWwp3TfmUaO1W\nWbr041NFvKDfyL9gKPMldLin5yQagVlncyjCStvsCuQUgopDR4gNCuNsnEkJUf+l8aDJmOOuLeoH\nwCzTUIo6lD6ulQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4ICAQA3EDWT\nZsJot7AK9P9fhL476r6jqnziQehvZg3n/dgTG8/g8WFmCbv1p/vJKlHuLyvBOK5h8GXwcA2rd+NM\n3gRWb/xIUs/inOjEkUNDWyWII3QqedEd8tbaDNg6eN1dtsUlsDisq2PLDpfcD8Cmf2/044oKsM2r\n24jhlsgDvgLwX01LBY9N01kpy/+a04uwDoUQEJakmGtMqjshwS/FMfGlophgdoNyOcsUMnYhcWaW\nCawuo9Ak0CeS7ptoY3U/PJVT1I+pKE6sOzJeHqIVraKuqpRNO/4CTzcU0rIGHrjvaz9A9gWfjBOg\nYrPCNflwXvrIJWq35e8v3eS1yK6KyFXCoM5dAlvWcobnjTwkZktJt9He/hhhA88yDXwwEI85sL7b\nqqchaK1IGbbELZty2hB/nU2y13TZ2gJVrNZwHgc2LKjsNH7bE3EY4yHE8q2khId09NpSeQi+cucK\nZDC8oA6QgOBef0m/Ts/upiWDhTc6hQRiEfulM2V6gp62vPoArHfLO7p72SvCA+PKY09SxjK67TFZ\nD2cW1MbZo/TuWB5v2OI/etW1jqGR+HpSTGJ03IQxEeBxXKcvk2JjRlUi+/RqTHBZ/9YzdGr6yotx\npxNfZfCuTAc8mn466oCVAMKOjoI23MhK7WWdjTb99Ow3bsQ4JqYVT7C3z6paLwT6qoIdKw==\n");
killOpen("ai.perplexity.app.android");
}
private static Field findField(Class<?> cls, String str) throws NoSuchFieldException {
try {
Field declaredField = cls.getDeclaredField(str);
declaredField.setAccessible(true);
return declaredField;
} catch (NoSuchFieldException e) {
while (true) {
cls = cls.getSuperclass();
if (cls == null || cls.equals(Object.class)) {
break;
}
try {
Field declaredField2 = cls.getDeclaredField(str);
declaredField2.setAccessible(true);
return declaredField2;
} catch (NoSuchFieldException unused) {
}
}
throw e;
}
}
private static String getApkPath(String str) {
String str2;
try {
BufferedReader bufferedReader = new BufferedReader(new FileReader("/proc/self/maps"));
do {
try {
String readLine = bufferedReader.readLine();
if (readLine == null) {
bufferedReader.close();
return null;
}
str2 = readLine.split("\\s+")[r1.length - 1];
} finally {
}
} while (!isApkPath(str, str2));
bufferedReader.close();
return str2;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static File getDataFile(String str) {
String name = Environment.getExternalStorageDirectory().getName();
if (name.matches("\\d+")) {
File file = new File("/data/user/" + name + "/" + str);
if (file.canWrite()) {
return file;
}
}
return new File("/data/data/" + str);
}
private static native void hookApkPath(String str, String str2);
private static boolean isApkPath(String str, String str2) {
if (str2.startsWith("/") && str2.endsWith(".apk")) {
String[] split = str2.substring(1).split("/", 6);
int length = split.length;
if (length == 4 || length == 5) {
if (split[0].equals("data") && split[1].equals("app") && split[length - 1].equals("base.apk")) {
return split[length - 2].startsWith(str);
}
if (split[0].equals("mnt") && split[1].equals("asec") && split[length - 1].equals("pkg.apk")) {
return split[length - 2].startsWith(str);
}
} else if (length == 3) {
if (split[0].equals("data") && split[1].equals("app")) {
return split[2].startsWith(str);
}
} else if (length == 6 && split[0].equals("mnt") && split[1].equals("expand") && split[3].equals("app") && split[5].equals("base.apk")) {
return split[4].endsWith(str);
}
}
return false;
}
private static void killOpen(String str) {
try {
System.loadLibrary("SignatureKiller");
String apkPath = getApkPath(str);
if (apkPath == null) {
System.err.println("Get apk path failed");
return;
}
File file = new File(apkPath);
File file2 = new File(getDataFile(str), "origin.apk");
try {
ZipFile zipFile = new ZipFile(file);
try {
ZipEntry entry = zipFile.getEntry("assets/SignatureKiller/origin.apk");
if (entry == null) {
System.err.println("Entry not found: assets/SignatureKiller/origin.apk");
zipFile.close();
return;
}
if (!file2.exists() || file2.length() != entry.getSize()) {
InputStream inputStream = zipFile.getInputStream(entry);
try {
FileOutputStream fileOutputStream = new FileOutputStream(file2);
try {
byte[] bArr = new byte[102400];
while (true) {
int read = inputStream.read(bArr);
if (read == -1) {
break;
} else {
fileOutputStream.write(bArr, 0, read);
}
}
fileOutputStream.close();
if (inputStream != null) {
inputStream.close();
}
} finally {
}
} finally {
}
}
zipFile.close();
hookApkPath(file.getAbsolutePath(), file2.getAbsolutePath());
} finally {
}
} catch (IOException e) {
throw new RuntimeException(e);
}
} catch (Throwable unused) {
System.err.println("Load SignatureKiller library failed");
}
}
private static void killPM(final String str, String str2) {
final Signature signature = new Signature(Base64.decode(str2, 0));
final Parcelable.Creator creator = PackageInfo.CREATOR;
try {
findField(PackageInfo.class, "CREATOR").set(null, new Parcelable.Creator<PackageInfo>() {
@Override
public PackageInfo createFromParcel(Parcel parcel) {
Signature[] apkContentsSigners;
PackageInfo packageInfo = (PackageInfo) creator.createFromParcel(parcel);
if (packageInfo.packageName.equals(str)) {
if (packageInfo.signatures != null && packageInfo.signatures.length > 0) {
packageInfo.signatures[0] = signature;
}
if (Build.VERSION.SDK_INT >= 28 && packageInfo.signingInfo != null && (apkContentsSigners = packageInfo.signingInfo.getApkContentsSigners()) != null && apkContentsSigners.length > 0) {
apkContentsSigners[0] = signature;
}
}
return packageInfo;
}
@Override
public PackageInfo[] newArray(int i) {
return (PackageInfo[]) creator.newArray(i);
}
});
if (Build.VERSION.SDK_INT >= 28) {
HiddenApiBypass.addHiddenApiExemptions("Landroid/os/Parcel;", "Landroid/content/pm", "Landroid/app");
}
try {
Object obj = findField(PackageManager.class, "sPackageInfoCache").get(null);
obj.getClass().getMethod("clear", new Class[0]).invoke(obj, new Object[0]);
} catch (Throwable unused) {
}
try {
((Map) findField(Parcel.class, "mCreators").get(null)).clear();
} catch (Throwable unused2) {
}
try {
((Map) findField(Parcel.class, "sPairedCreators").get(null)).clear();
} catch (Throwable unused3) {
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}