前言
发现距离上一篇文章已经过了好久了,给抓包做一个终结篇吧,建议配合上一篇食用。
各类抓包工具介绍
首先说一下市面上常见的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:}