资源共享吧|易语言论坛|逆向破解教程|辅助开发教程|网络安全教程|www.zygx8.com|我的开发技术随记

 找回密码
 注册成为正式会员
查看: 991|回复: 3

[其他] 找小肩膀抓包专题第十七课hooks.js

[复制链接]

4

主题

64

帖子

0

精华

终身高级VIP会员

Rank: 7Rank: 7Rank: 7

资源币
21
积分
69
贡献
0
在线时间
24 小时
注册时间
2020-11-7
最后登录
2023-11-9

终身VIP会员

发表于 2020-11-19 17:18:10 | 显示全部楼层 |阅读模式
1资源币
小肩膀抓包专题第十七课hooks.js

回复

使用道具 举报

2

主题

139

帖子

0

精华

终身高级VIP会员

Rank: 7Rank: 7Rank: 7

资源币
93
积分
142
贡献
0
在线时间
31 小时
注册时间
2020-3-24
最后登录
2022-12-11

终身VIP会员

发表于 2020-11-27 13:33:58 | 显示全部楼层
同求
回复

使用道具 举报

0

主题

26

帖子

0

精华

新手上路

Rank: 1

资源币
22
积分
26
贡献
0
在线时间
9 小时
注册时间
2020-10-19
最后登录
2024-3-28
发表于 2020-12-29 16:53:05 | 显示全部楼层
我发现了这个板块的提问竟然没有一个回应 ,说好的老师去哪了?
回复

使用道具 举报

2

主题

75

帖子

0

精华

资源共享吧豪华贵族SVIP

Rank: 9Rank: 9Rank: 9

资源币
7
积分
77
贡献
0
在线时间
11 小时
注册时间
2022-5-27
最后登录
2024-2-22

终身VIP会员

发表于 2022-5-28 14:00:44 | 显示全部楼层
  1. Java.perform(function() {

  2. /*
  3. hook list:
  4. 1.SSLcontext
  5. 2.okhttp
  6. 3.webview
  7. 4.XUtils
  8. 5.httpclientandroidlib
  9. 6.JSSE
  10. 7.network\_security\_config (android 7.0+)
  11. 8.Apache Http client (support partly)
  12. 9.OpenSSLSocketImpl
  13. 10.TrustKit
  14. 11.Cronet
  15. */

  16.         // Attempts to bypass SSL pinning implementations in a number of
  17.         // ways. These include implementing a new TrustManager that will
  18.         // accept any SSL certificate, overriding OkHTTP v3 check()
  19.         // method etc.
  20.         var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
  21.         var HostnameVerifier = Java.use('javax.net.ssl.HostnameVerifier');
  22.         var SSLContext = Java.use('javax.net.ssl.SSLContext');
  23.         var quiet_output = false;

  24.         // Helper method to honor the quiet flag.

  25.         function quiet_send(data) {

  26.                 if (quiet_output) {

  27.                         return;
  28.                 }

  29.                 send(data)
  30.         }


  31.         // Implement a new TrustManager
  32.         // ref: https://gist.github.com/oleavr/3ca67a173ff7d207c6b8c3b0ca65a9d8
  33.         // Java.registerClass() is only supported on ART for now(201803). 所以android 4.4以下不兼容,4.4要切换成ART使用.
  34.         /*
  35. 06-07 16:15:38.541 27021-27073/mi.sslpinningdemo W/System.err: java.lang.IllegalArgumentException: Required method checkServerTrusted(X509Certificate[], String, String, String) missing
  36. 06-07 16:15:38.542 27021-27073/mi.sslpinningdemo W/System.err:     at android.net.http.X509TrustManagerExtensions.<init>(X509TrustManagerExtensions.java:73)
  37.         at mi.ssl.MiPinningTrustManger.<init>(MiPinningTrustManger.java:61)
  38. 06-07 16:15:38.543 27021-27073/mi.sslpinningdemo W/System.err:     at mi.sslpinningdemo.OkHttpUtil.getSecPinningClient(OkHttpUtil.java:112)
  39.         at mi.sslpinningdemo.OkHttpUtil.get(OkHttpUtil.java:62)
  40.         at mi.sslpinningdemo.MainActivity$1$1.run(MainActivity.java:36)
  41. */
  42.         var X509Certificate = Java.use("java.security.cert.X509Certificate");
  43.         var TrustManager;
  44.         try {
  45.                 TrustManager = Java.registerClass({
  46.                         name: 'org.wooyun.TrustManager',
  47.                         implements: [X509TrustManager],
  48.                         methods: {
  49.                                 checkClientTrusted: function(chain, authType) {},
  50.                                 checkServerTrusted: function(chain, authType) {},
  51.                                 getAcceptedIssuers: function() {
  52.                                         // var certs = [X509Certificate.$new()];
  53.                                         // return certs;
  54.                                         return [];
  55.                                 }
  56.                         }
  57.                 });
  58.         } catch (e) {
  59.                 quiet_send("registerClass from X509TrustManager >>>>>>>> " + e.message);
  60.         }





  61.         // Prepare the TrustManagers array to pass to SSLContext.init()
  62.         var TrustManagers = [TrustManager.$new()];

  63.         try {
  64.                 // Prepare a Empty SSLFactory
  65.                 var TLS_SSLContext = SSLContext.getInstance("TLS");
  66.                 TLS_SSLContext.init(null, TrustManagers, null);
  67.                 var EmptySSLFactory = TLS_SSLContext.getSocketFactory();
  68.         } catch (e) {
  69.                 quiet_send(e.message);
  70.         }

  71.         send('Custom, Empty TrustManager ready');

  72.         // Get a handle on the init() on the SSLContext class
  73.         var SSLContext_init = SSLContext.init.overload(
  74.                 '[Ljavax.net.ssl.KeyManager;', '[Ljavax.net.ssl.TrustManager;', 'java.security.SecureRandom');

  75.         // Override the init method, specifying our new TrustManager
  76.         SSLContext_init.implementation = function(keyManager, trustManager, secureRandom) {

  77.                 quiet_send('Overriding SSLContext.init() with the custom TrustManager');

  78.                 SSLContext_init.call(this, null, TrustManagers, null);
  79.         };

  80.         /*** okhttp3.x unpinning ***/


  81.         // Wrap the logic in a try/catch as not all applications will have
  82.         // okhttp as part of the app.
  83.         try {

  84.                 var CertificatePinner = Java.use('okhttp3.CertificatePinner');

  85.                 quiet_send('OkHTTP 3.x Found');

  86.                 CertificatePinner.check.overload('java.lang.String', 'java.util.List').implementation = function() {

  87.                         quiet_send('OkHTTP 3.x check() called. Not throwing an exception.');
  88.                 }

  89.         } catch (err) {

  90.                 // If we dont have a ClassNotFoundException exception, raise the
  91.                 // problem encountered.
  92.                 if (err.message.indexOf('ClassNotFoundException') === 0) {

  93.                         throw new Error(err);
  94.                 }
  95.         }

  96.         // Appcelerator Titanium PinningTrustManager

  97.         // Wrap the logic in a try/catch as not all applications will have
  98.         // appcelerator as part of the app.
  99.         try {

  100.                 var PinningTrustManager = Java.use('appcelerator.https.PinningTrustManager');

  101.                 send('Appcelerator Titanium Found');

  102.                 PinningTrustManager.checkServerTrusted.implementation = function() {

  103.                         quiet_send('Appcelerator checkServerTrusted() called. Not throwing an exception.');
  104.                 }

  105.         } catch (err) {

  106.                 // If we dont have a ClassNotFoundException exception, raise the
  107.                 // problem encountered.
  108.                 if (err.message.indexOf('ClassNotFoundException') === 0) {

  109.                         throw new Error(err);
  110.                 }
  111.         }

  112.         /*** okhttp unpinning ***/


  113.         try {
  114.                 var OkHttpClient = Java.use("com.squareup.okhttp.OkHttpClient");
  115.                 OkHttpClient.setCertificatePinner.implementation = function(certificatePinner) {
  116.                         // do nothing
  117.                         quiet_send("OkHttpClient.setCertificatePinner Called!");
  118.                         return this;
  119.                 };

  120.                 // Invalidate the certificate pinnet checks (if "setCertificatePinner" was called before the previous invalidation)
  121.                 var CertificatePinner = Java.use("com.squareup.okhttp.CertificatePinner");
  122.                 CertificatePinner.check.overload('java.lang.String', '[Ljava.security.cert.Certificate;').implementation = function(p0, p1) {
  123.                         // do nothing
  124.                         quiet_send("okhttp Called! [Certificate]");
  125.                         return;
  126.                 };
  127.                 CertificatePinner.check.overload('java.lang.String', 'java.util.List').implementation = function(p0, p1) {
  128.                         // do nothing
  129.                         quiet_send("okhttp Called! [List]");
  130.                         return;
  131.                 };
  132.         } catch (e) {
  133.                 quiet_send("com.squareup.okhttp not found");
  134.         }

  135.         /*** WebView Hooks ***/

  136.         /* frameworks/base/core/java/android/webkit/WebViewClient.java */
  137.         /* public void onReceivedSslError(Webview, SslErrorHandler, SslError) */
  138.         var WebViewClient = Java.use("android.webkit.WebViewClient");

  139.         WebViewClient.onReceivedSslError.implementation = function(webView, sslErrorHandler, sslError) {
  140.                 quiet_send("WebViewClient onReceivedSslError invoke");
  141.                 //执行proceed方法
  142.                 sslErrorHandler.proceed();
  143.                 return;
  144.         };

  145.         WebViewClient.onReceivedError.overload('android.webkit.WebView', 'int', 'java.lang.String', 'java.lang.String').implementation = function(a, b, c, d) {
  146.                 quiet_send("WebViewClient onReceivedError invoked");
  147.                 return;
  148.         };

  149.         WebViewClient.onReceivedError.overload('android.webkit.WebView', 'android.webkit.WebResourceRequest', 'android.webkit.WebResourceError').implementation = function() {
  150.                 quiet_send("WebViewClient onReceivedError invoked");
  151.                 return;
  152.         };

  153.         /*** JSSE Hooks ***/

  154.         /* libcore/luni/src/main/java/javax/net/ssl/TrustManagerFactory.java */
  155.         /* public final TrustManager[] getTrustManager() */
  156.         /* TrustManagerFactory.getTrustManagers maybe cause X509TrustManagerExtensions error  */
  157.         // var TrustManagerFactory = Java.use("javax.net.ssl.TrustManagerFactory");
  158.         // TrustManagerFactory.getTrustManagers.implementation = function(){
  159.         //     quiet_send("TrustManagerFactory getTrustManagers invoked");
  160.         //     return TrustManagers;
  161.         // }

  162.         var HttpsURLConnection = Java.use("javax.net.ssl.HttpsURLConnection");
  163.         /* libcore/luni/src/main/java/javax/net/ssl/HttpsURLConnection.java */
  164.         /* public void setDefaultHostnameVerifier(HostnameVerifier) */
  165.         HttpsURLConnection.setDefaultHostnameVerifier.implementation = function(hostnameVerifier) {
  166.                 quiet_send("HttpsURLConnection.setDefaultHostnameVerifier invoked");
  167.                 return null;
  168.         };
  169.         /* libcore/luni/src/main/java/javax/net/ssl/HttpsURLConnection.java */
  170.         /* public void setSSLSocketFactory(SSLSocketFactory) */
  171.         HttpsURLConnection.setSSLSocketFactory.implementation = function(SSLSocketFactory) {
  172.                 quiet_send("HttpsURLConnection.setSSLSocketFactory invoked");
  173.                 return null;
  174.         };
  175.         /* libcore/luni/src/main/java/javax/net/ssl/HttpsURLConnection.java */
  176.         /* public void setHostnameVerifier(HostnameVerifier) */
  177.         HttpsURLConnection.setHostnameVerifier.implementation = function(hostnameVerifier) {
  178.                 quiet_send("HttpsURLConnection.setHostnameVerifier invoked");
  179.                 return null;
  180.         };

  181.         /*** Xutils3.x hooks ***/
  182.         //Implement a new HostnameVerifier
  183.         var TrustHostnameVerifier;
  184.         try {
  185.                 TrustHostnameVerifier = Java.registerClass({
  186.                         name: 'org.wooyun.TrustHostnameVerifier',
  187.                         implements: [HostnameVerifier],
  188.                         method: {
  189.                                 verify: function(hostname, session) {
  190.                                         return true;
  191.                                 }
  192.                         }
  193.                 });

  194.         } catch (e) {
  195.                 //java.lang.ClassNotFoundException: Didn't find class "org.wooyun.TrustHostnameVerifier"
  196.                 quiet_send("registerClass from hostnameVerifier >>>>>>>> " + e.message);
  197.         }

  198.         try {
  199.                 var RequestParams = Java.use('org.xutils.http.RequestParams');
  200.                 RequestParams.setSslSocketFactory.implementation = function(sslSocketFactory) {
  201.                         sslSocketFactory = EmptySSLFactory;
  202.                         return null;
  203.                 }

  204.                 RequestParams.setHostnameVerifier.implementation = function(hostnameVerifier) {
  205.                         hostnameVerifier = TrustHostnameVerifier.$new();
  206.                         return null;
  207.                 }

  208.         } catch (e) {
  209.                 quiet_send("Xutils hooks not Found");
  210.         }

  211.         /*** httpclientandroidlib Hooks ***/
  212.         try {
  213.                 var AbstractVerifier = Java.use("ch.boye.httpclientandroidlib.conn.ssl.AbstractVerifier");
  214.                 AbstractVerifier.verify.overload('java.lang.String', '[Ljava.lang.String', '[Ljava.lang.String', 'boolean').implementation = function() {
  215.                         quiet_send("httpclientandroidlib Hooks");
  216.                         return null;
  217.                 }
  218.         } catch (e) {
  219.                 quiet_send("httpclientandroidlib Hooks not found");
  220.         }

  221.         /***
  222. android 7.0+ network_security_config TrustManagerImpl hook
  223. apache httpclient partly
  224. ***/
  225.         var TrustManagerImpl = Java.use("com.android.org.conscrypt.TrustManagerImpl");
  226.         // try {
  227.         //     var Arrays = Java.use("java.util.Arrays");
  228.         //     //apache http client pinning maybe baypass
  229.         //     //https://github.com/google/conscrypt/blob/c88f9f55a523f128f0e4dace76a34724bfa1e88c/platform/src/main/java/org/conscrypt/TrustManagerImpl.java#471
  230.         //     TrustManagerImpl.checkTrusted.implementation = function (chain, authType, session, parameters, authType) {
  231.         //         quiet_send("TrustManagerImpl checkTrusted called");
  232.         //         //Generics currently result in java.lang.Object
  233.         //         return Arrays.asList(chain);
  234.         //     }
  235.         //
  236.         // } catch (e) {
  237.         //     quiet_send("TrustManagerImpl checkTrusted nout found");
  238.         // }

  239.         try {
  240.                 // Android 7+ TrustManagerImpl
  241.                 TrustManagerImpl.verifyChain.implementation = function(untrustedChain, trustAnchorChain, host, clientAuth, ocspData, tlsSctData) {
  242.                         quiet_send("TrustManagerImpl verifyChain called");
  243.                         // Skip all the logic and just return the chain again :P
  244.                         //https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2017/november/bypassing-androids-network-security-configuration/
  245.                         // https://github.com/google/conscrypt/blob/c88f9f55a523f128f0e4dace76a34724bfa1e88c/platform/src/main/java/org/conscrypt/TrustManagerImpl.java#L650
  246.                         return untrustedChain;
  247.                 }
  248.         } catch (e) {
  249.                 quiet_send("TrustManagerImpl verifyChain nout found below 7.0");
  250.         }
  251.         // OpenSSLSocketImpl
  252.         try {
  253.                 var OpenSSLSocketImpl = Java.use('com.android.org.conscrypt.OpenSSLSocketImpl');
  254.                 OpenSSLSocketImpl.verifyCertificateChain.implementation = function(certRefs, authMethod) {
  255.                         quiet_send('OpenSSLSocketImpl.verifyCertificateChain');
  256.                 }

  257.                 quiet_send('OpenSSLSocketImpl pinning')
  258.         } catch (err) {
  259.                 quiet_send('OpenSSLSocketImpl pinner not found');
  260.         }
  261.         // Trustkit
  262.         try {
  263.                 var Activity = Java.use("com.datatheorem.android.trustkit.pinning.OkHostnameVerifier");
  264.                 Activity.verify.overload('java.lang.String', 'javax.net.ssl.SSLSession').implementation = function(str) {
  265.                         quiet_send('Trustkit.verify1: ' + str);
  266.                         return true;
  267.                 };
  268.                 Activity.verify.overload('java.lang.String', 'java.security.cert.X509Certificate').implementation = function(str) {
  269.                         quiet_send('Trustkit.verify2: ' + str);
  270.                         return true;
  271.                 };

  272.                 quiet_send('Trustkit pinning')
  273.         } catch (err) {
  274.                 quiet_send('Trustkit pinner not found')
  275.         }

  276.         try {
  277.                 //cronet pinner hook
  278.                 //weibo don't invoke

  279.                 var netBuilder = Java.use("org.chromium.net.CronetEngine$Builder");

  280.                 //https://developer.android.com/guide/topics/connectivity/cronet/reference/org/chromium/net/CronetEngine.Builder.html#enablePublicKeyPinningBypassForLocalTrustAnchors(boolean)
  281.                 netBuilder.enablePublicKeyPinningBypassForLocalTrustAnchors.implementation = function(arg) {

  282.                         //weibo not invoke
  283.                         console.log("Enables or disables public key pinning bypass for local trust anchors = " + arg);

  284.                         //true to enable the bypass, false to disable.
  285.                         var ret = netBuilder.enablePublicKeyPinningBypassForLocalTrustAnchors.call(this, true);
  286.                         return ret;
  287.                 };

  288.                 netBuilder.addPublicKeyPins.implementation = function(hostName, pinsSha256, includeSubdomains, expirationDate) {
  289.                         console.log("cronet addPublicKeyPins hostName = " + hostName);

  290.                         //var ret = netBuilder.addPublicKeyPins.call(this,hostName, pinsSha256,includeSubdomains, expirationDate);
  291.                         //this 是调用 addPublicKeyPins 前的对象吗? Yes,CronetEngine.Builder
  292.                         return this;
  293.                 };

  294.         } catch (err) {
  295.                 console.log('[-] Cronet pinner not found')
  296.         }
  297. });
复制代码
回复

使用道具 举报

 点击右侧快捷回复  

本版积分规则

小黑屋|资源共享吧 ( 琼ICP备2021005790号-1 )

GMT+8, 2024-4-20 03:51 , Processed in 0.055751 second(s), 12 queries , MemCached On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表