抓包应该是我们逆向的第一步,只有先抓到包,才能决定我们是否要进行脱壳、逆向。万一他没有加密、万一数据不是我们想要的那岂不是白忙活了。但是目前很APP都设置了门槛,比如新版的抖音、淘宝、天眼查等挂上代理就直接无数据或者就显示不出你想要的数据。还没有开始就直接结束了,让人懊恼不已。没办法只能上科技与狠活了。
这个一般我们设置好IP和端口,导入证书不出意外是没问题。常见的抓包工具fiddler、charles、Burpsuite、httpcanary
针对双向证书绑定的APP,打印和保存证书,再导入到抓包工具中。
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 |
function hook_KeyStore_load() {
Java.perform(function () {
var ByteString = Java.use( "com.android.okhttp.okio.ByteString" ); var myArray = new Array( 1024 ); var i = 0 for (i = 0 ; i < myArray.length; i + + ) {
myArray[i] = 0x0 ; } var buffer = Java.array( 'byte' , myArray); var StringClass = Java.use( "java.lang.String" ); var KeyStore = Java.use( "java.security.KeyStore" ); KeyStore.load.overload( 'java.security.KeyStore$LoadStoreParameter' ).implementation = function (arg0) {
/ / 可以在此打印调用栈观察信息 console.log( "KeyStore.load1:" , arg0); this.load(arg0); }; KeyStore.load.overload( 'java.io.InputStream' , '[C' ).implementation = function (arg0, arg1) {
/ / 可以在此打印调用栈观察信息 console.log( "KeyStore.load2:" , arg0, arg1 ? StringClass.$new(arg1) : null); if (arg0) {
var file = Java.use( "java.io.File" ).$new( "/sdcard/Download/" + String(arg0) + ".p12" ); var out = Java.use( "java.io.FileOutputStream" ).$new( file ); var r; while ((r = arg0.read( buffer )) > 0 ) {
out.write( buffer , 0 , r) } console.log( "save success!" ) out.close() } this.load(arg0, arg1); }; console.log( "hook_KeyStore_load..." ); }); } |
将证书导出后,charles进行证书配置。

ssl pinning 证书在代码中的额外校验:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function hook_ssl() {
Java.perform(function () {
var ClassName = "com.android.org.conscrypt.Platform" ; var Platform = Java.use(ClassName); var targetMethod = "checkServerTrusted" ; var len = Platform[targetMethod].overloads.length; console.log( len ); for (var i = 0 ; i < len ; + + i) {
Platform[targetMethod].overloads[i].implementation = function () {
console.log( "class:" , ClassName, "target:" , targetMethod, " i:" , i, arguments); } } }); } |
objection 中的 Bypass SSL pinning hook的证书种类:
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 |
sslContextEmptyTrustManager const x509TrustManager: X509TrustManager = Java.use( "javax.net.ssl.X509TrustManager" ); const sSLContext: SSLContext = Java.use( "javax.net.ssl.SSLContext" ); okHttp3CertificatePinnerCheck const certificatePinner: CertificatePinner = Java.use( "okhttp3.CertificatePinner" ); okHttp3CertificatePinnerCheckOkHttp const certificatePinner: CertificatePinner = Java.use( "okhttp3.CertificatePinner" ); appceleratorTitaniumPinningTrustManager const pinningTrustManager: PinningTrustManager = Java.use( "appcelerator.https.PinningTrustManager" ); / / Android 7 + TrustManagerImpl.verifyChain() trustManagerImplVerifyChainCheck const trustManagerImpl: TrustManagerImpl = Java.use( "com.android.org.conscrypt.TrustManagerImpl" ); const TrustManagerImplverifyChain = trustManagerImpl.verifyChain; / / Android 7 + TrustManagerImpl.checkTrustedRecursive() trustManagerImplCheckTrustedRecursiveCheck const trustManagerImpl: TrustManagerImpl = Java.use( "com.android.org.conscrypt.TrustManagerImpl" ); const TrustManagerImplcheckTrustedRecursive = trustManagerImpl.checkTrustedRecursive; phoneGapSSLCertificateChecker const sslCertificateChecker: SSLCertificateChecker = Java.use( "nl.xservices.plugins.SSLCertificateChecker" ); |
DroidSSLUnpinning 这个工具是WooyunDota瘦蛟舞大佬总结的,github上有源码,以下我也贴出来了,他总结了一些常见的证书过检测的方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |