Skip to content

Commit

Permalink
refactor SDK version check
Browse files Browse the repository at this point in the history
  • Loading branch information
Palatis committed May 26, 2023
1 parent c6490e3 commit 3173437
Showing 1 changed file with 134 additions and 111 deletions.
245 changes: 134 additions & 111 deletions app/src/main/java/tw/idv/palatis/xappdebug/xposed/HookMain.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.os.Build;
import android.os.Process;
import android.os.StrictMode;
import android.os.UserHandle;

Expand All @@ -32,140 +33,162 @@ public class HookMain implements IXposedHookLoadPackage {
// https://android.googlesource.com/platform/frameworks/base.git/+/master/core/java/com/android/internal/os/Zygote.java
private static final int DEBUG_ENABLE_JDWP = 1;


public static final boolean IS_TIRAMISU_OR_LATER = android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU;

private static final String PM_CLASS = "com.android.server.pm." +
(IS_TIRAMISU_OR_LATER ? "ComputerEngine" : "PackageManagerService");

@Override
public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if (!"android".equals(lpparam.packageName))
return;

if (IS_TIRAMISU_OR_LATER) {
findAndHookMethod(
PM_CLASS,
lpparam.classLoader,
"getPackageInfo",
String.class, long.class, int.class, /* packageName, flags, userId */
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
try {
if (((PackageInfo) param.getResult()).applicationInfo != null)
checkAndMakeDebuggable(((PackageInfo) param.getResult()).applicationInfo, ((PackageInfo) param.getResult()).packageName, (int) param.args[2]);
} catch (Exception e) {
XposedBridge.log(LOG_TAG + ": " + getStackTraceString(e));
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
_hookPostTiramisu(lpparam);
} else {
_hookPreTiramisu(lpparam);
}
}

private void _hookPostTiramisu(final XC_LoadPackage.LoadPackageParam lpparam) {
final String PM_CLASS = "com.android.server.pm.ComputerEngine";

findAndHookMethod(
PM_CLASS,
lpparam.classLoader,
"getPackageInfo",
String.class, long.class, int.class, /* packageName, flags, userId */
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
try {
if (((PackageInfo) param.getResult()).applicationInfo != null)
checkAndMakeDebuggable(((PackageInfo) param.getResult()).applicationInfo, ((PackageInfo) param.getResult()).packageName, (int) param.args[2]);
} catch (Exception e) {
XposedBridge.log(LOG_TAG + ": " + getStackTraceString(e));
}
}
);

findAndHookMethod(
PM_CLASS,
lpparam.classLoader,
"getApplicationInfo",
String.class, long.class, int.class, /* packageName, flags, userId */
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
try {
ApplicationInfo appInfo = (ApplicationInfo) param.getResult();
if (appInfo != null)
checkAndMakeDebuggable(appInfo, ((ApplicationInfo) param.getResult()).packageName, (int) param.args[2]);
} catch (Exception e) {
XposedBridge.log(LOG_TAG + ": " + getStackTraceString(e));
}
}
);

findAndHookMethod(
PM_CLASS,
lpparam.classLoader,
"getApplicationInfo",
String.class, long.class, int.class, /* packageName, flags, userId */
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
try {
ApplicationInfo appInfo = (ApplicationInfo) param.getResult();
if (appInfo != null)
checkAndMakeDebuggable(appInfo, ((ApplicationInfo) param.getResult()).packageName, (int) param.args[2]);
} catch (Exception e) {
XposedBridge.log(LOG_TAG + ": " + getStackTraceString(e));
}
}
);

findAndHookMethod(
PM_CLASS,
lpparam.classLoader,
"getInstalledApplications",
long.class, int.class, int.class, /* flags, userId, callingUid */
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
try {
List<ApplicationInfo> infos = (List<ApplicationInfo>) param.getResult();
if (infos != null) {
for (ApplicationInfo info : infos) {
checkAndMakeDebuggable(info, info.packageName, (int) param.args[1]);
}
}
);

findAndHookMethod(
PM_CLASS,
lpparam.classLoader,
"getInstalledApplications",
long.class, int.class, int.class, /* flags, userId, callingUid */
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
try {
List<ApplicationInfo> infos = (List<ApplicationInfo>) param.getResult();
if (infos != null) {
for (ApplicationInfo info : infos) {
checkAndMakeDebuggable(info, info.packageName, (int) param.args[1]);
}
} catch (Exception e) {
XposedBridge.log(LOG_TAG + ": " + getStackTraceString(e));
}
} catch (Exception e) {
XposedBridge.log(LOG_TAG + ": " + getStackTraceString(e));
}
}
);
}else{
findAndHookMethod(
PM_CLASS,
lpparam.classLoader,
"getPackageInfo",
String.class, int.class, int.class, /* packageName, flags, userId */
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
try {
if (((PackageInfo) param.getResult()).applicationInfo != null)
checkAndMakeDebuggable(((PackageInfo) param.getResult()).applicationInfo, ((PackageInfo) param.getResult()).packageName, (int) param.args[2]);
} catch (Exception e) {
XposedBridge.log(LOG_TAG + ": " + getStackTraceString(e));
}
}
);

hookAllMethods(
Process.class,
"start",
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
final String niceName = (String) param.args[1];
final int uid = (int) param.args[2];
final int runtimeFlags = (int) param.args[5];

final int user = UserHandle.getUserHandleForUid(uid).hashCode();
if (isDebuggable(niceName, user))
param.args[5] = runtimeFlags | DEBUG_ENABLE_JDWP;
}
}
);
}

private void _hookPreTiramisu(final XC_LoadPackage.LoadPackageParam lpparam) {
final String PM_CLASS = "com.android.server.pm.PackageManagerService";

findAndHookMethod(
PM_CLASS,
lpparam.classLoader,
"getPackageInfo",
String.class, int.class, int.class, /* packageName, flags, userId */
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
try {
if (((PackageInfo) param.getResult()).applicationInfo != null)
checkAndMakeDebuggable(((PackageInfo) param.getResult()).applicationInfo, ((PackageInfo) param.getResult()).packageName, (int) param.args[2]);
} catch (Exception e) {
XposedBridge.log(LOG_TAG + ": " + getStackTraceString(e));
}
}
);

findAndHookMethod(
PM_CLASS,
lpparam.classLoader,
"getApplicationInfo",
String.class, int.class, int.class, /* packageName, flags, userId */
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
try {
ApplicationInfo appInfo = (ApplicationInfo) param.getResult();
if (appInfo != null)
checkAndMakeDebuggable(appInfo, ((ApplicationInfo) param.getResult()).packageName, (int) param.args[2]);
} catch (Exception e) {
XposedBridge.log(LOG_TAG + ": " + getStackTraceString(e));
}
}
);

findAndHookMethod(
PM_CLASS,
lpparam.classLoader,
"getApplicationInfo",
String.class, int.class, int.class, /* packageName, flags, userId */
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
try {
ApplicationInfo appInfo = (ApplicationInfo) param.getResult();
if (appInfo != null)
checkAndMakeDebuggable(appInfo, ((ApplicationInfo) param.getResult()).packageName, (int) param.args[2]);
} catch (Exception e) {
XposedBridge.log(LOG_TAG + ": " + getStackTraceString(e));
}
}
);

findAndHookMethod(
PM_CLASS,
lpparam.classLoader,
"getInstalledApplicationsListInternal",
int.class, int.class, int.class, /* flags, userId, callingUid */
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
try {
List<ApplicationInfo> infos = (List<ApplicationInfo>) param.getResult();
if (infos != null) {
for (ApplicationInfo info : infos) {
checkAndMakeDebuggable(info, info.packageName, (int) param.args[1]);
}
}
);

findAndHookMethod(
PM_CLASS,
lpparam.classLoader,
"getInstalledApplicationsListInternal",
int.class, int.class, int.class, /* flags, userId, callingUid */
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
try {
List<ApplicationInfo> infos = (List<ApplicationInfo>) param.getResult();
if (infos != null) {
for (ApplicationInfo info : infos) {
checkAndMakeDebuggable(info, info.packageName, (int) param.args[1]);
}
} catch (Exception e) {
XposedBridge.log(LOG_TAG + ": " + getStackTraceString(e));
}
} catch (Exception e) {
XposedBridge.log(LOG_TAG + ": " + getStackTraceString(e));
}
}
);
}

}
);

hookAllMethods(
android.os.Process.class,
Process.class,
"start",
new XC_MethodHook() {
@Override
Expand Down

0 comments on commit 3173437

Please sign in to comment.