Repository navigation
Expand file tree
/
Copy pathssl_intercept.js
More file actions
112 lines (98 loc) · 3.98 KB
/
Copy pathssl_intercept.js
File metadata and controls
112 lines (98 loc) · 3.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/**
* SiDIVA / SiDOMPUL - SSL Pinning Bypass + Traffic Capture
*
* Usage (MUST use spawn mode):
* frida -U -f com.toko.xl -l ssl_intercept.js --no-pause
*
* Captures all HTTPS requests/responses. Output goes to stdout.
* HPACK-encoded H2 frames → decode with hpack_decode.py
*/
'use strict';
// ─── TrustManager bypass ──────────────────────────────────────────────────────
Java.perform(function () {
// 1. OkHttp CertificatePinner bypass
try {
var CertPinner = Java.use('okhttp3.CertificatePinner');
CertPinner.check.overload('java.lang.String', 'java.util.List').implementation = function (h, l) {
console.log('[SSL] CertificatePinner.check bypassed: ' + h);
};
CertPinner.check.overload('java.lang.String', '[Ljava.security.cert.Certificate;').implementation = function (h, c) {
console.log('[SSL] CertificatePinner.check(cert[]) bypassed: ' + h);
};
} catch (e) { console.log('[SSL] OkHttp3 CertPinner: ' + e); }
// 2. TrustManager bypass
try {
var TrustManagerImpl = Java.use('com.android.org.conscrypt.TrustManagerImpl');
TrustManagerImpl.verifyChain.implementation = function (u, r, h, a, o, s) {
return u;
};
} catch (e) { console.log('[SSL] TrustManagerImpl: ' + e); }
// 3. X509TrustManager
try {
var SSLContext = Java.use('javax.net.ssl.SSLContext');
var TrustManager = Java.use('javax.net.ssl.X509TrustManager');
var TrustManagerImpl2 = Java.registerClass({
name: 'com.sidiva.FakeTrustManager',
implements: [TrustManager],
methods: {
checkClientTrusted: function (chain, authType) {},
checkServerTrusted: function (chain, authType) {},
getAcceptedIssuers: function () { return []; },
},
});
SSLContext.init.implementation = function (km, tm, sr) {
SSLContext.init.call(this, km, [TrustManagerImpl2.$new()], sr);
};
} catch (e) { console.log('[SSL] X509TrustManager: ' + e); }
// 4. Conscrypt setHostname
try {
var ConscryptSocket = Java.use('com.android.org.conscrypt.ConscryptFileDescriptorSocket');
ConscryptSocket.setHostname.implementation = function (h) {};
} catch (e) {}
// 5. WebViewClient (for WebView pinning)
try {
var WebViewClient = Java.use('android.webkit.WebViewClient');
WebViewClient.onReceivedSslError.implementation = function (view, handler, error) {
handler.proceed();
};
} catch (e) {}
console.log('[SSL] Pinning bypass active.');
});
// ─── SSL KeyLog (SSLKEYLOGFILE equivalent via OpenSSL hook) ───────────────────
var ssl_read = Module.findExportByName('libssl.so', 'SSL_read');
var ssl_write = Module.findExportByName('libssl.so', 'SSL_write');
var write_counter = 0;
if (ssl_read) {
Interceptor.attach(ssl_read, {
onLeave: function (retval) {
var len = retval.toInt32();
if (len <= 0) return;
var ssl = this.context.x0 || this.context.r0;
var buf = this.context.x1 || this.context.r1;
if (buf.isNull()) return;
try {
var data = buf.readByteArray(Math.min(len, 4096));
var hex = Array.from(new Uint8Array(data)).map(b => b.toString(16).padStart(2, '0')).join('');
send({ type: 'ssl_read', len: len, hex: hex });
} catch (e) {}
},
});
}
if (ssl_write) {
Interceptor.attach(ssl_write, {
onEnter: function (args) {
var len = args[2].toInt32();
if (len <= 0) return;
var buf = args[1];
if (buf.isNull()) return;
try {
var data = buf.readByteArray(Math.min(len, 4096));
var hex = Array.from(new Uint8Array(data)).map(b => b.toString(16).padStart(2, '0')).join('');
var w = write_counter++;
console.log('W' + w + ':' + hex);
send({ type: 'ssl_write', w: w, len: len, hex: hex });
} catch (e) {}
},
});
}
console.log('[SSL] Intercept hooks installed. ssl_read=' + ssl_read + ' ssl_write=' + ssl_write);