psych1 发表于 2021-3-29 19:27

抓包问题进阶分析

本帖最后由 psych1 于 2021-3-29 19:27 编辑

## 前言
发现距离上一篇文章已经过了好久了,给抓包做一个终结篇吧,建议配合[上一篇](https://www.52pojie.cn/thread-1213657-1-1.html)食用。
## 各类抓包工具介绍
首先说一下市面上常见的Android抓包工具,Fiddler、Charles、HttpCanary、WireShark。

## Wireshark
首先说一下Wireshark,因为他是一款功能十分强大的网络数据分析工具,可以显示网络封包的详细信息,正因为如此,我们在日常分析Android协议的时候反而用到不多,因为它相对于Fiddler跟Charles,它会展示服务器与客户端的每次“交流”,包括详细的握手流程,重复、缺失、乱序的TCP请求,重连请求等都可以看到。但是正因为它太过于详细,而我们每一次只需要分析某一个get或者post请求,所以一般情况下使用的频率不高。

## Fiddler
Fiddler也是一款强大的工具,但是Fiddler是作用于应用层,使用时需要配置全局代{过}{滤}理,很容易被检测,容易被绕过。举个例子,假如说APP使用的是Okhttp框架,那我们只需要在源代码上加入`proxy(Proxy.NO_PROXY)`就可以让Fiddler抓不到包了,当然这个时候你可以hook掉它,但是要知道,我们使用工具的初衷就是为了更方便的分析,再来一次hook就显得没有必要了。

## Charles
Charles是我比较推崇的,但是它其实也是有所不足的,~~第一个原因就是它收费~~。其次它作用的地方在会话层,对于某些包还是抓不到的。一般使用都是Charles+postern。使它作用在网络层。这样我们在抓包阶段就比较轻松了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210329162443167.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlX3BzeWNoZQ==,size_16,color_FFFFFF,t_70)

## HttpCanary
功能强大,关于他的各种优点论坛都有文章介绍,当然也有一点点问题,这个东西需要自己适配。不过多介绍了就。

# 混淆型抓包
首先是混淆型抓包介绍,为了对抗JustTrustMe,开发人员可以使用混淆类名和函数名的方式使得JustTrustMe无法抓到包,这个时候我们就需要找到混淆的类进行hook然后再使用JustTrustMe就可以抓到包了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210329164456639.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlX3BzeWNoZQ==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210329164526922.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlX3BzeWNoZQ==,size_16,color_FFFFFF,t_70)
可以看出这个APP就使用了okhttp框架,而且进行了混淆。
这是okhttp所用到的方法来避免被抓包,一般常用的就是证书锁定`.certificatePinner(CPinner)`,它校验的方法一般就是它下面的check方法,我们需要找到这个check方法。

![在这里插入图片描述](https://img-blog.csdnimg.cn/2021032916411811.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlX3BzeWNoZQ==,size_16,color_FFFFFF,t_70)
这个时候我们就需要去找他的底层特征函数,特征代码进行搜索。
进入CertificatePinner类,找到他的Check方法
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210329164226454.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlX3BzeWNoZQ==,size_16,color_FFFFFF,t_70)
我们可以搜索一下特征代码进行位置定位。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210329165036431.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlX3BzeWNoZQ==,size_16,color_FFFFFF,t_70)
显而易见,就是第一个。我们进去看一下
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021032916514997.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlX3BzeWNoZQ==,size_16,color_FFFFFF,t_70)
这就很简单了,直接hook该方法就可以了。


```java
    Java.perform(function(){
   
      var g = Java.use('okhttp3.g');
      g.a.overload('java.lang.String', 'java.util.List').implementation = function(a, b){
            console.log('checkFunc is called: ', a);
      }

    });
```

# 加固型抓包
加固型APP由于被加壳了,找到关键代码的想法是不太可能实现的,这个时候我们需要找到其他的类。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210329172101563.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlX3BzeWNoZQ==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210329172118668.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlX3BzeWNoZQ==,size_16,color_FFFFFF,t_70)
这个时候我么需要找到attachBaseContext类(一般都是这个类),在这个类里面会有Context,可以获取classLoader,通过它得到的都是壳的classLoader。![在这里插入图片描述](https://img-blog.csdnimg.cn/20210329172232936.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlX3BzeWNoZQ==,size_16,color_FFFFFF,t_70)
所以我们要hook这个类。

```java

Java.perform(function(){
    var CertificatePinner = Java.use(okhttp3.CertificatePinner);
    console.log('certificatePinner: ',CertificatePinner);

});


Java.perform(function(){
var StubApp = Java.use(com.stub.StubApp);
StubApp.attachBaseContext.implementnation= function (context){
    this.attachBaseContext(context);
    var classLoader = context.getClassLoader();
    console.log('classLoader: ', classLoader);
    Java.classFactory.loader = classLoader;//注意这一步需要加上(建议加上),需要将classFactory覆盖

    var CertificatePinner = Java.use(okhttp3.CertificatePinner);
    console.log('certificatePinner: ',CertificatePinner);
}
});
```

对于加固型的APP,收集了一些hook方法,在文末有惊喜!

## 双向验证型抓包
双向验证型APP,这个时候服务器会去校验客户端的证书,因此我们首先需要找到本地的证书,当然了,如果你是个黑客,那你就去把他的服务器一块黑了,管他什么证书校验,直接一把梭哈。不过我不是,{:1_937:}一般证书的后缀名为p12,bks。储存位置一般是在assets文件夹下。并且一般都是会有私钥存在的。这次还是*oul这个倒霉蛋,这次我们采用hook方法来hook得到私钥。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210329181739541.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlX3BzeWNoZQ==,size_16,color_FFFFFF,t_70)
我们需要知道一个类(https://developer.android.com/reference/java/security/KeyStore)。此类表示加密密钥和证书的存储设施。keystore.load是一个系统函数,直接hook。

![在这里插入图片描述](https://img-blog.csdnimg.cn/2021032918195516.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlX3BzeWNoZQ==,size_16,color_FFFFFF,t_70)
写出hook脚本

```java
function keystorehook(){

    Java.perform(function(){
      var StringClass = Java.use("Java.lang.String");
      var KeyStore = Java.use("java.security.KeyStore");
      KeyStore.load.imptementnation = function(arg0){
            console.log('KeyStoreLoad: ',arg0)
            this.load(arg0);
      };


   
    });
};

keystorehook();
```

这个时候会报错,也不算报错吧。它会显示有两个重载函数,因此我们需要加上重载函数再进行hook。(注意该app有模拟器检测,因为真机测试机在宿舍没有带来,手头没有真机所以无图,但是代码是跑的通的)。

```java
function keystorehook(){

    Java.perform(function(){
      var StringClass = Java.use("Java.lang.String");
      var KeyStore = Java.use("java.security.KeyStore");
      KeyStore.load.overload('java.io.InputStream','[C').imptementnation = function(arg0,arg1){

            console.log("KeyStore.load: ",arg0,arg1 ? StringClass.$new(arg1):null);
            this.load(arg0,arg1);
      };


   
    });
};

keystorehook();
```
这时候就跑出结果了。

## 总结
抓包到此告一段落,发现时间隔得太久了。自己是懒狗一只,希望以后能高产似母猪吧。{:301_998:}


batcd 发表于 2021-3-29 21:51

这个抓包帖子分析的有技术含量,目前手机用小黄鸟比较多了,网页是fd,程序使用HttpAnalyzerStdV7或者HTTPDebugger当然还有tcp的SmartSniff

dijihui 发表于 2021-3-29 23:20

闷骚小贱男 发表于 2021-3-29 19:58
大大大大大大佬在上。。
下午我刚研究了一个360加固的https的AES(MD5(data))的例子。。
用了反射大师3.5 ...

闷骚小贱男都喊楼主大佬,那楼主真的是大佬了,,坛里看过闷骚小贱男的某妲己的抓包教程,可惜自己小白按步骤也学不会,

闷骚小贱男 发表于 2021-3-29 19:58

大大大大大大佬在上。。
下午我刚研究了一个360加固的https的AES(MD5(data))的例子。。
用了反射大师3.5脱壳,jadx。。
最后终于研究明白了{:301_1007:}

dogzxcn 发表于 2021-3-29 19:59

学习了。

nanaqilin 发表于 2021-3-29 20:12

哎,可惜我不写java程序了

anlovedong 发表于 2021-3-29 21:14

学习了,谢谢分享

zhrmghgtw 发表于 2021-3-29 21:35

谢谢分享

.KK 发表于 2021-3-29 22:39

学习下,谢谢分享

OO2OO 发表于 2021-3-30 00:07

感谢分享
页: [1] 2 3 4 5 6
查看完整版本: 抓包问题进阶分析