1. Java.perform(function() {
    2. var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
    3. var HostnameVerifier = Java.use('javax.net.ssl.HostnameVerifier');
    4. var SSLContext = Java.use('javax.net.ssl.SSLContext');
    5. var quiet_output = false;
    6. function quiet_send(data) {
    7. if (quiet_output) {
    8. return;
    9. }
    10. send(data)
    11. }
    12. var X509Certificate = Java.use("java.security.cert.X509Certificate");
    13. var TrustManager;
    14. try {
    15. TrustManager = Java.registerClass({
    16. name: 'org.wooyun.TrustManager',
    17. implements: [X509TrustManager],
    18. methods: {
    19. checkClientTrusted: function(chain, authType) {},
    20. checkServerTrusted: function(chain, authType) {},
    21. getAcceptedIssuers: function() {
    22. return [];
    23. }
    24. }
    25. });
    26. } catch (e) {
    27. quiet_send("registerClass from X509TrustManager >>>>>>>> " + e.message);
    28. }
    29. // Prepare the TrustManagers array to pass to SSLContext.init()
    30. var TrustManagers = [TrustManager.$new()];
    31. try {
    32. // Prepare a Empty SSLFactory
    33. var TLS_SSLContext = SSLContext.getInstance("TLS");
    34. TLS_SSLContext.init(null, TrustManagers, null);
    35. var EmptySSLFactory = TLS_SSLContext.getSocketFactory();
    36. } catch (e) {
    37. quiet_send(e.message);
    38. }
    39. send('Custom, Empty TrustManager ready');
    40. // Get a handle on the init() on the SSLContext class
    41. var SSLContext_init = SSLContext.init.overload(
    42. '[Ljavax.net.ssl.KeyManager;', '[Ljavax.net.ssl.TrustManager;', 'java.security.SecureRandom');
    43. SSLContext_init.implementation = function(keyManager, trustManager, secureRandom) {
    44. quiet_send('Overriding SSLContext.init() with the custom TrustManager');
    45. SSLContext_init.call(this, null, TrustManagers, null);
    46. };
    47. try {
    48. var CertificatePinner = Java.use('okhttp3.CertificatePinner');
    49. quiet_send('OkHTTP 3.x Found');
    50. CertificatePinner.check.overload('java.lang.String', 'java.util.List').implementation = function() {
    51. quiet_send('OkHTTP 3.x check() called. Not throwing an exception.');
    52. }
    53. } catch (err) {
    54. if (err.message.indexOf('ClassNotFoundException') === 0) {
    55. throw new Error(err);
    56. }
    57. }
    58. try {
    59. var PinningTrustManager = Java.use('appcelerator.https.PinningTrustManager');
    60. send('Appcelerator Titanium Found');
    61. PinningTrustManager.checkServerTrusted.implementation = function() {
    62. quiet_send('Appcelerator checkServerTrusted() called. Not throwing an exception.');
    63. }
    64. } catch (err) {
    65. if (err.message.indexOf('ClassNotFoundException') === 0) {
    66. throw new Error(err);
    67. }
    68. }
    69. /*** okhttp unpinning ***/
    70. try {
    71. var OkHttpClient = Java.use("com.squareup.okhttp.OkHttpClient");
    72. OkHttpClient.setCertificatePinner.implementation = function(certificatePinner) {
    73. // do nothing
    74. quiet_send("OkHttpClient.setCertificatePinner Called!");
    75. return this;
    76. };
    77. var CertificatePinner = Java.use("com.squareup.okhttp.CertificatePinner");
    78. CertificatePinner.check.overload('java.lang.String', '[Ljava.security.cert.Certificate;').implementation = function(p0, p1) {
    79. // do nothing
    80. quiet_send("okhttp Called! [Certificate]");
    81. return;
    82. };
    83. CertificatePinner.check.overload('java.lang.String', 'java.util.List').implementation = function(p0, p1) {
    84. // do nothing
    85. quiet_send("okhttp Called! [List]");
    86. return;
    87. };
    88. } catch (e) {
    89. quiet_send("com.squareup.okhttp not found");
    90. }
    91. /*** WebView Hooks ***/
    92. /* frameworks/base/core/java/android/webkit/WebViewClient.java */
    93. /* public void onReceivedSslError(Webview, SslErrorHandler, SslError) */
    94. var WebViewClient = Java.use("android.webkit.WebViewClient");
    95. WebViewClient.onReceivedSslError.implementation = function(webView, sslErrorHandler, sslError) {
    96. quiet_send("WebViewClient onReceivedSslError invoke");
    97. //执行proceed方法
    98. sslErrorHandler.proceed();
    99. return;
    100. };
    101. WebViewClient.onReceivedError.overload('android.webkit.WebView', 'int', 'java.lang.String', 'java.lang.String').implementation = function(a, b, c, d) {
    102. quiet_send("WebViewClient onReceivedError invoked");
    103. return;
    104. };
    105. WebViewClient.onReceivedError.overload('android.webkit.WebView', 'android.webkit.WebResourceRequest', 'android.webkit.WebResourceError').implementation = function() {
    106. quiet_send("WebViewClient onReceivedError invoked");
    107. return;
    108. };
    109. var HttpsURLConnection = Java.use("javax.net.ssl.HttpsURLConnection");
    110. HttpsURLConnection.setDefaultHostnameVerifier.implementation = function(hostnameVerifier) {
    111. quiet_send("HttpsURLConnection.setDefaultHostnameVerifier invoked");
    112. return null;
    113. };
    114. HttpsURLConnection.setSSLSocketFactory.implementation = function(SSLSocketFactory) {
    115. quiet_send("HttpsURLConnection.setSSLSocketFactory invoked");
    116. return null;
    117. };
    118. /* libcore/luni/src/main/java/javax/net/ssl/HttpsURLConnection.java */
    119. /* public void setHostnameVerifier(HostnameVerifier) */
    120. HttpsURLConnection.setHostnameVerifier.implementation = function(hostnameVerifier) {
    121. quiet_send("HttpsURLConnection.setHostnameVerifier invoked");
    122. return null;
    123. };
    124. /*** Xutils3.x hooks ***/
    125. //Implement a new HostnameVerifier
    126. var TrustHostnameVerifier;
    127. try {
    128. TrustHostnameVerifier = Java.registerClass({
    129. name: 'org.wooyun.TrustHostnameVerifier',
    130. implements: [HostnameVerifier],
    131. method: {
    132. verify: function(hostname, session) {
    133. return true;
    134. }
    135. }
    136. });
    137. } catch (e) {
    138. //java.lang.ClassNotFoundException: Didn't find class "org.wooyun.TrustHostnameVerifier"
    139. quiet_send("registerClass from hostnameVerifier >>>>>>>> " + e.message);
    140. }
    141. try {
    142. var RequestParams = Java.use('org.xutils.http.RequestParams');
    143. RequestParams.setSslSocketFactory.implementation = function(sslSocketFactory) {
    144. sslSocketFactory = EmptySSLFactory;
    145. return null;
    146. }
    147. RequestParams.setHostnameVerifier.implementation = function(hostnameVerifier) {
    148. hostnameVerifier = TrustHostnameVerifier.$new();
    149. return null;
    150. }
    151. } catch (e) {
    152. quiet_send("Xutils hooks not Found");
    153. }
    154. try {
    155. var AbstractVerifier = Java.use("ch.boye.httpclientandroidlib.conn.ssl.AbstractVerifier");
    156. AbstractVerifier.verify.overload('java.lang.String', '[Ljava.lang.String', '[Ljava.lang.String', 'boolean').implementation = function() {
    157. quiet_send("httpclientandroidlib Hooks");
    158. return null;
    159. }
    160. } catch (e) {
    161. quiet_send("httpclientandroidlib Hooks not found");
    162. }
    163. /***
    164. android 7.0+ network_security_config TrustManagerImpl hook
    165. apache httpclient partly
    166. ***/
    167. var TrustManagerImpl = Java.use("com.android.org.conscrypt.TrustManagerImpl");
    168. // try {
    169. // var Arrays = Java.use("java.util.Arrays");
    170. // //apache http client pinning maybe baypass
    171. // //https://github.com/google/conscrypt/blob/c88f9f55a523f128f0e4dace76a34724bfa1e88c/platform/src/main/java/org/conscrypt/TrustManagerImpl.java#471
    172. // TrustManagerImpl.checkTrusted.implementation = function (chain, authType, session, parameters, authType) {
    173. // quiet_send("TrustManagerImpl checkTrusted called");
    174. // //Generics currently result in java.lang.Object
    175. // return Arrays.asList(chain);
    176. // }
    177. //
    178. // } catch (e) {
    179. // quiet_send("TrustManagerImpl checkTrusted nout found");
    180. // }
    181. try {
    182. // Android 7+ TrustManagerImpl
    183. TrustManagerImpl.verifyChain.implementation = function(untrustedChain, trustAnchorChain, host, clientAuth, ocspData, tlsSctData) {
    184. quiet_send("TrustManagerImpl verifyChain called");
    185. return untrustedChain;
    186. }
    187. } catch (e) {
    188. quiet_send("TrustManagerImpl verifyChain nout found below 7.0");
    189. }
    190. // OpenSSLSocketImpl
    191. try {
    192. var OpenSSLSocketImpl = Java.use('com.android.org.conscrypt.OpenSSLSocketImpl');
    193. OpenSSLSocketImpl.verifyCertificateChain.implementation = function(certRefs, authMethod) {
    194. quiet_send('OpenSSLSocketImpl.verifyCertificateChain');
    195. }
    196. quiet_send('OpenSSLSocketImpl pinning')
    197. } catch (err) {
    198. quiet_send('OpenSSLSocketImpl pinner not found');
    199. }
    200. // Trustkit
    201. try {
    202. var Activity = Java.use("com.datatheorem.android.trustkit.pinning.OkHostnameVerifier");
    203. Activity.verify.overload('java.lang.String', 'javax.net.ssl.SSLSession').implementation = function(str) {
    204. quiet_send('Trustkit.verify1: ' + str);
    205. return true;
    206. };
    207. Activity.verify.overload('java.lang.String', 'java.security.cert.X509Certificate').implementation = function(str) {
    208. quiet_send('Trustkit.verify2: ' + str);
    209. return true;
    210. };
    211. quiet_send('Trustkit pinning')
    212. } catch (err) {
    213. quiet_send('Trustkit pinner not found')
    214. }
    215. try {
    216. var netBuilder = Java.use("org.chromium.net.CronetEngine$Builder");
    217. netBuilder.enablePublicKeyPinningBypassForLocalTrustAnchors.implementation = function(arg) {
    218. console.log("Enables or disables public key pinning bypass for local trust anchors = " + arg);
    219. //true to enable the bypass, false to disable.
    220. var ret = netBuilder.enablePublicKeyPinningBypassForLocalTrustAnchors.call(this, true);
    221. return ret;
    222. };
    223. netBuilder.addPublicKeyPins.implementation = function(hostName, pinsSha256, includeSubdomains, expirationDate) {
    224. console.log("cronet addPublicKeyPins hostName = " + hostName);
    225. return this;
    226. };
    227. } catch (err) {
    228. console.log('[-] Cronet pinner not found')
    229. }
    230. });