服务端通过socket向安卓客户端发送shell

目的:服务端能够触发客户端去执行一些操作,例如自动化,清app数据,获取手机信息等操作

服务端-socket-客户端-shell-result-http/socket-服务端

1.客户端权限

 <uses-permission android:name="android.permission.INTERNET"></uses-permission>

 2.连接服务端socket

 // 获得一个Socket通道
            SocketChannel channel = SocketChannel.open();
            // 设置通道为非阻塞
            channel.configureBlocking(false);
            // 获得一个通道管理器
            this.selector = Selector.open();

            // 客户端连接服务器,其实方法执行并没有实现连接,需要在listen()方法中调
            //用channel.finishConnect();才能完成连接
            channel.connect(new InetSocketAddress(hostIp, hostListenningPort));
            //将通道管理器和该通道绑定,并为该通道注册SelectionKey.OP_CONNECT事件。
            channel.register(selector, SelectionKey.OP_CONNECT);

3.接受到后 dosomething 后再回传给服务端

   channel1 = SocketChannel.open();
            // 设置通道为非阻塞
            channel1.configureBlocking(false);
            // 获得一个通道管理器
            this.selector = Selector.open();
            // 客户端连接服务器,其实方法执行并没有实现连接,需要在listen()方法中调
            //用channel.finishConnect();才能完成连接
            channel1.connect(new InetSocketAddress(hostIp, hostListenningPort));
            //将通道管理器和该通道绑定,并为该通道注册SelectionKey.OP_CONNECT事件。
            channel1.register(selector, SelectionKey.OP_CONNECT);
            // 轮询访问selector
            while (true) {
                selector.select();//如果队列有新的Channel加入,那么Selector.select()会被唤醒
                // 获得selector中选中的项的迭代器
                Iterator ite = this.selector.selectedKeys().iterator();
                while (ite.hasNext()) {
                    SelectionKey key = (SelectionKey) ite.next();
                    // 删除已选的key,以防重复处理
                    ite.remove();
                    // 连接事件发生
                    if (key.isConnectable()) {
                        SocketChannel channel = (SocketChannel) key.channel();
                        // 如果正在连接,则完成连接
                        if (channel.isConnectionPending()) {
                            channel.finishConnect();
                        }
                        // 设置成非阻塞
                        channel.configureBlocking(false);
                        //在这里可以给服务端发送信息
                        channel.write(ByteBuffer.wrap(new String(imei).getBytes()));
                        //在和服务端连接成功之后,为了可以接收到服务端的信息,需要给通道设置读的权限。
                        channel.register(this.selector, SelectionKey.OP_READ );
                    } else if (key.isReadable()) {
                        read(key);//do something
                    }

                }

            }

 

原文地址:https://www.cnblogs.com/season-xie/p/5440552.html