在Android APP中,有可能会用到okhttp3这个库。
OkHttp 是一个用于 Android 和 Java 应用的开源 HTTP 客户端库,用于高效地发送和接收 HTTP 请求和响应。该库由 Square, Inc. 开发,并且是一种流行的网络请求库。
使用Android Studio新建一个新项目:
在包名下面创建一个MainActivity类,我的包名是com.example.ok3noproxy:
package com.example.ok3noproxy;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Build;
import android.os.Bundle;
import android.os.Looper;
import android.view.View;
import android.widget.Toast;
import java.io.IOException;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.net.Proxy;
import java.util.Objects;
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
(api = Build.VERSION_CODES.KITKAT)
public void onClick(View v) {
new Thread(new Runnable(){
public void run() {
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
Request request = new Request.Builder()
.url("http://www.baidu.com/?id=1")
.build();
try {
Response response = okHttpClient.newCall(request).execute();
if (response.isSuccessful()) {
final String ss = Objects.requireNonNull(response.body()).string();
System.out.println(ss);
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(MainActivity.this, ss, Toast.LENGTH_SHORT).show();
}
});
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
});
}
}
这段代码的作用是点击一下按钮会请求一下百度。
还要在androidmainfest.xml增加网络权限等:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.ok3noproxy">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:usesCleartextTraffic="true"
android:theme="@style/Theme.Ok3noproxy">
<!-- 注意:activity 标签现在嵌套在 application 标签内部 -->
<activity android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
同时在Gradle Scirpts的build.gradle(Modele: app)中引入okhttp3库:
dependencies {
implementation 'com.squareup.okhttp3:okhttp:4.9.1'
}
选择好设备点击运行,这时候app就在设备上安装运行:
我们设置好代理,点击button,可以正常的抓到baidu的数据包:
这时候,我们在代码中,在创建OkHttpClient对象的时候增加一个方法:
proxy(Proxy.NO_PROXY)
所有的代码:
package com.example.ok3noproxy;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Build;
import android.os.Bundle;
import android.os.Looper;
import android.view.View;
import android.widget.Toast;
import java.io.IOException;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.net.Proxy;
import java.util.Objects;
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
(api = Build.VERSION_CODES.KITKAT)
public void onClick(View v) {
new Thread(new Runnable(){
public void run() {
OkHttpClient okHttpClient = new OkHttpClient.Builder().proxy(Proxy.NO_PROXY).build();
Request request = new Request.Builder()
.url("http://www.baidu.com/?id=1")
.build();
try {
Response response = okHttpClient.newCall(request).execute();
if (response.isSuccessful()) {
final String ss = Objects.requireNonNull(response.body()).string();
System.out.println(ss);
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(MainActivity.this, ss, Toast.LENGTH_SHORT).show();
}
});
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
});
}
}
这时候,我们设置好代理,无论怎么点这个button,在代理工具中都无法捕捉到这个baidu的请求,但也不影响程序的正常请求:
接着使用以下这段js脚本进行hook:
console.log("[*] Starting script");
Java.perform(function () {
var ss = Java.use("okhttp3.OkHttpClient$Builder");
ss.proxy.implementation = function (x) {
console.log(x.type())
console.log(x.address())
console.log(x)
return this.proxy(null)
}
});
console.log("end");
使用命令(老的frida版本使用--no-pause):
frida -U -f com.example.ok3noproxy -l okhttp3_no_proxy_bypass.js --pause
这个就可以抓到这个app的数据包了。
原文始发于微信公众号(赛哈文):Android APP又抓不到包?试试这个思路
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论