成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Frida應用基礎及APP https證書驗證破解

安全 應用安全
Frida是適用于開發人員、逆向工程師和安全研究人員的輕量級Hook工具,它允許將JavaScript代碼或庫注入Windows、macOS、GNU / Linux、iOS、Android和QNX上的本機應用程序。

一、Frida簡介

1. 基礎介紹

Frida是適用于開發人員、逆向工程師和安全研究人員的輕量級Hook工具,它允許將JavaScript代碼或庫注入Windows、macOS、GNU / Linux、iOS、Android和QNX上的本機應用程序。此外, Frida還提供了一些基于Frida API構建的簡單工具。

[[266929]]

Frida的四大特點:

  • 可編寫腳本:將腳本注入黑盒進程,無須源代碼即可劫持任何功能函數,監視加密API或跟蹤私有應用程序代碼;然后編輯,點擊保存,即可查看結果,不需要進行編譯或重新啟動程序。
  • 可移植的:適用于Window、macOS、GNU / Linux、iOS、Android和QNX。從npm安裝綁定的Node.js,從PyPI獲取Python包,或通過其Swift綁定、.NET綁定、Qt / Qml綁定或C API使用Frida。
  • 免費的:Frida是并且將永遠是免費軟件(免費自由)。
  • 經過實戰檢驗:現在安全人員正在使用Frida對大規模移動應用進行快速、深入的分析。 Frida擁有全面的測試套件,并經過多年的嚴格測試,涵蓋了廣泛的用例。

Frida訪問地址:https://github.com/frida/frida。

2. 與其他Hook工具的對比

(1) Xposed的優缺點

  • 優點:在編寫Java層hook插件的時候非常好用,這一點完全優越于FridaSubstrateCydia,因為它也是Android項目,可以直接編寫Java代碼調用各類api進行操作,而且可以安裝到手機上直接使用。
  • 缺點:配置安裝環境繁瑣,兼容性差,在Hook底層的時候就很無助了。

(2) Frida的優缺點

  • 優點:配置環境簡單,操作也很便捷,對于破解者來說開發階段非常好用。支持Java層和Native層的hook操作,只是在Native層hook如果是非基本類型的話操作有點麻煩。
  • 缺點:因為它只適合破解者在開發階段使用,因此它無法像Xposed那樣用于實踐。比如寫一個微信外掛,用Frida寫肯定不行,因為它無法在手機端運行。

(3) SubstrateCydia的優缺點

  • 優點:和Xposed類似可以運行在手機端。支持Java層和Native層的hook操作,但是Java層hook不怎么常用,用得比較多的是Native層的hook操作,因為它也是Android工程,可以調用系統api,操作更為方便。
  • 缺點:和Xposed一樣安裝配置環境煩瑣,兼容性差。

以上3個工具可以說是現在用得最多的hook工具了,總結一句話就是,寫Java層hook還是Xposed方便,寫Native層hook適合用SubstrateCydia,而對于處在開發階段的破解者來說,則還是Frida最靠譜。

二、Frida Hook示例

1. 連接Android設備

(1)需要一臺已經root的Android設備(可以使用Android模擬器),支持4.2~6.0版本。

(2)需要使用來自Android SDK中的adb工具連接Android設備。

(3)在https://github.com/frida/frida/releases中下載相應的frida-server應用,示例使用夜神Android模擬器4.4版本,下載的frida服務端是frida-server-12.2.16-android-x86.xz。

(4)啟動夜神Android模擬器4.4版本,運行adb devices命令,即可成功連接Android設備,如圖2.1所示。

連接 Android 設備

圖2.1連接 Android 設備

(5)運行如下命令,將frida-server復制到Android設備上,提升權限并運行。

  1. $ adb push frida-server /data/local/tmp/  
  2. $ adb shell "chmod 777 /data/local/tmp/frida-server" 
  3. $ adb shell "/data/local/tmp/frida-server &" 

(6)運行adb shell ps命令,查看frida-server已成功運行,如圖2.2所示。

Frida-Server 成功運行

圖2.2 Frida-Server 成功運行

(7)運行adb shell netstat命令,檢查frida-server監聽端口,默認為27042,如圖2.3所示。

端口監聽成功

圖2.3 端口監聽成功

(8)運行adb forward tcp:27042 tcp:27042命令,把Android設備端口轉發到PC端。

(9)運行frida-ps –R命令,即可查詢Android設備當前運行進程,至此連接Android設備成功(見圖2.4)。另外,也可以直接通過USB將Android設備與PC端連接,運行frida-ps –U即可測試是否連接成功。

Android 設備連接成功檢測

圖2.4  Android 設備連接成功檢測

2. HTTPS單向認證強校驗Hook示例

本次示例通過在本地搭建Tomcat + SSL自簽名證書環境,使用一個開源的Android HTTPS雙向認證項目:

https://github.com/Frank-Zhu/AndroidHttpsDemo ,對其中部分代碼進行修改后重新編譯,構建本次測試的 APP應用。

(1) 基本原理

想要繞過證書鎖定抓明文包就需要先知道APP是如何進行鎖定操作的,然后再針對其操作進行注入解鎖。

Android客戶端關于證書處理的邏輯按照安全等級分類,如表2.1所示。

Android客戶端證書處理的安全等級分類

表2.1 Android客戶端證書處理的安全等級分類

Apache http client 因為從api23起被Android拋棄,因此使用率較低。目前更多使用的是HttpURLConnection類或第三方庫OKhttp3.0進行HTTPS通信。其中OKhttp3.0的部分運用與HttpURLConnection相同,客戶端都可以通過實現X509TrustManager接口的checkServerTrusted方法,將服務器證書與APP預埋證書做對比,來完成強校驗。此外,也可以再通過實現HostnameVerifier接口的verify方法,校驗服務器證書中的一般名稱(CN)是否與域名相符。通過使用上述方法,完成客戶端對服務端的證書強校驗。

(2) 應用分析

由于這次是自編譯的文件,就不通過APK反編譯等方法查看代碼了,直接看主要通信類HttpClientSslHelper的源碼。

  1. public class HttpClientSslHelper { 
  2.     public static boolean isServerTrusted1 = true;  //強校驗關鍵參數 
  3.     private static SSLContext sslContext = null
  4.     public static OkHttpClient getSslOkHttpClient(Context context) { 
  5.         OkHttpClient.Builder builder = new OkHttpClient.Builder(); 
  6.         builder.sslSocketFactory(getSslContextByCustomTrustManager(context).getSocketFactory()) 
  7.                 .hostnameVerifier(new HostnameVerifier() { 
  8.                     @Override  //實現自定義的HostnameVerifier 對象的verify校驗方法 
  9.                     public boolean verify(String hostname, SSLSession session) { 
  10.                         Log.d("HttpClientSslHelper", "hostname = " + hostname); 
  11.                         if ("192.168.96.1".equals(hostname)) { 
  12.                             //根據isServerTrusted1的值進行校驗,若為True,則校驗成功,執行后續連接 
  13.                             return isServerTrusted1; 
  14.                         } else { 
  15.                             //由于是實驗環境,if語句總為真,不會執行else語句 
  16.                             HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier(); 
  17.                             return hv.verify("localhost", session); 
  18.                         } 
  19.                     } 
  20.                 }); 
  21.         return builder.build(); 
  22.     } 
  23.  
  24.     public static SSLContext getSslContextByCustomTrustManager(Context context) { 
  25.         if (sslContext == null) { 
  26.             try { 
  27.                 CertificateFactory cf = CertificateFactory.getInstance("X.509","BC"); 
  28.                 InputStream caInput = new BufferedInputStream(context.getResources().getAssets().open("server.cer")); 
  29.                 final Certificate ca; 
  30.                 try { 
  31.                     ca = cf.generateCertificate(caInput); 
  32.                 } finally { 
  33.                     caInput.close(); 
  34.                 } 
  35.                 sslContext = SSLContext.getInstance("TLS"); 
  36.                 //自定義X509TrustManager接口的checkClientTrusted、checkServerTrusted和getAcceptedIssuers方法 
  37.                 sslContext.init(null, new X509TrustManager[]{new X509TrustManager() { 
  38.                     public void checkClientTrusted(X509Certificate[] chain, 
  39.                                                    String authType) throws CertificateException { 
  40.                         Log.d("HttpClientSslHelper", "checkClientTrusted --> authType = " + authType); 
  41.                         //校驗客戶端證書 
  42.                     } 
  43.  
  44.                     public void checkServerTrusted(X509Certificate[] chain, 
  45.                                                    String authType) throws CertificateException { 
  46.                         Log.d("HttpClientSslHelper", "checkServerTrusted --> authType = " + authType); 
  47.                         //校驗服務器證書 
  48.                         for (X509Certificate cert : chain) { 
  49.                             cert.checkValidity(); 
  50.                             try { 
  51.                                  //關鍵點,用APP中內置的服務端證書server.cer來校驗網絡連接中服務器頒發的證書 
  52.                                 cert.verify(ca.getPublicKey()); 
  53.                             } catch (NoSuchAlgorithmException | InvalidKeyException | NoSuchProviderException | SignatureException e) { 
  54.                                 e.printStackTrace(); 
  55.                                 //校驗失敗,則更改isServerTrusted1值為false 
  56.                                 isServerTrusted1 = false
  57.                             } 
  58.                         } 
  59.                     } 
  60.  
  61.                     public X509Certificate[] getAcceptedIssuers() { 
  62.                         return new X509Certificate[0]; 
  63.                     } 
  64.                 }}, null); 
  65.             } catch (Exception e) { 
  66.                 e.printStackTrace(); 
  67.             } 
  68.         } 
  69.         return sslContext; 
  70.     } 

由上可知,將HttpClientSslHelper類的getSslContextByCustomTrustManager方法重寫,重新實現checkServerTrusted方法,讓其不修改isServerTrusted1的值,即可繞過證書強校驗。

(3) 開始Hook

重新實現checkServerTrusted方法

構造完整腳本如下:

  1. import frida, sys 
  2.   
  3. def on_message(message, data): 
  4.     if message['type'] == 'send': 
  5.         print("[*] {0}".format(message['payload'])) 
  6.     else: 
  7.         print(message) 
  8.   
  9. jscode = ""
  10. Java.perform(function () { 
  11.     var HttpClientSslHelper = Java.use('com.frankzhu.androidhttpsdemo.HttpClientSslHelper'); 
  12.     var Log = Java.use('android.util.Log'); 
  13.     HttpClientSslHelper.getSslContextByCustomTrustManager.implementation = function () { 
  14.         var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager'); 
  15.         var SSLContext = Java.use('javax.net.ssl.SSLContext'); 
  16.         var TrustManager = Java.registerClass({ 
  17.             name: 'com.frankzhu.androidhttpsdemo.test', 
  18.             implements: [X509TrustManager], 
  19.             methods: { 
  20.                 checkClientTrusted: function (chain, authType) { 
  21.                 }, 
  22.                 checkServerTrusted: function (chain, authType) { 
  23.                     Log.d("Frida Hook checkServerTrusted()", "Success!!!"); 
  24.                     send("Frida Hook checkServerTrusted() Success!!!"); 
  25.                 }, 
  26.                 getAcceptedIssuers: function () { 
  27.                     return []; 
  28.                 } 
  29.             } 
  30.         }); 
  31.         // Prepare the TrustManagers array to pass to HttpClientSslHelper.sslContext.init() 
  32.         var TrustManagers = [TrustManager.$new()]; 
  33.         send("Custom, Empty TrustManager ready"); 
  34.         // Override the init method, specifying our new TrustManager 
  35.         var sslContext = SSLContext.getInstance("TLS"); 
  36.         sslContext.init(null, TrustManagers, null); 
  37.         //return的值類型必須與原來的相同,否則會出現Error: Implementation for getSslContextByCustomTrustManager expected return value compatible with 'javax.net.ssl.SSLContext',同時導致應用崩潰 
  38.         //源碼里有private static SSLContext sslContext = null;如果想通過this.sslContext使用該變量,一定要注意Hook的時機,要在sslContext變為對象后再Hook,這樣就不會出現應用異常崩潰 
  39.         return sslContext; 
  40.     } 
  41. }); 
  42. """ 
  43.   
  44. process = frida.get_remote_device().attach('com.frankzhu.androidhttpsdemo') 
  45. script = process.create_script(jscode) 
  46. script.on('message', on_message) 
  47. script.load() 
  48. sys.stdin.read() 

測試步驟:

  • 使用Burpsuite,設置PC端和Android端的代理;
  • 打開測試APP,運行上述Python腳本;
  • 點擊APP網絡測試按鈕,發送網絡請求(一定要在第一次點擊按鈕前,運行Python腳本)。

未用Frida Hook的結果如圖2.5、圖2.6所示。

連接報錯

圖2.5  連接報錯

HTTPS 抓包失敗

圖2.6  HTTPS 抓包失敗

使用Frida Hook后的結果如圖2.7~圖2.9所示。

腳本運行成功

圖2.7  腳本運行成功

運行日志

圖2.8  運行日志

HTTPS 證書驗證破解成功

圖2.9   HTTPS 證書驗證破解成功

【本文為51CTO專欄作者“安全加”原創稿件,轉載請聯系原作者】

戳這里,看該作者更多好文

 

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2012-01-09 09:40:20

App Store破解應用蘋果

2023-11-14 14:38:53

2009-02-09 14:17:36

2020-09-24 07:51:45

HTTPS證書接口

2017-02-16 08:53:42

2013-10-15 10:30:33

2011-08-22 14:04:52

2015-11-09 10:09:12

2012-05-21 10:39:52

RAID

2014-04-08 11:28:52

驗證碼破解

2011-01-04 16:16:59

2020-05-20 22:37:42

HTTPSSSL雙向驗證

2016-10-24 17:47:38

2014-12-31 10:04:44

2025-04-17 04:00:00

2022-03-07 09:00:00

HTTPS證書中間件

2010-02-01 13:07:21

2013-01-17 15:51:42

Android開發應用程序組件

2010-09-08 13:47:34

2015-10-23 14:12:41

PowerDesign安裝步驟圖解
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一级片成人 | 99精品在线| 国产福利91精品 | 欧美一级黄色片在线观看 | 日韩伦理一区二区 | 亚洲欧美日韩系列 | 精品国产伦一区二区三区观看体验 | 欧美电影在线观看网站 | 色爽女 | 亚州一区二区三区 | 美女国内精品自产拍在线播放 | 性欧美hd | 国产精品久久久久久久久久三级 | 国产高清视频 | 中文字幕 在线观看 | 福利一区在线观看 | 亚洲成人精品 | www.操com| 久久免费视频网 | 美国av毛片 | 一区二区三区在线播放 | 精品国产乱码久久久久久图片 | 成人午夜视频在线观看 | 97人澡人人添人人爽欧美 | 国产99久久精品一区二区300 | 亚洲天堂av一区 | 免费性视频 | 伊人免费观看视频 | 亚洲电影一区 | 草草在线观看 | 精品成人一区 | 91免费版在线观看 | 欧美视频一区二区三区 | 九九伊人sl水蜜桃色推荐 | 亚洲一区久久 | 日韩精品视频一区二区三区 | 成人在线视频免费观看 | 精品日韩 | 在线一区视频 | 欧美a级成人淫片免费看 | 日本精品久久久久久久 |