构造完整脚本如下:
- import frida, sys
-
- def on_message(message, data):
- if message['type'] == 'send':
- print("[*] {0}".format(message['payload']))
- else:
- print(message)
-
- jscode = """
- Java.perform(function () {
- var HttpClientSslHelper = Java.use('com.frankzhu.androidhttpsdemo.HttpClientSslHelper');
- var Log = Java.use('android.util.Log');
- HttpClientSslHelper.getSslContextByCustomTrustManager.implementation = function () {
- var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
- var SSLContext = Java.use('javax.net.ssl.SSLContext');
- var TrustManager = Java.registerClass({
- name: 'com.frankzhu.androidhttpsdemo.test',
- implements: [X509TrustManager],
- methods: {
- checkClientTrusted: function (chain, authType) {
- },
- checkServerTrusted: function (chain, authType) {
- Log.d("Frida Hook checkServerTrusted()", "Success!!!");
- send("Frida Hook checkServerTrusted() Success!!!");
- },
- getAcceptedIssuers: function () {
- return [];
- }
- }
- });
- // Prepare the TrustManagers array to pass to HttpClientSslHelper.sslContext.init()
- var TrustManagers = [TrustManager.$new()];
- send("Custom, Empty TrustManager ready");
- // Override the init method, specifying our new TrustManager
- var sslContext = SSLContext.getInstance("TLS");
- sslContext.init(null, TrustManagers, null);
- //return的值类型必须与原来的相同,否则会出现Error: Implementation for getSslContextByCustomTrustManager expected return value compatible with 'javax.net.ssl.SSLContext',同时导致应用崩溃
- //源码里有private static SSLContext sslContext = null;如果想通过this.sslContext使用该变量,一定要注意Hook的时机,要在sslContext变为对象后再Hook,这样就不会出现应用异常崩溃
- return sslContext;
- }
- });
- """
-
- process = frida.get_remote_device().attach('com.frankzhu.androidhttpsdemo')
- script = process.create_script(jscode)
- script.on('message', on_message)
- script.load()
- sys.stdin.read()
(编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|