• 服务端通过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
                        }
    
                    }
    
                }

     

  • 相关阅读:
    某图片网站整合yolo图片特征相似图片获取
    MySQL导入数据报错 ERROR 1794 (HY000) at line 22 -- 解决
    apache-commons-lang3之StringUtils使用集锦
    swf格式的flash文件变更md5
    Linux常见场景的shell使用
    tp5在apache下能访问,但放到nginx下报404
    template-web.js 使用二
    jquery实现动态添加html代码
    JQuery的父、子、兄弟节点
    this
  • 原文地址:https://www.cnblogs.com/season-xie/p/5440552.html
Copyright © 2020-2023  润新知