首页
论坛
课程
招聘
[原创]利用Hook技术实现对Instagram的抓包
2021-4-25 20:26 9300

[原创]利用Hook技术实现对Instagram的抓包

2021-4-25 20:26
9300

利用Hook技术实现Instagram抓包

前言

听别人说Instagram没法抓包,于是这篇文章诞生了。

 

Instagram的防护做的很好,自己实现了一层SSL,直接过掉了r0capture等一些常见的工具,既然大佬的轮子用不了,那就只能自己动手了。

 

分析样本:Instagram 184.0.0.30.117

思路

使用反编译工具导入,发现对变量名进行了混淆,先捋一下思路:

 

抓不到包,看不到关键字,那就只能根据经验猜测字段了,APP有登录功能,尝试搜索常见的API名称 loginlogin/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打印HTTP报文

综上分析,只需要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);
})

 

你以为就这样完了?

 

没错,就这样完了。(逃~)

题外话

看了看enc_password的加密,看起来是RSA+AES-GCM,满心欢喜。

 

仔细一看native层调用,动态加载so… dump出来一看是vmp,mmp…


第五届安全开发者峰会(SDC 2021)10月23日上海召开!限时2.5折门票(含自助午餐1份)

最后于 2021-4-25 20:44 被sunfishi编辑 ,原因: 格式问题
收藏
点赞5
打赏
分享
最新回复 (15)
雪    币: 239
活跃值: 活跃值 (306)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
乐不思蜀1 活跃值 2021-4-26 16:40
2
0
支持!
雪    币: 182
活跃值: 活跃值 (92)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
eviliori 活跃值 2021-4-26 17:18
3
0
支持~
雪    币: 380
活跃值: 活跃值 (622)
能力值: ( LV9,RANK:186 )
在线值:
发帖
回帖
粉丝
KwaiChing 活跃值 2021-4-26 19:07
4
0
Response呢?
雪    币: 2425
活跃值: 活跃值 (1540)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
sunfishi 活跃值 1 2021-4-26 20:38
5
0
KwaiChing Response呢?
java层没找到好办法去hook
雪    币: 380
活跃值: 活跃值 (622)
能力值: ( LV9,RANK:186 )
在线值:
发帖
回帖
粉丝
KwaiChing 活跃值 2021-4-27 10:30
6
0
so在哪返回,onResponse 只有Header
雪    币: 249
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
@=llfly 活跃值 2021-4-27 16:16
7
0
感谢分享!!
"看A02方法,发现JADX反编译不出来,换用GDA"    
GDA比JADX反编译能力强? (没用过GDA)
雪    币: 2425
活跃值: 活跃值 (1540)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
sunfishi 活跃值 1 2021-4-27 17:10
8
0
@=llfly 感谢分享!! "看A02方法,发现JADX反编译不出来,换用GDA" GDA比JADX反编译能力强? (没用过GDA)
各有千秋把,目前看来GDA的反编译能力还是不错的
雪    币: 2425
活跃值: 活跃值 (1540)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
sunfishi 活跃值 1 2021-4-27 17:11
9
0
KwaiChing so在哪返回,onResponse 只有Header
没有继续研究下去,so使用了vmp,能力不够
雪    币: 2093
活跃值: 活跃值 (1189)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caolinkai 活跃值 2021-5-8 09:12
10
0
sunfishi 没有继续研究下去,so使用了vmp,能力不够
Response呢?
雪    币: 27
活跃值: 活跃值 (320)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
呼吸24K纯氧 活跃值 2021-5-8 09:32
11
1
Instagram 可以通过JADX搜索 "ig_android_whitehat_options_universe" 定位强制开启`白帽模式`抓包。
雪    币: 220
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
樟树. 活跃值 2021-5-8 09:51
12
0
用xposed来hook某方法,能不能知道是哪里调用了该方法 
雪    币: 25
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
万里星河 活跃值 2021-5-8 13:14
13
0
Instagram是啥
雪    币: 3500
活跃值: 活跃值 (523)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
smartdon 活跃值 1 2021-5-10 10:32
14
0
樟树. 用xposed来hook某方法,能不能知道是哪里调用了该方法
可以,你new一个异常,然后通过异常获取调用栈就行了
雪    币: 2425
活跃值: 活跃值 (1540)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
sunfishi 活跃值 1 2021-5-10 12:05
15
0

谢谢大佬们指点

最后于 2021-5-10 13:09 被sunfishi编辑 ,原因:
雪    币: 183
活跃值: 活跃值 (567)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
DirtyAngle 活跃值 2021-6-25 00:13
16
0
patch掉Facebook的proxygen::SSLVerification::verifyWithMetrics函数即可,
java层各种verify无用。
之装逼不透露具体细节
qq ⑦三司儿48五3Ⅶ
游客
登录 | 注册 方可回帖
返回