Skip to content

Commit 79071c0

Browse files
committed
Iterate entire stack and check for classloader
1 parent 46af709 commit 79071c0

1 file changed

Lines changed: 24 additions & 14 deletions

File tree

app/src/main/java/io/github/lsposed/disableflagsecure/DisableFlagSecure.java

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -222,23 +222,28 @@ private void deoptimizeMethods(Class<?> clazz, String... names) {
222222

223223
private void hookWindowState(ClassLoader classLoader) throws ClassNotFoundException, NoSuchMethodException {
224224
var windowStateClazz = classLoader.loadClass("com.android.server.wm.WindowState");
225+
var systemServerCl = windowStateClazz.getClassLoader();
225226
var isSecureLockedMethod = windowStateClazz.getDeclaredMethod("isSecureLocked");
226227
hook(isSecureLockedMethod).intercept(chain -> {
227228
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
228-
var walker = StackWalker.getInstance();
229+
var walker = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE);
229230
var match = walker.walk(frames -> frames
230-
.map(StackWalker.StackFrame::getMethodName)
231-
.limit(10)
232-
.skip(6)
233-
.anyMatch(s -> s.equals("setInitialSurfaceControlProperties") || s.equals("createSurfaceLocked")));
231+
.anyMatch(frame -> frame.getDeclaringClass() != null &&
232+
frame.getDeclaringClass().getClassLoader() == systemServerCl &&
233+
(frame.getMethodName().equals("setInitialSurfaceControlProperties") ||
234+
frame.getMethodName().equals("createSurfaceLocked"))));
234235
if (match) return chain.proceed();
235236
} else {
236237
var stackTrace = new Throwable().getStackTrace();
237-
for (int i = 8; i < stackTrace.length && i < 12; i++) {
238-
var name = stackTrace[i].getMethodName();
239-
if (name.equals("setInitialSurfaceControlProperties") ||
240-
name.equals("createSurfaceLocked")) {
241-
return chain.proceed();
238+
for (var frame : stackTrace) {
239+
var name = frame.getMethodName();
240+
try {
241+
if ((name.equals("setInitialSurfaceControlProperties") ||
242+
name.equals("createSurfaceLocked")) &&
243+
classLoader.loadClass(frame.getClassName()).getClassLoader() == systemServerCl) {
244+
return chain.proceed();
245+
}
246+
} catch (ClassNotFoundException ignored) {
242247
}
243248
}
244249
}
@@ -284,17 +289,22 @@ private void hookDisplayControl(ClassLoader classLoader) throws ClassNotFoundExc
284289
var displayControlClazz = Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE ?
285290
classLoader.loadClass("com.android.server.display.DisplayControl") :
286291
SurfaceControl.class;
292+
var systemServerCl = displayControlClazz.getClassLoader();
287293
var method = displayControlClazz.getDeclaredMethod(
288294
Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM ?
289295
"createVirtualDisplay" :
290296
"createDisplay", String.class, boolean.class);
291297
hook(method).intercept(chain -> {
292298
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
293299
var stackTrace = new Throwable().getStackTrace();
294-
for (int i = 8; i < stackTrace.length && i < 12; i++) {
295-
var name = stackTrace[i].getMethodName();
296-
if (name.equals("createVirtualDisplayLocked")) {
297-
return chain.proceed();
300+
for (var frame : stackTrace) {
301+
var name = frame.getMethodName();
302+
try {
303+
if (name.equals("createVirtualDisplayLocked") &&
304+
classLoader.loadClass(frame.getClassName()).getClassLoader() == systemServerCl) {
305+
return chain.proceed();
306+
}
307+
} catch (ClassNotFoundException ignored) {
298308
}
299309
}
300310
}

0 commit comments

Comments
 (0)