Bootstrap

利用Hook技术实现对Instagram的抓包

利用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);

})

 

;