听别人说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中
45796a2342d262c63b655f4ce0a7ea27.png (61.44 KB, 下载次数: 0)
下载附件
2021-4-25 22:30 上传
这里的参数生成的过程及算法暂时不去管,先抓到包才是首要的~
通过参数r3,追到了X.0uU,翻看之后看到了一堆像是协议头的操作
0356dfb9c029aa1703f3e01e14ec5931.png (64.38 KB, 下载次数: 0)
下载附件
2021-4-25 22:30 上传
又发现了https链接的格式化,Hook试了试,URL就出来了。
601302481ddf62a44c1d51df9285c974.png (516.22 KB, 下载次数: 0)
下载附件
2021-4-25 22:32 上传
之后线索就断了,堆栈回溯看了都没什么发现,突破点是在查看交叉引用向上找,在X.222.A7c,发现了一个用于打印错误的函数。
b3b8d59818e17cb503c2fa519caaf586.png (50.93 KB, 下载次数: 0)
下载附件
2021-4-25 22:32 上传
本着死马当活马医的想法,搜了一下builder.,发现了可疑点
f78ebddde2ece72ef0ae6296bab92963.png (53.6 KB, 下载次数: 0)
下载附件
2021-4-25 22:32 上传
跟进去看,尝试Hook了一下,调用到了这个类
fa157cf4396d67c9bfac1f68535357b5.png (375.49 KB, 下载次数: 0)
下载附件
2021-4-25 22:32 上传
再Hook看了看调用的A02方法,看看有没有找歪~
19df90a60e4050faec7ecf24e132e095.png (740.8 KB, 下载次数: 0)
下载附件
2021-4-25 22:30 上传
既然没找错,看A02方法,发现JADX反编译不出来,换用GDA。
f266cc0e4df97c889d48eb749f0576ba.png (81.64 KB, 下载次数: 0)
下载附件
2021-4-25 22:32 上传
明显的协议头,明显的http,引用了apache开源的HTTP框架
7dff15220ac5e613bea299c51f067f3b.png (89.67 KB, 下载次数: 0)
下载附件
2021-4-25 22:32 上传
executeWithDefragmentation调用了sendHeadersWithBodyAndEom
3f231760682fd5c54c79de33d5233747.png (67.36 KB, 下载次数: 0)
下载附件
2021-4-25 22:35 上传
继续往下看
4aec7bac4911705be36a5b38286d17ab.png (87.35 KB, 下载次数: 0)
下载附件
2021-4-25 22:31 上传
已经到底了...再往下就是Native,再追下去没什么意义,所以下面就是最终的Hook了~
HOOK打印HTTP报文
综上分析,只需要Hook com.facebook.proxygen.JniHandler.sendHeadersWithBodyAndEom 就能得到包数据了。
google了一下org.apache.http的源码:org.apache.http - Google
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
1dbe159d8ddde227a078bbe8ff71af20.png (177.04 KB, 下载次数: 0)
下载附件
2021-4-25 22:30 上传
你以为就这样完了?
没错,就这样完了。response暂时没找到简单的办法去Hook,先咕咕咕了
题外话
看了看enc_password的加密,看起来是RSA+AES-GCM,满心欢喜。
仔细一看native层调用,动态加载so… dump出来一看是vmp,mmp…