From 862716fb7f0a1fe9e6a5395004223a921d94f984 Mon Sep 17 00:00:00 2001 From: Jake Valletta Date: Wed, 4 Nov 2015 20:10:40 -0500 Subject: [PATCH] Fixed issue trying to hook TrustManagerImpl on older APIs Older APIs do not have the TrustManagerImpl class, so this checks if that class is available before attempting to hook. --- app/src/main/java/just/trust/me/Main.java | 36 ++++++++++++++++------ bin/JustTrustMe.apk | Bin 10081 -> 10192 bytes 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/just/trust/me/Main.java b/app/src/main/java/just/trust/me/Main.java index f135240..41824c9 100644 --- a/app/src/main/java/just/trust/me/Main.java +++ b/app/src/main/java/just/trust/me/Main.java @@ -204,18 +204,36 @@ public class Main implements IXposedHookLoadPackage { } }); - /* external/conscrypt/src/platform/java/org/conscrypt/TrustManagerImpl.java#217 */ - /* public List checkServerTrusted(X509Certificate[] chain, String authType, String host) throws CertificateException */ - findAndHookMethod("com.android.org.conscrypt.TrustManagerImpl", lpparam.classLoader, "checkServerTrusted", X509Certificate[].class, String.class, String.class, new XC_MethodReplacement() { - @Override - protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { - ArrayList list = new ArrayList(); - return list; - } - }); + /* Only for newer devices should we try to hook TrustManagerImpl */ + if (hasTrustManagerImpl()) { + + /* external/conscrypt/src/platform/java/org/conscrypt/TrustManagerImpl.java#217 */ + /* public List checkServerTrusted(X509Certificate[] chain, + String authType, String host) throws CertificateException */ + findAndHookMethod("com.android.org.conscrypt.TrustManagerImpl", lpparam.classLoader, + "checkServerTrusted", X509Certificate[].class, String.class, + String.class, new XC_MethodReplacement() { + @Override + protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { + ArrayList list = new ArrayList(); + return list; + } + }); + } } // End Hooks /* Helpers */ + // Check for TrustManagerImpl class + public boolean hasTrustManagerImpl() { + + try { + Class.forName("com.android.org.conscrypt.TrustManagerImpl"); + } catch(ClassNotFoundException e) { + return false; + } + return true; + } + //Create a SingleClientConnManager that trusts everyone! public ClientConnectionManager getSCCM() { diff --git a/bin/JustTrustMe.apk b/bin/JustTrustMe.apk index 622ede67f21f0bcd2fe38a6bec7975c33ea0d09d..dd2f7d80d2c3feebbafac0255d949d7e57bc7658 100644 GIT binary patch delta 7073 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