Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Snapchat Detection #281

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
[![Build status](https://ci.appveyor.com/api/projects/status/qu3vj1d64nqia1b8/branch/master?svg=true)](https://ci.appveyor.com/project/ElderDrivers/edxposed/branch/master)

# EdXposed

A Riru module trying to provide a ART hooking framework (initially for Android Pie) which delivers consistent APIs with the OG Xposed, leveraging YAHFA (or SandHook) hooking framework.
Expand Down
42 changes: 42 additions & 0 deletions appveyor.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
version: '0.4.4.6_alpha({build})'

environment:
ANDROID_HOME: C:\android-sdk-windows

install:
- appveyor DownloadFile https://dl.google.com/android/repository/sdk-tools-windows-4333796.zip
- 7z x sdk-tools-windows-4333796.zip -oC:\android-sdk-windows > nul
- yes | C:\android-sdk-windows\tools\bin\sdkmanager.bat --licenses > nul
- C:\android-sdk-windows\tools\bin\sdkmanager.bat "platforms;android-28" > nul
- C:\android-sdk-windows\tools\bin\sdkmanager.bat "platform-tools" > nul
- C:\android-sdk-windows\tools\bin\sdkmanager.bat "build-tools;28.0.3" > nul
- C:\android-sdk-windows\tools\bin\sdkmanager.bat "cmake;3.6.4111459" > nul
- C:\android-sdk-windows\tools\bin\sdkmanager.bat "patcher;v4" > nul
- C:\android-sdk-windows\tools\bin\sdkmanager.bat "ndk-bundle" > nul
- set PATH=%PATH%;C:\android-sdk-windows\ndk-bundle;C:\android-sdk-windows\build-tools\28.0.3

build_script:
- gradlew.bat :edxp-core:zipYahfaRelease
- gradlew.bat :edxp-core:zipSandhookRelease

artifacts:
- path: 'edxp-core\release\**\*.zip'

pull_requests:
do_not_increment_build_number: true

only_commits:
files:
- dalvikdx/
- dexmaker/
- edxp-common/
- edxp-core/
- edxp-sandhook/
- edxp-whale/
- edxp-yahfa/
- hiddenapi-stubs/
- xposed-bridge/
- build.gradle
- settings.gradle
- gradle.properties
- appveyor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
import static com.elderdrivers.riru.edxp.config.InstallerChooser.INSTALLER_PACKAGE_NAME;
import static com.elderdrivers.riru.edxp.hooker.SliceProviderFix.SYSTEMUI_PACKAGE_NAME;
import static com.elderdrivers.riru.edxp.hooker.XposedBlackListHooker.BLACK_LIST_PACKAGE_NAME;
import static com.elderdrivers.riru.edxp.util.ClassLoaderUtils.replaceParentClassLoader;

// normal process initialization (for new Activity, Service, BroadcastReceiver etc.)
public class HandleBindApp extends XC_MethodHook {
Expand Down Expand Up @@ -62,8 +61,6 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
XposedInit.loadedPackagesInProcess.add(reportedPackageName);
LoadedApk loadedApk = activityThread.getPackageInfoNoCheck(appInfo, compatInfo);

replaceParentClassLoader(loadedApk.getClassLoader());

XC_LoadPackage.LoadPackageParam lpparam = new XC_LoadPackage.LoadPackageParam(XposedBridge.sLoadedPackageCallbacks);
lpparam.packageName = reportedPackageName;
lpparam.processName = (String) XposedHelpers.getObjectField(bindData, "processName");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@
import de.robv.android.xposed.XposedInit;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

import static com.elderdrivers.riru.edxp.util.ClassLoaderUtils.replaceParentClassLoader;

// when a package is loaded for an existing process, trigger the callbacks as well
// ed: remove resources related hooking
public class LoadedApkCstr extends XC_MethodHook {
Expand Down Expand Up @@ -60,8 +58,6 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
return;
}

replaceParentClassLoader(loadedApk.getClassLoader());

XC_LoadPackage.LoadPackageParam lpparam = new XC_LoadPackage.LoadPackageParam(XposedBridge.sLoadedPackageCallbacks);
lpparam.packageName = packageName;
lpparam.processName = AndroidAppHelper.currentProcessName();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
import de.robv.android.xposed.XposedInit;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

import static com.elderdrivers.riru.edxp.util.ClassLoaderUtils.replaceParentClassLoader;
import static com.elderdrivers.riru.edxp.util.Utils.logD;
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;

Expand All @@ -28,8 +27,6 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
try {
XposedInit.loadedPackagesInProcess.add("android");

replaceParentClassLoader(SystemMain.systemServerCL);

XC_LoadPackage.LoadPackageParam lpparam = new XC_LoadPackage.LoadPackageParam(XposedBridge.sLoadedPackageCallbacks);
lpparam.packageName = "android";
lpparam.processName = "android"; // it's actually system_server, but other functions return this as well
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@

import java.lang.reflect.Member;

import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.PendingHooks;

public class ClassLinker implements KeepAll {

public static native void setEntryPointsToInterpreter(Member method);

public static void onPostFixupStaticTrampolines(Class clazz) {
XposedBridge.hookPendingMethod(clazz);
PendingHooks.hookPendingMethod(clazz);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.elderdrivers.riru.edxp.config;

import com.elderdrivers.riru.edxp.hooker.XposedBlackListHooker;

public class BaseEdxpConfig implements EdxpConfig {

@Override
public String getInstallerBaseDir() {
return InstallerChooser.INSTALLER_DATA_BASE_DIR;
}

@Override
public String getBlackListModulePackageName() {
return XposedBlackListHooker.BLACK_LIST_PACKAGE_NAME;
}

@Override
public boolean isDynamicModulesMode() {
return ConfigManager.isDynamicModulesEnabled();
}

@Override
public boolean isResourcesHookEnabled() {
return ConfigManager.isResourcesHookEnabled();
}

@Override
public boolean isBlackWhiteListMode() {
return ConfigManager.isBlackWhiteListEnabled();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@
import android.os.Process;

import com.elderdrivers.riru.common.KeepAll;
import com.elderdrivers.riru.edxp.BuildConfig;
import com.elderdrivers.riru.edxp.common.BuildConfig;
import com.elderdrivers.riru.edxp.config.ConfigManager;
import com.elderdrivers.riru.edxp.framework.ProcessHelper;
import com.elderdrivers.riru.edxp.util.Utils;

import java.security.AccessController;
Expand All @@ -18,6 +19,7 @@
@SuppressLint("DefaultLocale")
public class Main implements KeepAll {

private static final boolean logEnabled = BuildConfig.DEBUG;
private static String forkAndSpecializePramsStr = "";
private static String forkSystemServerPramsStr = "";

Expand All @@ -36,11 +38,14 @@ public static void forkAndSpecializePre(int uid, int gid, int[] gids, int debugF
String niceName, int[] fdsToClose, int[] fdsToIgnore,
boolean startChildZygote, String instructionSet,
String appDataDir) {
if (isBlackListedProcess(uid)) {
return;
}
final EdxpImpl edxp = getEdxpImpl();
if (edxp == null || !edxp.isInitialized()) {
return;
}
if (BuildConfig.DEBUG) {
if (logEnabled) {
forkAndSpecializePramsStr = String.format(
"Zygote#forkAndSpecialize(%d, %d, %s, %d, %s, %d, %s, %s, %s, %s, %s, %s, %s)",
uid, gid, Arrays.toString(gids), debugFlags, Arrays.toString(rlimits),
Expand All @@ -60,12 +65,17 @@ public static void forkAndSpecializePre(int uid, int gid, int[] gids, int debugF
}

public static void forkAndSpecializePost(int pid, String appDataDir, String niceName) {
if (isBlackListedProcess(Process.myUid())) {
return;
}
final EdxpImpl edxp = getEdxpImpl();
if (edxp == null || !edxp.isInitialized()) {
return;
}
if (pid == 0) {
Utils.logD(forkAndSpecializePramsStr + " = " + Process.myPid());
if (logEnabled) {
Utils.logI(forkAndSpecializePramsStr + " = " + Process.myPid());
}
if (ConfigManager.isBlackWhiteListEnabled()) {
edxp.getBlackWhiteListProxy().forkAndSpecializePost(pid, appDataDir, niceName);
} else {
Expand All @@ -83,7 +93,7 @@ public static void forkSystemServerPre(int uid, int gid, int[] gids, int debugFl
if (edxp == null || !edxp.isInitialized()) {
return;
}
if (BuildConfig.DEBUG) {
if (logEnabled) {
forkSystemServerPramsStr = String.format("Zygote#forkSystemServer(%d, %d, %s, %d, %s, %d, %d)",
uid, gid, Arrays.toString(gids), debugFlags, Arrays.toString(rlimits),
permittedCapabilities, effectiveCapabilities);
Expand All @@ -103,7 +113,9 @@ public static void forkSystemServerPost(int pid) {
return;
}
if (pid == 0) {
Utils.logD(forkSystemServerPramsStr + " = " + Process.myPid());
if (logEnabled) {
Utils.logI(forkSystemServerPramsStr + " = " + Process.myPid());
}
if (ConfigManager.isBlackWhiteListEnabled()) {
edxp.getBlackWhiteListProxy().forkSystemServerPost(pid);
} else {
Expand All @@ -123,6 +135,11 @@ public static synchronized EdxpImpl getEdxpImpl() {
return edxpImplRef.get();
}

@EdxpImpl.Variant
public static synchronized int getEdxpVariant() {
return getEdxpImpl().getVariant();
}

private static void loadEdxpImpls() {
AccessController.doPrivileged(new PrivilegedAction<Void>() {
public Void run() {
Expand All @@ -133,11 +150,16 @@ public Void run() {
iterator.next();
}
} catch (Throwable t) {
// Do nothing
Utils.logE("error when loadEdxpImpls", t);
}
return null;
}
});
}

private static boolean isBlackListedProcess(int uid) {
return ProcessHelper.isIsolated(uid)
|| ProcessHelper.isRELROUpdater(uid)
|| ProcessHelper.isWebViewZygote(uid);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.elderdrivers.riru.edxp.framework;

import de.robv.android.xposed.XposedHelpers;

public class ProcessHelper {

static {
// WEBVIEW_ZYGOTE_UID differ among versions
WEBVIEW_ZYGOTE_UID = XposedHelpers.getStaticIntField(android.os.Process.class, "WEBVIEW_ZYGOTE_UID");
}

/**
* Defines the UID/GID for the shared RELRO file updater process.
*/
public static final int SHARED_RELRO_UID = 1037;

/**
* Defines the UID/GID for the WebView zygote process.
*/
public static final int WEBVIEW_ZYGOTE_UID;

/**
* First uid used for fully isolated sandboxed processes (with no permissions of their own)
*/
public static final int FIRST_ISOLATED_UID = 99000;
/**
* Last uid used for fully isolated sandboxed processes (with no permissions of their own)
*/
public static final int LAST_ISOLATED_UID = 99999;

/**
* Range of uids allocated for a user.
*/
public static final int PER_USER_RANGE = 100000;

public static int getAppId(int uid) {
return uid % PER_USER_RANGE;
}

public static boolean isRELROUpdater(int uid) {
return getAppId(uid) == SHARED_RELRO_UID;
}

public static boolean isWebViewZygote(int uid) {
return getAppId(uid) == WEBVIEW_ZYGOTE_UID;
}

public static boolean isIsolated(int uid) {
uid = getAppId(uid);
return uid >= FIRST_ISOLATED_UID && uid <= LAST_ISOLATED_UID;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package com.elderdrivers.riru.edxp.framework;

import com.elderdrivers.riru.edxp.util.Utils;

import de.robv.android.xposed.XposedHelpers;

public class Zygote {

// prevent from fatal error caused by holding not whitelisted file descriptors when forking zygote
Expand All @@ -8,4 +12,12 @@ public class Zygote {

public static native void reopenFilesAfterFork();

public static void allowFileAcrossFork(String path) {
try {
Class zygote = XposedHelpers.findClass("com.android.internal.os.Zygote", null);
XposedHelpers.callStaticMethod(zygote, "nativeAllowFileAcrossFork", path);
} catch (Throwable throwable) {
Utils.logE("error when allowFileAcrossFork", throwable);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@

import com.elderdrivers.riru.edxp._hooker.impl.HandleBindApp;
import com.elderdrivers.riru.edxp._hooker.impl.LoadedApkCstr;
import com.elderdrivers.riru.edxp._hooker.impl.OneplusWorkaround;
import com.elderdrivers.riru.edxp._hooker.impl.StartBootstrapServices;
import com.elderdrivers.riru.edxp._hooker.impl.SystemMain;
import com.elderdrivers.riru.edxp._hooker.yahfa.HandleBindAppHooker;
import com.elderdrivers.riru.edxp._hooker.yahfa.LoadedApkConstructorHooker;
import com.elderdrivers.riru.edxp._hooker.yahfa.OnePlusWorkAroundHooker;
import com.elderdrivers.riru.edxp._hooker.yahfa.StartBootstrapServicesHooker;
import com.elderdrivers.riru.edxp._hooker.yahfa.SystemMainHooker;
import com.elderdrivers.riru.edxp.core.yahfa.HookMain;
Expand Down Expand Up @@ -138,15 +140,18 @@ public void startSystemServerHook() {

public void startWorkAroundHook() {
ClassLoader classLoader = BaseRouter.class.getClassLoader();
// if (useXposedApi) {
// XposedHelpers.findAndHookMethod(OnePlusWorkAroundHooker.className,
// classLoader, OnePlusWorkAroundHooker.methodName,
// int.class, String.class, new OneplusWorkaround());
// } else {
HookMain.doHookDefault(
BaseRouter.class.getClassLoader(),
classLoader,
WorkAroundHookInfo.class.getName());
// }
if (useXposedApi) {
try {
XposedHelpers.findAndHookMethod(OnePlusWorkAroundHooker.className,
classLoader, OnePlusWorkAroundHooker.methodName,
int.class, String.class, new OneplusWorkaround());
} catch (Throwable throwable) {
}
} else {
HookMain.doHookDefault(
BaseRouter.class.getClassLoader(),
classLoader,
WorkAroundHookInfo.class.getName());
}
}
}
Loading