听别人说Instagram没法抓包,于是这篇文章诞生了。
Instagram的防护做的很好,自己实现了一层SSL,直接过掉了r0capture等一些常见的工具,既然大佬的轮子用不了,那就只能自己动手了。
分析样本:Instagram 184.0.0.30.117
使用反编译工具导入,发现对变量名进行了混淆,先捋一下思路:
抓不到包,看不到关键字,那就只能根据经验猜测字段了,APP有登录功能,尝试搜索常见的API名称 login
,login/
,login"
,"login"
,"login
。定位到URI的处理点在附近查看有没有关于协议头,URL和HTTP的处理。找到底层Send函数,Hook,拿到HTTP报文。
一番查找之后,初步断定URI的处理在X.6s1
中
这里的参数生成的过程及算法暂时不去管,先抓到包才是首要的~
通过参数r3,追到了X.0uU
,翻看之后看到了一堆像是协议头的操作
又发现了https链接的格式化,Hook试了试,URL就出来了。
之后线索就断了,堆栈回溯看了都没什么发现,突破点是在查看交叉引用向上找,在X.222.A7c
,发现了一个用于打印错误的函数。
本着死马当活马医的想法,搜了一下builder.
,发现了可疑点
跟进去看,尝试Hook了一下,调用到了这个类
再Hook看了看调用的A02方法,看看有没有找歪~
既然没找错,看A02方法,发现JADX反编译不出来,换用GDA。
明显的协议头,明显的http,引用了apache开源的HTTP框架
executeWithDefragmentation
调用了sendHeadersWithBodyAndEom
继续往下看
已经到底了...再往下就是Native,再追下去没什么意义,所以下面就是最终的Hook了~
综上分析,只需要Hook com.facebook.proxygen.JniHandler.sendHeadersWithBodyAndEom
就能得到包数据了。
google了一下org.apache.http的源码:org.apache.http - Google
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 | function getClassName(obj) { const objClass = Java.use( "java.lang.Object" ).getClass. apply (obj); return Java.use( "java.lang.Class" ).getName. apply (objClass); } function getNetPack() { Java.perform(function(){ var jString = Java.use( "java.lang.String" ); var jHttpMessage = Java.use( "org.apache.http.HttpMessage" ); var JniHandler = Java.use( "com.facebook.proxygen.JniHandler" ); var jBasicHeader = Java.use( "org.apache.http.message.BasicHeader" ); JniHandler.sendRequestWithBodyAndEom.overload( 'org.apache.http.client.methods.HttpUriRequest' , '[B' , 'int' , 'int' ).implementation = function(jHttpUriRequest,bArr,i,i2){ console.log( "\n-------------------------Headers-------------------------\n" ); console.log(jhttpUriRequest.getURI() + "\n" ); var headers = Java.cast(jhttpUriRequest, jHttpMessage).getAllHeaders(); for (var i = 0 ; i < headers.length; i + + ) { if (getClassName(headers[i]) = = = "org.apache.http.message.BasicHeader" ) { console.log(Java.cast(headers[i], jBasicHeader).toString()); } else { console.log(headers[i].toString()); } } console.log( "\n" + jString.$new(bArr) + "\n" ); return this.sendRequestWithBodyAndEom(jHttpUriRequest,bArr,i,i2); } }) } setImmediate(function(){ setTimeout(getNetPack, 10 ); }) |