當前位置:首頁 » 操作系統 » droidwall源碼

droidwall源碼

發布時間: 2023-02-18 08:36:40

A. 通過hook connect 函數 實現 VPN功能是否可行

在android系統中,可以使用iptables控制單個應用網路訪問。在google code上有一個開源項目-droidwall就是基於iptables實現的。除了iptables可以實現控制單個應用網路訪問外,還可以通過攔截應用中的connect函數,達到控制應用訪問網路的目的。下面從幾個方面分析android應用中connect調用流程為例來實現攔截connect實現網路禁用和ip過濾。(以下分析基於4.2源碼)


1.android中網路訪問流程


1)android系統中訪問網路可以通過Socket.java、URL.java、HttpPost.java、HttpGet.java等關鍵類來訪問網路資源。通過代碼追蹤,這些類訪問網路資源最終需要通過native方式,調用linux系統下的socket函數訪問網路。在android4.2源碼中,java層訪問網路得native方法定義在源碼路徑libcore/luni/src/main/java/libcore/io/Posix.java中(4.0之前的網路系統、文件系統的native方法是獨立分開得,4.0之後組織在Posix.java中)。如下是Posix.java中的代碼片段:

public final class Posix implements Os { Posix() { } public native FileDescriptor accept(FileDescriptor fd, InetSocketAddress peerAddress) throws ErrnoException, SocketException; public native boolean access(String path, int mode) throws ErrnoException; public native void bind(FileDescriptor fd, InetAddress address, int port) throws ErrnoException, SocketException; ...... //對應linux下的connect系統調用 public native void connect(FileDescriptor fd, InetAddress address, int port) throws ErrnoException, SocketException;

2)Posix.java中的native方法實現源碼路徑libcore/luni/src/main/native/libcore_io_Posix.cpp文件中,native connect方法實現代碼片段如下:

taticvoidPosix_connect(JNIEnv*env,jobject,jobjectjavaFd,jobjectjavaAddress,jintport)
{
sockaddr_storagess;
if(!inetAddressToSockaddr(env,javaAddress,port,&ss))
{
return;
}
constsockaddr*sa=reinterpret_cast<constsockaddr*>(&ss);
(void)NET_FAILURE_RETRY(env,int,connect,javaFd,sa,sizeof(sockaddr_storage));
}

有上代碼可知,java層connect最終功能由linux系統connect函數實現。


2.so注入


so注入可以參考古河大哥牛逼的libInject(點擊這里訪問)。


3.攔截connect庫編寫


在connect中,獲取傳入的參數ip地址,根據需要把需要禁用的ip地址改為127.0.01.以下是我測試的攔截connect函數關鍵代碼:

intnew_connect(intsockfd,conststructsockaddr*addr,socklen_taddrlen)
{
LOGDD("HOOK
====>newconnect****************");
charip[128]={0};
intport=-1;
if(addr->sa_family==AF_INET)
{
structsockaddr_in*sa4=(structsockaddr_in*)addr;
inet_ntop(AF_INET,(void*)(structsockaddr*)&sa4->sin_addr,ip,128);
port=ntohs(sa4->sin_port);
LOGDD("AF_INETIP===>%s:%d",ip,port);
}
elseif(addr->sa_family==AF_INET6)
{
structsockaddr_in6*sa6=(structsockaddr_in6*)addr;
char*ipv6=NULL;
inet_ntop(AF_INET6,(void*)(structsockaddr*)&sa6->sin6_addr,ip,128);
ipv6=strstr(ip,"f:");
if(NULL!=ipv6)
{
strcpy(ip,ipv6+2);
}
port=ntohs(sa6->sin6_port);
LOGDD("af_inet6
IP===>%s:%d",ip,port);
}
else
{
returnold_connect(sockfd,addr,addrlen);
}

if(strcmp(ip,"115.23.20.178")==0)
{

LOGDD("%s
==>127.0.0.1",ip);
structsockaddr_inmy_addr;
intmy_len=sizeof(structsockaddr_in);
bzero(&my_addr,sizeof(my_addr));
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(80);
my_addr.sin_addr.s_addr=inet_addr("127.0.0.1");

returnold_connect(sockfd,(constsockaddr*)&my_addr,sizeof(my_addr));
}
else
{
returnold_connect(sockfd,addr,addrlen);
}
}

4.攔截connect函數功效


1)禁用應用網路訪問。

2)過濾廣告ip

3)禁用定位功能

熱點內容
linuxipmac 發布:2025-07-30 13:18:48 瀏覽:318
微信小程序開發源碼 發布:2025-07-30 13:08:39 瀏覽:63
求累加和c語言 發布:2025-07-30 12:56:03 瀏覽:49
asp在線加密 發布:2025-07-30 12:51:06 瀏覽:937
java完全手冊 發布:2025-07-30 12:22:05 瀏覽:613
支付寶介面java 發布:2025-07-30 12:21:58 瀏覽:76
做腳本需要把主機零件拆了嗎 發布:2025-07-30 12:02:55 瀏覽:493
郵政解壓視頻完整版 發布:2025-07-30 12:00:54 瀏覽:491
301重定向php 發布:2025-07-30 11:52:34 瀏覽:22
如何給樂視配置遙控器 發布:2025-07-30 11:42:10 瀏覽:510