This commit is contained in:
LoveSy 2021-10-29 18:41:08 +08:00 committed by GitHub
parent 330747aca1
commit 5f14670bd9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 32 additions and 25 deletions

View File

@ -46,30 +46,34 @@ public class ParasiticManagerHooker {
private synchronized static PackageInfo getManagerPkgInfo(ApplicationInfo appInfo) { private synchronized static PackageInfo getManagerPkgInfo(ApplicationInfo appInfo) {
if (managerPkgInfo == null) { if (managerPkgInfo == null) {
Context ctx = ActivityThread.currentActivityThread().getSystemContext(); try {
var sourceDir = "/proc/self/fd/" + managerFd; Context ctx = ActivityThread.currentActivityThread().getSystemContext();
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) { var sourceDir = "/proc/self/fd/" + managerFd;
var dstDir = appInfo.dataDir + "/cache/lsposed.apk"; if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {
try (var inStream = new FileInputStream(sourceDir); var outStream = new FileOutputStream(dstDir)) { var dstDir = appInfo.dataDir + "/cache/lsposed.apk";
FileChannel inChannel = inStream.getChannel(); try (var inStream = new FileInputStream(sourceDir); var outStream = new FileOutputStream(dstDir)) {
FileChannel outChannel = outStream.getChannel(); FileChannel inChannel = inStream.getChannel();
inChannel.transferTo(0, inChannel.size(), outChannel); FileChannel outChannel = outStream.getChannel();
sourceDir = dstDir; inChannel.transferTo(0, inChannel.size(), outChannel);
} catch (Throwable e) { sourceDir = dstDir;
Hookers.logE("copy apk", e); } catch (Throwable e) {
Hookers.logE("copy apk", e);
}
} }
managerPkgInfo = ctx.getPackageManager().getPackageArchiveInfo(sourceDir, PackageManager.GET_ACTIVITIES);
var newAppInfo = managerPkgInfo.applicationInfo;
newAppInfo.sourceDir = sourceDir;
newAppInfo.publicSourceDir = sourceDir;
newAppInfo.nativeLibraryDir = appInfo.nativeLibraryDir;
newAppInfo.packageName = appInfo.packageName;
newAppInfo.dataDir = HiddenApiBridge.ApplicationInfo_credentialProtectedDataDir(appInfo);
newAppInfo.deviceProtectedDataDir = appInfo.deviceProtectedDataDir;
newAppInfo.processName = appInfo.processName;
HiddenApiBridge.ApplicationInfo_credentialProtectedDataDir(newAppInfo, HiddenApiBridge.ApplicationInfo_credentialProtectedDataDir(appInfo));
newAppInfo.uid = appInfo.uid;
} catch (Throwable e) {
Utils.logE("get manager pkginfo", e);
} }
managerPkgInfo = ctx.getPackageManager().getPackageArchiveInfo(sourceDir, PackageManager.GET_ACTIVITIES);
var newAppInfo = managerPkgInfo.applicationInfo;
newAppInfo.sourceDir = sourceDir;
newAppInfo.publicSourceDir = sourceDir;
newAppInfo.nativeLibraryDir = appInfo.nativeLibraryDir;
newAppInfo.packageName = appInfo.packageName;
newAppInfo.dataDir = HiddenApiBridge.ApplicationInfo_credentialProtectedDataDir(appInfo);
newAppInfo.deviceProtectedDataDir = appInfo.deviceProtectedDataDir;
newAppInfo.processName = appInfo.processName;
HiddenApiBridge.ApplicationInfo_credentialProtectedDataDir(newAppInfo, HiddenApiBridge.ApplicationInfo_credentialProtectedDataDir(appInfo));
newAppInfo.uid = appInfo.uid;
} }
return managerPkgInfo; return managerPkgInfo;
} }
@ -94,7 +98,8 @@ public class ParasiticManagerHooker {
LoadedApk.class, "getClassLoader", new XC_MethodHook() { LoadedApk.class, "getClassLoader", new XC_MethodHook() {
@Override @Override
protected void afterHookedMethod(MethodHookParam param) { protected void afterHookedMethod(MethodHookParam param) {
if (XposedHelpers.getObjectField(param.thisObject, "mApplicationInfo") == getManagerPkgInfo(null).applicationInfo) { var pkgInfo = getManagerPkgInfo(null);
if (pkgInfo != null && XposedHelpers.getObjectField(param.thisObject, "mApplicationInfo") == pkgInfo.applicationInfo) {
InstallerVerifier.sendBinderToManager((ClassLoader) param.getResult(), managerService.asBinder()); InstallerVerifier.sendBinderToManager((ClassLoader) param.getResult(), managerService.asBinder());
unhooks[0].unhook(); unhooks[0].unhook();
} }
@ -107,6 +112,7 @@ public class ParasiticManagerHooker {
for (var i = 0; i < param.args.length; ++i) { for (var i = 0; i < param.args.length; ++i) {
if (param.args[i] instanceof ActivityInfo) { if (param.args[i] instanceof ActivityInfo) {
var pkgInfo = getManagerPkgInfo(((ActivityInfo) param.args[i]).applicationInfo); var pkgInfo = getManagerPkgInfo(((ActivityInfo) param.args[i]).applicationInfo);
if (pkgInfo == null) return;
for (var activity : pkgInfo.activities) { for (var activity : pkgInfo.activities) {
if ("org.lsposed.manager.ui.activity.MainActivity".equals(activity.name)) { if ("org.lsposed.manager.ui.activity.MainActivity".equals(activity.name)) {
activity.applicationInfo = pkgInfo.applicationInfo; activity.applicationInfo = pkgInfo.applicationInfo;
@ -157,8 +163,9 @@ public class ParasiticManagerHooker {
ctxIdx = i; ctxIdx = i;
} else if (arg instanceof ProviderInfo) info = (ProviderInfo) arg; } else if (arg instanceof ProviderInfo) info = (ProviderInfo) arg;
} }
if (ctx != null && info != null) { var pkgInfo = getManagerPkgInfo(null);
var packageName = getManagerPkgInfo(null).applicationInfo.packageName; if (ctx != null && info != null && pkgInfo != null) {
var packageName = pkgInfo.applicationInfo.packageName;
if (!info.applicationInfo.packageName.equals(packageName)) return; if (!info.applicationInfo.packageName.equals(packageName)) return;
if (originalContext == null) { if (originalContext == null) {
info.applicationInfo.packageName = packageName + ".origin"; info.applicationInfo.packageName = packageName + ".origin";