首页
社区
课程
招聘
[原创]hook connect函数,禁用网络访问
发表于: 2013-10-27 18:28 21854

[原创]hook connect函数,禁用网络访问

2013-10-27 18:28
21854

标 题: 【原创】hook connect函数,禁用网络访问
作 者: 蟑螂一号  
时 间: 2013-10-27,21:11:03
     在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方法实现代码片段如下:
          static void Posix_connect(JNIEnv* env, jobject, jobject javaFd, jobject javaAddress, jint port) {
    sockaddr_storage ss;
    if (!inetAddressToSockaddr(env, javaAddress, port, &ss)) {
        return;
    }
    const sockaddr* sa = reinterpret_cast<const sockaddr*>(&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函数关键代码:
        int new_connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen)
{
    LOGDD("HOOK ====>new connect****************");
   char ip[128]={0};
   int port=-1;
   if(addr->sa_family==AF_INET)
      {
        struct sockaddr_in *sa4=(struct sockaddr_in*)addr;
        inet_ntop(AF_INET,(void*)(struct sockaddr*)&sa4->sin_addr,ip,128);
        port=ntohs(sa4->sin_port);
       LOGDD("AF_INET  IP===>%s:%d",ip,port);
      }else if(addr->sa_family==AF_INET6)
      {
         struct sockaddr_in6 *sa6=(struct sockaddr_in6*)addr;
         char *ipv6=NULL;
         inet_ntop(AF_INET6,(void*)(struct sockaddr*)&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
      {
        return old_connect(sockfd,addr,addrlen);  
      }
    if(strcmp(ip,"115.23.20.178")==0)   
{
      
       LOGDD("%s ==>127.0.0.1",ip);
       struct sockaddr_in my_addr;
       int my_len=sizeof(struct sockaddr_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");
      
       return old_connect(sockfd,(const sockaddr*)&my_addr,sizeof(my_addr));
    }else
   {
    return  old_connect(sockfd,addr,addrlen);
   }  
}
    4.拦截connect函数功效
       1)禁用应用网络访问。
       2)过滤广告ip
       3)禁用定位功能
    以上仅个人见解,各位大牛多多指教。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 5
支持
分享
最新回复 (15)
雪    币: 10869
活跃值: (3909)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
小白进来学习一下了,感谢楼主分享
2013-10-27 19:31
0
雪    币: 124
活跃值: (469)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
怎么都开始玩起安卓了
2013-10-27 20:20
0
雪    币: 147
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
http://www.sanwho.com/155.html
排了下版好看多了。
2013-10-27 21:32
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
擦。注入后怎么将connect 替换为new_connect?
2013-10-27 23:31
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
多谢楼主分享,收藏先!
2013-10-28 11:51
0
雪    币: 53
活跃值: (280)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
libc.so库里的接口,别人可以通过静态编译就轻松bypass
2013-10-28 14:35
0
雪    币: 259
活跃值: (3623)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
   这个需要分析android源码中库的调用依赖关系,就算是静态编译的也会被加载到一个so里面使用。
2013-10-28 16:18
0
雪    币: 138
活跃值: (470)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=kgdiwss;1234491]http://www.sanwho.com/155.html
排了下版好看多了。[/QUOTE]

原来这才是大号~ 被发现了吧
2013-10-28 17:46
0
雪    币: 147
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我和螳螂是基友,不是一个人
2013-10-28 19:46
0
雪    币: 138
活跃值: (470)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
你说是基友 我就信了?  不行, 求交(gao)往(ji)!
2013-10-29 08:58
0
雪    币: 12
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
windows下hook那一个函数就能完全断网的吗?
2013-10-29 16:57
0
雪    币: 36
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
部分可行 部分不可行
2013-11-2 09:18
0
雪    币: 169
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
不错,网络拦截
2013-11-8 21:57
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
再问一下楼主,神乎能给个邀请码之类的东西吗,那地方关闭新用户注册了。
2013-11-11 14:18
0
雪    币: 147
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
欢迎入Q群:2585270
2013-11-11 15:48
0
游客
登录 | 注册 方可回帖
返回
//