根据doc VpnService.prepare(context)用于在android中建立VPN连接,除了特定的设备模型之外,它几乎在所有设备模型中都有这个技巧(Oppo X9076 Android 5.0).根据crashlytics调用中的日志,VpnService.prepare(context)导致SDK内部崩溃.不确定这是特定于设备的问题还是什么!下面是来自crashlytics的日志.
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.android.server.connectivity.Vpn.prepare(java.lang.String, java.lang.String)' on a null object reference
at android.os.Parcel.readException(Parcel.java:1552)
at android.os.Parcel.readException(Parcel.java:1499)
at android.net.IConnectivityManager$Stub$Proxy.prepareVpn(IConnectivityManager.java:1663)
at android.net.VpnService.prepare(VpnService.java:159)
Run Code Online (Sandbox Code Playgroud)
我已经给了所有东西,不是为了在网络上免除大量搜索,而是为了解决问题.PL.帮帮我,我一直都在这里.
FYR
我正在编写VPN应用程序,用于VPN连接的套接字是在我的本机C代码中处理的,而不是在java中处理的.我如何VpnService.protect()在该套接字上使用?我注意到它有一个VpnService.protect(int)重载,我可以socket返回从本机代码返回到Java 的int 并以这种方式保护它吗?
例
// Native Code
int socket;
JNIEXPORT jint JNICALL
Java_com_my_package_Class_initializeSocket
(
JNIEnv *env,
jobject jobj
) {
socket = socket(AF_INET, SOCK_DGRAM, 0);
// . . . Handler other socket preparations
return (jint)socket;
}
Run Code Online (Sandbox Code Playgroud)
// Java Code
public native int initializeSocket();
. . .
int socket = initializeSocket();
this.protect(socket);
Run Code Online (Sandbox Code Playgroud)
编辑
我确实找到了这个描述protect函数如何工作的问题,看起来它可能在C中有一个非常简单的实现,因为它似乎只是使用了一个setsockopt调用.但我对C也比较陌生,所以我不能完全遵循如何复制它.
我正在研究从Facebook安卓应用程序嗅探数据包.我想在社交网络上研究用户行为时使用嗅探数据.
我在过去两个月学到的是我必须创建一个vpn服务并用它来嗅探数据.互联网上有很多有用的代码,我试图理解和运行.我设法使用这些代码嗅探某些应用程序的数据,这些代码都使用相同的概念.
当使用上述代码中的每一个,并进行少量修改时,我设法捕获所有应用程序的数据包,但是对于像facebook这样的应用程序,vpnService使这些应用程序停止工作; 当我创建vpn服务并尝试评论帖子或进行任何需要在Facebook应用程序和Facebook服务器之间发送/接收数据的操作时,此操作不会发生; 看起来不知何故Facebook应用程序知道有人在嗅他.
在过去的两个月里,我一直在尝试在不破坏Facebook应用程序功能的情况下找到捕获Facebook应用程序包的方法.
我尝试在Android示例中按照KeyChain演示安装证书,但它不适用于我.
从我的搜索中,我知道/我确信有一些我缺少的东西; 我搜索的应用程序做了我想要完成的事情,而没有像facebook那样的应用程序检测它.我在Google Play上找到了LostNetNoRootFirewall.
使用LostNetNoRootFirewall,我设法创建了一个vpn服务并嗅探数据包,而facebook应用程序就像一个魅力!
我应该向我的应用程序添加什么才能创建一个vpnService并阻止像facebook这样的应用程序检测到我的服务正在嗅探它的数据包?
package com.git.firewall;
public class GITVpnService extends VpnService implements Handler.Callback, Runnable {
private static final String TAG = "GITVpnService";
private String mServerAddress = "127.0.0.1";
private int mServerPort = 55555;
private PendingIntent mConfigureIntent;
private Handler mHandler;
private Thread mThread;
private ParcelFileDescriptor mInterface;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// The handler is …Run Code Online (Sandbox Code Playgroud) According to the official documentation:
However, it is still not clear to me, and digging through dns66's source and Netguard's source did not help much either.
I am not sure it is supposed …
我找到了以下代码以编程方式建立一个新的 vpn,但我不知道如何使用它来创建我的应用程序
VpnService service = context.getSystemService(VPN_SERVICE);
VpnProfile profile = VpnProfile.create(L2TP_PROFILE);
profile.setName(myServerName);
profile.setServerName(myServerAddress);
profile.setRouteList("192.168.1.0/255.255.255.0,192.168.10.0/255.255.255.0");
service.connect(profile, "myUserName", "myPassword");
service.setNotificationIntent(myIntent);
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我提供示例代码吗?甚至有可能实现dis吗?
我想构建一个可以通过单击按钮连接的应用程序,该应用程序将创建一个 vpn 配置文件并通过解析 vpn 服务器的用户名和密码连接到 vpn 配置文件。开发和修改的代码很适合创建和连接 vpn,但我的 vpn 需要输入用户名和密码,所以我想以编程方式进行。这是我的项目
VpnClient.java
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.VpnService;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class VpnClient extends AppCompatActivity{
public interface Prefs {
String NAME = "connection";
String SERVER_ADDRESS = "server.address";
String SERVER_PORT = "server.port";
String SHARED_SECRET = "shared.secret";
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button disconnect = (Button) findViewById(R.id.disconnect);
Button connect = (Button) findViewById(R.id.connect);
// final TextView serverAddress = (TextView) findViewById(R.id.address); …Run Code Online (Sandbox Code Playgroud) 我注意到 Play 商店上的各种防火墙应用程序能够让用户选择允许哪些应用程序使用 Wi-Fi 和/或移动网络进行互联网连接。这些应用程序使用 VPN 来进行所需的控制。
Xproguard 防火墙就是一个例子:
https://play.google.com/store/apps/details?id=com.xproguard.firewall
我想尝试做一些类似的东西。为此,遗憾的是我在网上找不到太多材料,实际上甚至在 StackOverflow 上也发现了各种未解答的问题。
我找到了一个名为“ToyVpn”的示例(此处),但它似乎比我想要的复杂得多,而且我什至不确定它是否可以完成我想要做的事情。
所以我从头开始尝试一些东西。我已经成功拥有一个可用的 VPN(或者至少看起来是这样)。我选择 Google Chrome 作为要阻止的应用程序,因为它很容易测试,而且我可以看到防火墙应用程序也成功阻止了它。这就是我得到的:
显现
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />
<application
android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:theme="@style/Theme.Firewall" tools:targetApi="31">
<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>
<service
android:name=".MyVpnService" android:exported="true"
android:permission="android.permission.BIND_VPN_SERVICE">
<intent-filter>
<action android:name="android.net.VpnService" />
</intent-filter>
</service>
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)
MainActivity.kt
class MainActivity : AppCompatActivity() {
private val requestVpn =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) …Run Code Online (Sandbox Code Playgroud) 我正在尝试以编程方式建立并连接到我们自己的VPN(不是默认的VPN提供商,即PPTP、L2TP等,它们存在于Android设置->无线和网络中)。
我想知道截至 2017 年这是否已经可能。
有我用的参考
使用数据报通道时,我收到 PortUnreachableException。这就是我的代码的样子:
@Override
public void run() {
try {
Log.i(getTag(), "Starting");
// If anything needs to be obtained using the network, get it now.
// This greatly reduces the complexity of seamless handover, which
// tries to recreate the tunnel without shutting down everything.
// In this demo, all we need to know is the server address.
final SocketAddress serverAddress = new InetSocketAddress(mServerName, mServerPort);
// We try to create the tunnel several times. …Run Code Online (Sandbox Code Playgroud) 当我尝试为我的VpnService创建隧道接口时,我收到以下错误:
Attempt to invoke virtual method 'java.lang.String android.os.ParcelFileDescriptor.toString()' on a null object reference
Run Code Online (Sandbox Code Playgroud)
我目前唯一的解决方法是在发生这种情况时重启设备.如果我不这样做,我根本无法创建隧道.
我创建隧道的代码:
// This is inside my VpnService implementation
private ParcelFileDescriptor configureTunnelWithPushOpts(PushOpts popts)
{
VpnService.Builder builder = this.new Builder();
builder.setMtu ( currentServerPrefs.SERVER_MTU );
builder.addAddress ( popts.ip, 32 );
builder.addDnsServer ( popts.dns1 );
builder.addDnsServer ( popts.dns2 );
builder.addRoute ( "0.0.0.0", 0 );
// Note: Blocking mode is now enabled in native
// code under the setFileDescriptor function.
// builder.setBlocking(true);
builder.setConfigureIntent(
PendingIntent.getActivity(
this,
0,
new Intent(
this,
MainActivity.class
), …Run Code Online (Sandbox Code Playgroud) 我在这里要疯了。我正在尝试在 Samsung Galaxy Tab S5e 上调试我的应用程序。
我的应用程序运行 VPNService ,我有理由确定这是以下问题的根本原因:
通过 USB 调试时,一切正常。但是,当我通过 WIFI 进行调试时,它不断提示我“允许 USB 调试”,说明有关计算机 RSA 密钥指纹以及我是否要“始终允许来自此计算机”的信息,我显然选择了该选项,然后单击“允许” 。
如果我再次尝试调试我的应用程序,它会再次提示我...
我试过了:
adbkey.pub和adbkey文件什么都不起作用。
有谁知道我该如何解决这个问题?我必须通过无线方式,因为我需要测量能耗……如果设备正在充电,我就无法做到这一点。