抓包问题进阶分析

查看 102|回复 9
作者:psych1   
前言
发现距离上一篇文章已经过了好久了,给抓包做一个终结篇吧,建议配合上一篇食用。
各类抓包工具介绍
首先说一下市面上常见的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。使它作用在网络层。这样我们在抓包阶段就比较轻松了。

HttpCanary
功能强大,关于他的各种优点论坛都有文章介绍,当然也有一点点问题,这个东西需要自己适配。不过多介绍了就。
混淆型抓包
首先是混淆型抓包介绍,为了对抗JustTrustMe,开发人员可以使用混淆类名和函数名的方式使得JustTrustMe无法抓到包,这个时候我们就需要找到混淆的类进行hook然后再使用JustTrustMe就可以抓到包了。


可以看出这个APP就使用了okhttp框架,而且进行了混淆。
这是okhttp所用到的方法来避免被抓包,一般常用的就是证书锁定.certificatePinner(CPinner),它校验的方法一般就是它下面的check方法,我们需要找到这个check方法。

这个时候我们就需要去找他的底层特征函数,特征代码进行搜索。
进入CertificatePinner类,找到他的Check方法

我们可以搜索一下特征代码进行位置定位。

显而易见,就是第一个。我们进去看一下

这就很简单了,直接hook该方法就可以了。
    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由于被加壳了,找到关键代码的想法是不太可能实现的,这个时候我们需要找到其他的类。


这个时候我么需要找到attachBaseContext类(一般都是这个类),在这个类里面会有Context,可以获取classLoader,通过它得到的都是壳的classLoader。

所以我们要hook这个类。
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得到私钥。

我们需要知道一个类KeyStore。此类表示加密密钥和证书的存储设施。keystore.load是一个系统函数,直接hook。

写出hook脚本
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有模拟器检测,因为真机测试机在宿舍没有带来,手头没有真机所以无图,但是代码是跑的通的)。
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   

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


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

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

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

学习了。
nanaqilin   

哎,可惜我不写java程序了
anlovedong   

学习了,谢谢分享
zhrmghgtw   

谢谢分享
.KK   

学习下,谢谢分享
OO2OO   

感谢分享
您需要登录后才可以回帖 登录 | 立即注册

返回顶部