├── app ├── .gitignore ├── src │ └── main │ │ ├── assets │ │ └── xposed_init │ │ ├── java │ │ └── mfsx │ │ │ └── xposed │ │ │ └── trustmealready │ │ │ ├── DummyHostnameVerifier.java │ │ │ ├── DummyTrustManager.java │ │ │ ├── DummySSLSocketFactory.java │ │ │ └── Main.java │ │ └── AndroidManifest.xml └── build.gradle.kts ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── README.md ├── settings.gradle.kts ├── .gitignore ├── LICENSE ├── gradle.properties ├── gradlew.bat └── gradlew /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/src/main/assets/xposed_init: -------------------------------------------------------------------------------- 1 | mfsx.xposed.trustmealready.Main -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobile46/TrustMeAlready/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TrustMeAlready ![GitHub](https://img.shields.io/github/license/mobile46/TrustMeAlready) ![GitHub All Releases](https://img.shields.io/github/downloads/mobile46/TrustMeAlready/total) 2 | A Xposed Module to bypass SSL pinning. 3 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /app/src/main/java/mfsx/xposed/trustmealready/DummyHostnameVerifier.java: -------------------------------------------------------------------------------- 1 | package mfsx.xposed.trustmealready; 2 | 3 | import javax.net.ssl.HostnameVerifier; 4 | import javax.net.ssl.SSLSession; 5 | 6 | public class DummyHostnameVerifier implements HostnameVerifier { 7 | @Override 8 | public boolean verify(String hostname, SSLSession session) { 9 | return true; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | google() 4 | mavenCentral() 5 | gradlePluginPortal() 6 | } 7 | } 8 | dependencyResolutionManagement { 9 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 10 | repositories { 11 | google() 12 | mavenCentral() 13 | maven(url = "https://jcenter.bintray.com") 14 | } 15 | } 16 | 17 | include(":app") 18 | -------------------------------------------------------------------------------- /app/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.android.application") 3 | } 4 | 5 | android { 6 | namespace = "mfsx.xposed.trustmealready" 7 | compileSdk = 34 8 | 9 | defaultConfig { 10 | applicationId = "mfsx.xposed.trustmealready" 11 | minSdk = 15 12 | targetSdk = 34 13 | versionCode = 1 14 | versionName = "1.0" 15 | } 16 | 17 | compileOptions { 18 | sourceCompatibility = JavaVersion.VERSION_1_8 19 | targetCompatibility = JavaVersion.VERSION_1_8 20 | } 21 | } 22 | 23 | dependencies { 24 | compileOnly("de.robv.android.xposed:api:82") 25 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Gradle files 2 | .gradle/ 3 | build/ 4 | **/release/output-metadata.json 5 | **/debug/output-metadata.json 6 | 7 | # Local configuration file (sdk path, etc) 8 | local.properties 9 | 10 | # Log/OS Files 11 | *.log 12 | 13 | # Android Studio generated files and folders 14 | captures/ 15 | .externalNativeBuild/ 16 | .cxx/ 17 | *.apk 18 | output.json 19 | 20 | # IntelliJ 21 | *.iml 22 | .idea/ 23 | misc.xml 24 | deploymentTargetDropDown.xml 25 | render.experimental.xml 26 | 27 | # Keystore files 28 | *.jks 29 | *.keystore 30 | 31 | # Google Services (e.g. APIs or Firebase) 32 | google-services.json 33 | 34 | # Android Profiling 35 | *.hprof -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 10 | 13 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Mobile46 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /app/src/main/java/mfsx/xposed/trustmealready/DummyTrustManager.java: -------------------------------------------------------------------------------- 1 | package mfsx.xposed.trustmealready; 2 | 3 | import java.security.cert.X509Certificate; 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | 7 | import javax.net.ssl.TrustManager; 8 | import javax.net.ssl.X509TrustManager; 9 | 10 | public class DummyTrustManager implements X509TrustManager { 11 | private static TrustManager[] trustManagers = null; 12 | 13 | public static TrustManager[] getInstance() { 14 | if (trustManagers == null) { 15 | trustManagers = new TrustManager[1]; 16 | trustManagers[0] = new DummyTrustManager(); 17 | } 18 | return trustManagers; 19 | } 20 | 21 | @Override 22 | public void checkClientTrusted(X509Certificate[] chain, String authType) { 23 | } 24 | 25 | @Override 26 | public void checkServerTrusted(X509Certificate[] chain, String authType) { 27 | } 28 | 29 | @SuppressWarnings("unused") 30 | public List checkServerTrusted(X509Certificate[] chain, String authType, String host) { 31 | return new ArrayList<>(); 32 | } 33 | 34 | public X509Certificate[] getAcceptedIssuers() { 35 | return new X509Certificate[0]; 36 | } 37 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app's APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Enables namespacing of each library's R class so that its R class includes only the 19 | # resources declared in the library itself and none from the library's dependencies, 20 | # thereby reducing the size of the R class for that library 21 | android.nonTransitiveRClass=true -------------------------------------------------------------------------------- /app/src/main/java/mfsx/xposed/trustmealready/DummySSLSocketFactory.java: -------------------------------------------------------------------------------- 1 | package mfsx.xposed.trustmealready; 2 | 3 | import org.apache.http.conn.ssl.SSLSocketFactory; 4 | 5 | import java.io.IOException; 6 | import java.net.Socket; 7 | import java.security.KeyManagementException; 8 | import java.security.KeyStore; 9 | import java.security.KeyStoreException; 10 | import java.security.NoSuchAlgorithmException; 11 | import java.security.UnrecoverableKeyException; 12 | 13 | import javax.net.ssl.SSLContext; 14 | 15 | public class DummySSLSocketFactory extends SSLSocketFactory { 16 | SSLContext sslContext = SSLContext.getInstance("TLS"); 17 | 18 | public static javax.net.ssl.SSLSocketFactory createDefault() { 19 | try { 20 | SSLContext sslContext = SSLContext.getInstance("TLS"); 21 | sslContext.init(null, DummyTrustManager.getInstance(), null); 22 | return sslContext.getSocketFactory(); 23 | } catch (NoSuchAlgorithmException | KeyManagementException e) { 24 | return null; 25 | } 26 | } 27 | 28 | public DummySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { 29 | super(truststore); 30 | sslContext.init(null, DummyTrustManager.getInstance(), null); 31 | } 32 | 33 | @Override 34 | public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException { 35 | return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose); 36 | } 37 | 38 | @Override 39 | public Socket createSocket() throws IOException { 40 | return sslContext.getSocketFactory().createSocket(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | ## 21 | ## Gradle start up script for UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | 86 | # Determine the Java command to use to start the JVM. 87 | if [ -n "$JAVA_HOME" ] ; then 88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 89 | # IBM's JDK on AIX uses strange locations for the executables 90 | JAVACMD="$JAVA_HOME/jre/sh/java" 91 | else 92 | JAVACMD="$JAVA_HOME/bin/java" 93 | fi 94 | if [ ! -x "$JAVACMD" ] ; then 95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 96 | 97 | Please set the JAVA_HOME variable in your environment to match the 98 | location of your Java installation." 99 | fi 100 | else 101 | JAVACMD="java" 102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 103 | 104 | Please set the JAVA_HOME variable in your environment to match the 105 | location of your Java installation." 106 | fi 107 | 108 | # Increase the maximum file descriptors if we can. 109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 110 | MAX_FD_LIMIT=`ulimit -H -n` 111 | if [ $? -eq 0 ] ; then 112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 113 | MAX_FD="$MAX_FD_LIMIT" 114 | fi 115 | ulimit -n $MAX_FD 116 | if [ $? -ne 0 ] ; then 117 | warn "Could not set maximum file descriptor limit: $MAX_FD" 118 | fi 119 | else 120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 121 | fi 122 | fi 123 | 124 | # For Darwin, add options to specify how the application appears in the dock 125 | if $darwin; then 126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 127 | fi 128 | 129 | # For Cygwin or MSYS, switch paths to Windows format before running java 130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 133 | 134 | JAVACMD=`cygpath --unix "$JAVACMD"` 135 | 136 | # We build the pattern for arguments to be converted via cygpath 137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 138 | SEP="" 139 | for dir in $ROOTDIRSRAW ; do 140 | ROOTDIRS="$ROOTDIRS$SEP$dir" 141 | SEP="|" 142 | done 143 | OURCYGPATTERN="(^($ROOTDIRS))" 144 | # Add a user-defined pattern to the cygpath arguments 145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 147 | fi 148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 149 | i=0 150 | for arg in "$@" ; do 151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 153 | 154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 156 | else 157 | eval `echo args$i`="\"$arg\"" 158 | fi 159 | i=`expr $i + 1` 160 | done 161 | case $i in 162 | 0) set -- ;; 163 | 1) set -- "$args0" ;; 164 | 2) set -- "$args0" "$args1" ;; 165 | 3) set -- "$args0" "$args1" "$args2" ;; 166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 172 | esac 173 | fi 174 | 175 | # Escape application args 176 | save () { 177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 178 | echo " " 179 | } 180 | APP_ARGS=`save "$@"` 181 | 182 | # Collect all arguments for the java command, following the shell quoting and substitution rules 183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 184 | 185 | exec "$JAVACMD" "$@" 186 | -------------------------------------------------------------------------------- /app/src/main/java/mfsx/xposed/trustmealready/Main.java: -------------------------------------------------------------------------------- 1 | package mfsx.xposed.trustmealready; 2 | 3 | import static de.robv.android.xposed.XC_MethodReplacement.DO_NOTHING; 4 | import static de.robv.android.xposed.XC_MethodReplacement.returnConstant; 5 | import static de.robv.android.xposed.XposedHelpers.callMethod; 6 | import static de.robv.android.xposed.XposedHelpers.callStaticMethod; 7 | import static de.robv.android.xposed.XposedHelpers.findAndHookConstructor; 8 | import static de.robv.android.xposed.XposedHelpers.findAndHookMethod; 9 | import static de.robv.android.xposed.XposedHelpers.findClass; 10 | import static de.robv.android.xposed.XposedHelpers.getObjectField; 11 | import static de.robv.android.xposed.XposedHelpers.newInstance; 12 | import static de.robv.android.xposed.XposedHelpers.setObjectField; 13 | 14 | import android.annotation.SuppressLint; 15 | 16 | import org.apache.http.conn.scheme.HostNameResolver; 17 | import org.apache.http.conn.ssl.SSLSocketFactory; 18 | 19 | import java.lang.reflect.Method; 20 | import java.security.KeyStore; 21 | import java.security.SecureRandom; 22 | import java.security.cert.X509Certificate; 23 | import java.util.ArrayList; 24 | import java.util.Arrays; 25 | import java.util.List; 26 | 27 | import javax.net.ssl.KeyManager; 28 | import javax.net.ssl.SSLContext; 29 | import javax.net.ssl.TrustManager; 30 | 31 | import de.robv.android.xposed.IXposedHookLoadPackage; 32 | import de.robv.android.xposed.XC_MethodHook; 33 | import de.robv.android.xposed.XC_MethodReplacement; 34 | import de.robv.android.xposed.XposedBridge; 35 | import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam; 36 | 37 | public class Main implements IXposedHookLoadPackage { 38 | String packageName; 39 | ClassLoader classLoader; 40 | 41 | int hookedMethods = 0; 42 | 43 | public void handleLoadPackage(final LoadPackageParam lpparam) { 44 | packageName = lpparam.packageName; 45 | classLoader = lpparam.classLoader; 46 | 47 | XposedBridge.log("TrustMeAlready loading: " + packageName); 48 | 49 | try { 50 | String className = "com.android.org.conscrypt.TrustManagerImpl"; 51 | String methodName = "checkTrustedRecursive"; 52 | String methodName2 = "checkServerTrusted"; 53 | String methodName3 = "checkTrusted"; 54 | String methodName4 = "verifyChain"; 55 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 56 | String name = method.getName(); 57 | if (methodName.equals(name) || methodName2.equals(name) || methodName3.equals(name)) { 58 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 59 | if (method.getReturnType().equals(void.class)) { 60 | params.add(DO_NOTHING); 61 | } else { 62 | params.add(returnConstant(new ArrayList())); 63 | } 64 | findAndHookMethod(className, classLoader, name, params.toArray()); 65 | logHookedMethod(method.toString()); 66 | } else if (methodName4.equals(name)) { 67 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 68 | params.add(new XC_MethodReplacement() { 69 | @Override 70 | protected Object replaceHookedMethod(MethodHookParam param) { 71 | return param.args[0]; 72 | } 73 | }); 74 | findAndHookMethod(className, classLoader, name, params.toArray()); 75 | logHookedMethod(method.toString()); 76 | } 77 | } 78 | } catch (Error e) { 79 | logError(e); 80 | } 81 | 82 | try { 83 | String className = "com.android.org.conscrypt.OpenSSLSocketImpl"; 84 | String methodName = "verifyCertificateChain"; 85 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 86 | String name = method.getName(); 87 | if (methodName.equals(name)) { 88 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 89 | params.add(DO_NOTHING); 90 | findAndHookMethod(className, classLoader, name, params.toArray()); 91 | logHookedMethod(method.toString()); 92 | } 93 | } 94 | } catch (Error e) { 95 | logError(e); 96 | } 97 | 98 | try { 99 | String className = "com.android.org.conscrypt.OpenSSLEngineSocketImpl"; 100 | String methodName = "verifyCertificateChain"; 101 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 102 | String name = method.getName(); 103 | if (methodName.equals(name)) { 104 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 105 | params.add(DO_NOTHING); 106 | findAndHookMethod(className, classLoader, name, params.toArray()); 107 | logHookedMethod(method.toString()); 108 | } 109 | } 110 | } catch (Error e) { 111 | logError(e); 112 | } 113 | 114 | try { 115 | String className = "com.android.org.conscrypt.ConscryptFileDescriptorSocket"; 116 | String methodName = "verifyCertificateChain"; 117 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 118 | String name = method.getName(); 119 | if (methodName.equals(name)) { 120 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 121 | params.add(DO_NOTHING); 122 | findAndHookMethod(className, classLoader, name, params.toArray()); 123 | logHookedMethod(method.toString()); 124 | } 125 | } 126 | } catch (Error e) { 127 | logError(e); 128 | } 129 | 130 | try { 131 | String className = "com.android.org.conscrypt.CertPinManager"; 132 | String methodName = "isChainValid"; 133 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 134 | String name = method.getName(); 135 | if (methodName.equals(name)) { 136 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 137 | params.add(returnConstant(true)); 138 | findAndHookMethod(className, classLoader, name, params.toArray()); 139 | logHookedMethod(method.toString()); 140 | } 141 | } 142 | } catch (Error e) { 143 | logError(e); 144 | } 145 | 146 | try { 147 | String className = "android.security.net.config.NetworkSecurityTrustManager"; 148 | String methodName = "checkPins"; 149 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 150 | String name = method.getName(); 151 | if (methodName.equals(name)) { 152 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 153 | params.add(DO_NOTHING); 154 | findAndHookMethod(className, classLoader, name, params.toArray()); 155 | logHookedMethod(method.toString()); 156 | } 157 | } 158 | } catch (Error e) { 159 | logError(e); 160 | } 161 | 162 | try { 163 | String className = "android.webkit.WebViewClient"; 164 | String methodName = "onReceivedSslError"; 165 | String methodName2 = "onReceivedError"; 166 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 167 | String name = method.getName(); 168 | if (methodName.equals(name)) { 169 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 170 | params.add(new XC_MethodReplacement() { 171 | @Override 172 | protected Object replaceHookedMethod(MethodHookParam param) { 173 | ((android.webkit.SslErrorHandler) param.args[1]).proceed(); 174 | return null; 175 | } 176 | }); 177 | findAndHookMethod(className, classLoader, name, params.toArray()); 178 | logHookedMethod(method.toString()); 179 | } else if (methodName2.equals(name)) { 180 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 181 | params.add(DO_NOTHING); 182 | findAndHookMethod(className, classLoader, name, params.toArray()); 183 | logHookedMethod(method.toString()); 184 | } 185 | } 186 | } catch (Error e) { 187 | logError(e); 188 | } 189 | 190 | try { 191 | String className = "javax.net.ssl.HttpsURLConnection"; 192 | String methodName = "setHostnameVerifier"; 193 | String methodName2 = "setSSLSocketFactory"; 194 | String methodName3 = "setDefaultHostnameVerifier"; 195 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 196 | String name = method.getName(); 197 | if (name.equals(methodName) || name.equals(methodName2) || name.equals(methodName3)) { 198 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 199 | params.add(DO_NOTHING); 200 | findAndHookMethod(className, classLoader, name, params.toArray()); 201 | logHookedMethod(method.toString()); 202 | } 203 | } 204 | } catch (Error e) { 205 | logError(e); 206 | } 207 | 208 | try { 209 | String className = "javax.net.ssl.SSLContext"; 210 | String methodName = "init"; 211 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 212 | String name = method.getName(); 213 | if (methodName.equals(name)) { 214 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 215 | params.add(new XC_MethodHook() { 216 | @Override 217 | protected void beforeHookedMethod(MethodHookParam param) { 218 | param.args[0] = null; 219 | param.args[1] = DummyTrustManager.getInstance(); 220 | param.args[2] = null; 221 | } 222 | }); 223 | findAndHookMethod(className, classLoader, name, params.toArray()); 224 | logHookedMethod(method.toString()); 225 | } 226 | } 227 | } catch (Error e) { 228 | logError(e); 229 | } 230 | 231 | try { 232 | String className = "javax.net.ssl.TrustManagerFactory"; 233 | String className2 = "com.android.org.conscrypt.TrustManagerImpl"; 234 | String methodName = "getTrustManagers"; 235 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 236 | String name = method.getName(); 237 | if (methodName.equals(name)) { 238 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 239 | params.add(new XC_MethodHook() { 240 | @SuppressLint("PrivateApi") 241 | @Override 242 | protected void afterHookedMethod(MethodHookParam param) { 243 | try { 244 | Class.forName(className2); 245 | Class clazz = findClass(className2, classLoader); 246 | TrustManager[] trustManagers = (TrustManager[]) param.getResult(); 247 | if (trustManagers.length > 0 && clazz.isInstance(trustManagers[0])) 248 | return; 249 | } catch (ClassNotFoundException ignored) { 250 | return; 251 | } 252 | param.setResult(DummyTrustManager.getInstance()); 253 | } 254 | }); 255 | findAndHookMethod(className, classLoader, name, params.toArray()); 256 | logHookedMethod(method.toString()); 257 | } 258 | } 259 | } catch (Error e) { 260 | logError(e); 261 | } 262 | 263 | try { 264 | String className = "org.apache.http.conn.scheme.SchemeRegistry"; 265 | String methodName = "register"; 266 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 267 | String name = method.getName(); 268 | if (methodName.equals(name)) { 269 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 270 | params.add(new XC_MethodHook() { 271 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) { 272 | Object obj = param.args[0]; 273 | if (callMethod(obj, "getName") == "https") { 274 | param.args[0] = newInstance(obj.getClass(), "https", SSLSocketFactory.getSocketFactory(), 443); 275 | } 276 | } 277 | }); 278 | findAndHookMethod(className, classLoader, name, params.toArray()); 279 | logHookedMethod(method.toString()); 280 | } 281 | } 282 | } catch (Error e) { 283 | logError(e); 284 | } 285 | 286 | try { 287 | String className = "org.apache.http.conn.ssl.HttpsURLConnection"; 288 | String methodName = "setDefaultHostnameVerifier"; 289 | String methodName2 = "setHostnameVerifier"; 290 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 291 | String name = method.getName(); 292 | if (methodName.equals(name) || methodName2.equals(name)) { 293 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 294 | params.add(new XC_MethodHook() { 295 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) { 296 | param.args[0] = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER; 297 | } 298 | }); 299 | findAndHookMethod(className, classLoader, name, params.toArray()); 300 | logHookedMethod(method.toString()); 301 | } 302 | } 303 | } catch (Error e) { 304 | logError(e); 305 | } 306 | 307 | try { 308 | String className = "org.apache.http.conn.ssl.SSLSocketFactory"; 309 | String methodName = "getSocketFactory"; 310 | String methodName2 = "isSecure"; 311 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 312 | String name = method.getName(); 313 | if (methodName.equals(name)) { 314 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 315 | params.add(new XC_MethodHook() { 316 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) { 317 | param.setResult(newInstance(org.apache.http.conn.ssl.SSLSocketFactory.class)); 318 | } 319 | }); 320 | findAndHookMethod(className, classLoader, name, params.toArray()); 321 | logHookedMethod(method.toString()); 322 | } else if (methodName2.equals(name)) { 323 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 324 | params.add(new XC_MethodHook() { 325 | protected void beforeHookedMethod(MethodHookParam param) { 326 | param.setResult(true); 327 | } 328 | }); 329 | findAndHookMethod(className, classLoader, name, params.toArray()); 330 | logHookedMethod(method.toString()); 331 | } 332 | } 333 | } catch (Error e) { 334 | logError(e); 335 | } 336 | 337 | try { 338 | String className = "org.apache.http.conn.ssl.SSLSocketFactory"; 339 | Class sslSocketFactory = findClass(className, classLoader); 340 | findAndHookConstructor(sslSocketFactory, String.class, KeyStore.class, String.class, KeyStore.class, SecureRandom.class, HostNameResolver.class, new XC_MethodHook() { 341 | @Override 342 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 343 | String algorithm = (String) param.args[0]; 344 | KeyStore keystore = (KeyStore) param.args[1]; 345 | String keystorePassword = (String) param.args[2]; 346 | SecureRandom random = (SecureRandom) param.args[4]; 347 | 348 | KeyManager[] keymanagers = null; 349 | 350 | if (keystore != null) { 351 | keymanagers = (KeyManager[]) callStaticMethod(SSLSocketFactory.class, "createKeyManagers", keystore, keystorePassword); 352 | } 353 | 354 | TrustManager[] trustmanagers = DummyTrustManager.getInstance(); 355 | 356 | setObjectField(param.thisObject, "sslcontext", SSLContext.getInstance(algorithm)); 357 | callMethod(getObjectField(param.thisObject, "sslcontext"), "init", keymanagers, trustmanagers, random); 358 | setObjectField(param.thisObject, "socketfactory", callMethod(getObjectField(param.thisObject, "sslcontext"), "getSocketFactory")); 359 | } 360 | }); 361 | logHookedMethod(className); 362 | } catch (Error e) { 363 | logError(e); 364 | } 365 | 366 | try { 367 | String className = "okhttp3.CertificatePinner"; 368 | String methodName = "findMatchingPins"; 369 | String methodName2 = "check"; 370 | String methodName3 = "check$okhttp"; 371 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 372 | String name = method.getName(); 373 | if (methodName.equals(name)) { 374 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 375 | params.add(new XC_MethodHook() { 376 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) { 377 | param.args[0] = ""; 378 | } 379 | }); 380 | findAndHookMethod(className, classLoader, name, params.toArray()); 381 | logHookedMethod(method.toString()); 382 | } else if (methodName2.equals(name) || methodName3.equals(name)) { 383 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 384 | params.add(DO_NOTHING); 385 | findAndHookMethod(className, classLoader, name, params.toArray()); 386 | logHookedMethod(method.toString()); 387 | } 388 | } 389 | } catch (Error e) { 390 | logError(e); 391 | } 392 | 393 | try { 394 | String className = "okhttp3.repackaged.CertificatePinner"; 395 | String methodName = "findMatchingPins"; 396 | String methodName2 = "check"; 397 | String methodName3 = "check$okhttp"; 398 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 399 | String name = method.getName(); 400 | if (methodName.equals(name)) { 401 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 402 | params.add(new XC_MethodHook() { 403 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) { 404 | param.args[0] = ""; 405 | } 406 | }); 407 | findAndHookMethod(className, classLoader, name, params.toArray()); 408 | logHookedMethod(method.toString()); 409 | } else if (methodName2.equals(name) || methodName3.equals(name)) { 410 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 411 | params.add(DO_NOTHING); 412 | findAndHookMethod(className, classLoader, name, params.toArray()); 413 | logHookedMethod(method.toString()); 414 | } 415 | } 416 | } catch (Error e) { 417 | logError(e); 418 | } 419 | 420 | try { 421 | String className = "com.commencis.okhttp3.CertificatePinner"; 422 | String methodName = "check"; 423 | String methodName2 = "check$okhttp"; 424 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 425 | String name = method.getName(); 426 | if (methodName.equals(name) || methodName2.equals(name)) { 427 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 428 | params.add(DO_NOTHING); 429 | findAndHookMethod(className, classLoader, name, params.toArray()); 430 | logHookedMethod(method.toString()); 431 | } 432 | } 433 | } catch (Error e) { 434 | logError(e); 435 | } 436 | 437 | try { 438 | String className = "okhttp3.internal.tls.OkHostnameVerifier"; 439 | String methodName = "verify"; 440 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 441 | String name = method.getName(); 442 | if (methodName.equals(name)) { 443 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 444 | params.add(returnConstant(true)); 445 | findAndHookMethod(className, classLoader, name, params.toArray()); 446 | logHookedMethod(method.toString()); 447 | } 448 | } 449 | } catch (Error e) { 450 | logError(e); 451 | } 452 | 453 | try { 454 | String className = "com.squareup.okhttp.CertificatePinner"; 455 | String methodName = "check"; 456 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 457 | String name = method.getName(); 458 | if (methodName.equals(name)) { 459 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 460 | params.add(DO_NOTHING); 461 | findAndHookMethod(className, classLoader, name, params.toArray()); 462 | logHookedMethod(method.toString()); 463 | } 464 | } 465 | } catch (Error e) { 466 | logError(e); 467 | } 468 | 469 | try { 470 | String className = "com.squareup.okhttp.internal.tls.OkHostnameVerifier"; 471 | String methodName = "verify"; 472 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 473 | String name = method.getName(); 474 | if (methodName.equals(name)) { 475 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 476 | params.add(returnConstant(true)); 477 | findAndHookMethod(className, classLoader, name, params.toArray()); 478 | logHookedMethod(method.toString()); 479 | } 480 | } 481 | } catch (Error e) { 482 | logError(e); 483 | } 484 | 485 | try { 486 | String className = "org.xutils.http.RequestParams"; 487 | String methodName = "setSslSocketFactory"; 488 | String methodName2 = "setHostnameVerifier"; 489 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 490 | String name = method.getName(); 491 | if (methodName.equals(name)) { 492 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 493 | params.add(new XC_MethodHook() { 494 | @Override 495 | protected void beforeHookedMethod(MethodHookParam param) { 496 | param.args[0] = DummySSLSocketFactory.createDefault(); 497 | } 498 | }); 499 | findAndHookMethod(className, classLoader, name, params.toArray()); 500 | logHookedMethod(method.toString()); 501 | } else if (methodName2.equals(name)) { 502 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 503 | params.add(new XC_MethodHook() { 504 | @Override 505 | protected void beforeHookedMethod(MethodHookParam param) { 506 | param.args[0] = new DummyHostnameVerifier(); 507 | } 508 | }); 509 | findAndHookMethod(className, classLoader, name, params.toArray()); 510 | logHookedMethod(method.toString()); 511 | } 512 | } 513 | } catch (Error e) { 514 | logError(e); 515 | } 516 | 517 | try { 518 | String className = "com.appmattus.certificatetransparency.internal.verifier.CertificateTransparencyInterceptor"; 519 | String methodName = "intercept"; 520 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 521 | String name = method.getName(); 522 | if (methodName.equals(name)) { 523 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 524 | params.add(new XC_MethodReplacement() { 525 | @Override 526 | protected Object replaceHookedMethod(MethodHookParam param) { 527 | Object chain = param.args[0]; 528 | Object request = callMethod(chain, "request"); 529 | return callMethod(chain, "proceed", request); 530 | } 531 | }); 532 | findAndHookMethod(className, classLoader, name, params.toArray()); 533 | logHookedMethod(method.toString()); 534 | } 535 | } 536 | } catch (Error e) { 537 | logError(e); 538 | } 539 | 540 | try { 541 | String className = "com.appmattus.certificatetransparency.internal.verifier.CertificateTransparencyTrustManager"; 542 | String methodName = "checkServerTrusted"; 543 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 544 | String name = method.getName(); 545 | if (methodName.equals(name)) { 546 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 547 | if (method.getReturnType().equals(void.class)) { 548 | params.add(DO_NOTHING); 549 | } else { 550 | params.add(returnConstant(new ArrayList())); 551 | } 552 | findAndHookMethod(className, classLoader, name, params.toArray()); 553 | logHookedMethod(method.toString()); 554 | } 555 | } 556 | } catch (Error e) { 557 | logError(e); 558 | } 559 | 560 | try { 561 | String className = "appcelerator.https.PinningTrustManager"; 562 | String methodName = "checkServerTrusted"; 563 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 564 | String name = method.getName(); 565 | if (methodName.equals(name)) { 566 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 567 | params.add(DO_NOTHING); 568 | findAndHookMethod(className, classLoader, name, params.toArray()); 569 | logHookedMethod(method.toString()); 570 | } 571 | } 572 | } catch (Error e) { 573 | logError(e); 574 | } 575 | 576 | try { 577 | String className = "ch.boye.httpclientandroidlib.conn.ssl.AbstractVerifier"; 578 | String methodName = "verify"; 579 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 580 | String name = method.getName(); 581 | if (methodName.equals(name)) { 582 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 583 | params.add(DO_NOTHING); 584 | findAndHookMethod(className, classLoader, name, params.toArray()); 585 | logHookedMethod(method.toString()); 586 | } 587 | } 588 | } catch (Error e) { 589 | logError(e); 590 | } 591 | 592 | try { 593 | String className = "org.chromium.net.CronetEngine$Builder"; 594 | String methodName = "enablePublicKeyPinningBypassForLocalTrustAnchors"; 595 | String methodName2 = "addPublicKeyPins"; 596 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 597 | String name = method.getName(); 598 | if (methodName.equals(name)) { 599 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 600 | params.add(new XC_MethodHook() { 601 | @Override 602 | protected void beforeHookedMethod(MethodHookParam param) { 603 | param.args[0] = true; 604 | } 605 | }); 606 | findAndHookMethod(className, classLoader, name, params.toArray()); 607 | logHookedMethod(method.toString()); 608 | } else if (methodName2.equals(name)) { 609 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 610 | params.add(new XC_MethodReplacement() { 611 | @Override 612 | protected Object replaceHookedMethod(MethodHookParam param) { 613 | return param.thisObject; 614 | } 615 | }); 616 | findAndHookMethod(className, classLoader, name, params.toArray()); 617 | logHookedMethod(method.toString()); 618 | } 619 | } 620 | } catch (Error e) { 621 | logError(e); 622 | } 623 | 624 | try { 625 | String className = "com.datatheorem.android.trustkit.pinning.OkHostnameVerifier"; 626 | String methodName = "verify"; 627 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 628 | String name = method.getName(); 629 | if (methodName.equals(name)) { 630 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 631 | params.add(returnConstant(true)); 632 | findAndHookMethod(className, classLoader, name, params.toArray()); 633 | logHookedMethod(method.toString()); 634 | } 635 | } 636 | } catch (Error e) { 637 | logError(e); 638 | } 639 | 640 | try { 641 | String className = "com.datatheorem.android.trustkit.pinning.PinningTrustManager"; 642 | String methodName = "checkServerTrusted"; 643 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 644 | String name = method.getName(); 645 | if (methodName.equals(name)) { 646 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 647 | params.add(DO_NOTHING); 648 | findAndHookMethod(className, classLoader, name, params.toArray()); 649 | logHookedMethod(method.toString()); 650 | } 651 | } 652 | } catch (Error e) { 653 | logError(e); 654 | } 655 | 656 | try { 657 | String className = "com.commonsware.cwac.netsecurity.conscrypt.CertPinManager"; 658 | String methodName = "isChainValid"; 659 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 660 | String name = method.getName(); 661 | if (methodName.equals(name)) { 662 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 663 | params.add(returnConstant(true)); 664 | findAndHookMethod(className, classLoader, name, params.toArray()); 665 | logHookedMethod(method.toString()); 666 | } 667 | } 668 | } catch (Error e) { 669 | logError(e); 670 | } 671 | 672 | try { 673 | String className = "com.worklight.wlclient.certificatepinning.HostNameVerifierWithCertificatePinning"; 674 | String methodName = "verify"; 675 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 676 | String name = method.getName(); 677 | if (methodName.equals(name)) { 678 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 679 | params.add(DO_NOTHING); 680 | findAndHookMethod(className, classLoader, name, params.toArray()); 681 | logHookedMethod(method.toString()); 682 | } 683 | } 684 | } catch (Error e) { 685 | logError(e); 686 | } 687 | 688 | try { 689 | String className = "com.worklight.wlclient.api.WLClient"; 690 | String methodName = "pinTrustedCertificatePublicKey"; 691 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 692 | String name = method.getName(); 693 | if (methodName.equals(name)) { 694 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 695 | params.add(DO_NOTHING); 696 | findAndHookMethod(className, classLoader, name, params.toArray()); 697 | logHookedMethod(method.toString()); 698 | } 699 | } 700 | } catch (Error e) { 701 | logError(e); 702 | } 703 | 704 | try { 705 | String className = "com.worklight.androidgap.plugin.WLCertificatePinningPlugin"; 706 | String methodName = "execute"; 707 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 708 | String name = method.getName(); 709 | if (methodName.equals(name)) { 710 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 711 | params.add(returnConstant(true)); 712 | findAndHookMethod(className, classLoader, name, params.toArray()); 713 | logHookedMethod(method.toString()); 714 | } 715 | } 716 | } catch (Error e) { 717 | logError(e); 718 | } 719 | 720 | try { 721 | String className = "nl.xservices.plugins.sslCertificateChecker"; 722 | String methodName = "execute"; 723 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 724 | String name = method.getName(); 725 | if (methodName.equals(name)) { 726 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 727 | params.add(returnConstant(true)); 728 | findAndHookMethod(className, classLoader, name, params.toArray()); 729 | logHookedMethod(method.toString()); 730 | } 731 | } 732 | } catch (Error e) { 733 | logError(e); 734 | } 735 | 736 | try { 737 | String className = "io.netty.handler.ssl.util.FingerprintTrustManagerFactory"; 738 | String methodName = "checkTrusted"; 739 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 740 | String name = method.getName(); 741 | if (methodName.equals(name)) { 742 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 743 | params.add(DO_NOTHING); 744 | findAndHookMethod(className, classLoader, name, params.toArray()); 745 | logHookedMethod(method.toString()); 746 | } 747 | } 748 | } catch (Error e) { 749 | logError(e); 750 | } 751 | 752 | try { 753 | String className = "org.apache.cordova.CordovaWebViewClient"; 754 | String methodName = "onReceivedSslError"; 755 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 756 | String name = method.getName(); 757 | if (methodName.equals(name)) { 758 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 759 | params.add(new XC_MethodReplacement() { 760 | @Override 761 | protected Object replaceHookedMethod(MethodHookParam param) { 762 | ((android.webkit.SslErrorHandler) param.args[2]).proceed(); 763 | return null; 764 | } 765 | }); 766 | findAndHookMethod(className, classLoader, name, params.toArray()); 767 | logHookedMethod(method.toString()); 768 | } 769 | } 770 | } catch (Error e) { 771 | logError(e); 772 | } 773 | 774 | try { 775 | String className = "org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl"; 776 | String methodName = "verifyCertificateChain"; 777 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 778 | String name = method.getName(); 779 | if (methodName.equals(name)) { 780 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 781 | params.add(DO_NOTHING); 782 | findAndHookMethod(className, classLoader, name, params.toArray()); 783 | logHookedMethod(method.toString()); 784 | } 785 | } 786 | } catch (Error e) { 787 | logError(e); 788 | } 789 | 790 | try { 791 | String className = "com.turkcell.paycell.data.DataModule"; 792 | String methodName = "checkCertificate"; 793 | for (Method method : findClass(className, classLoader).getDeclaredMethods()) { 794 | String name = method.getName(); 795 | if (methodName.equals(name)) { 796 | List params = new ArrayList<>(Arrays.asList(method.getParameterTypes())); 797 | params.add(returnConstant(true)); 798 | findAndHookMethod(className, classLoader, name, params.toArray()); 799 | logHookedMethod(method.toString()); 800 | } 801 | } 802 | } catch (Error e) { 803 | logError(e); 804 | } 805 | 806 | XposedBridge.log("TrustMeAlready loaded! Hooked " + hookedMethods + " methods"); 807 | } 808 | 809 | private void logHookedMethod(String text) { 810 | XposedBridge.log("Hooked method: " + text); 811 | hookedMethods++; 812 | } 813 | 814 | private void logError(Error e) { 815 | XposedBridge.log("Hooking error: " + e.getMessage()); 816 | } 817 | } 818 | 819 | --------------------------------------------------------------------------------