远程控制UDP版

一、主要技术--按照客户端控制服务器的实现来讲

UDP版和TCP版的主要区别是数据发送方式不同,tcp通过连接,通过流来发送和接受数据,非常可靠,UDP是

发送数据包和接受数据包的过程,而且发送的数据包可能丢失,数据包的大小也有限制。也就是字节数组的大小有限制。

我的屏幕截图下来有4M,不能够一次性发在字节数组中发送,我的实现办法是,先将对象序列化写入文件,然后将文件分成一百分发送出去,客户端接受的时候也将接收的字节写入文件,然后用对象输入流读取,就相当于对象的序列化过程,和文件复制。

二、主要实现步奏都是一样的可以参考tcp的实现,下面是发送数据和接受数据的过程。

1、服务器发送数据包代码

注意事项由于可能丢包,所以每发送一张图片也就是一个对象时,先发送”开始标记“,然后再发送分隔的100分字节数组,客户端在接收到”开始“字节数组之后开始接受,接受100份后边开始按照对象流读取图片对象,如果对象读取不成功,说明这100份字节数组出现了错误,不是一个完整的对象的字节数组,将其丢弃重新开始接受,直到对象成功读取才将去画在客户端的面板上。

public void run() {

  
   Robot robot;
   try {
    robot = new Robot();
    
    while (true) {
     System.out.println("开始");
     //得到屏幕大小,由于在远程控制中,可能改变屏幕分辨率,所以要不断获取
     Toolkit tool = Toolkit.getDefaultToolkit();
     //
     Dimension dimension= tool.getScreenSize();
     Point point = new Point(0,0);
     
     //创建一个矩形用于指定截屏区域
     Rectangle screenRect = new Rectangle(point,dimension);
     
     // 不断地截屏,然后发给客户端
     BufferedImage bimg = robot.createScreenCapture(screenRect);
     
     //BufferedImage没有实现接口,所以不能被实例化,所以将其转成imageicon
     ImageIcon img = new ImageIcon(bimg);
  
//***********************************************************************     、
     //先把对象写入文件,再把文件转成字节数组发出去,对方接受文件,再按对象读取
     File file = new File("d:/jietu.png");
     FileOutputStream fos  =  new FileOutputStream(file);
     
     BufferedOutputStream bos  = new BufferedOutputStream(fos); 
 
     //包装成对象流
     ObjectOutputStream os = new ObjectOutputStream(bos);
     //将对象写入文件
     os.writeObject(img);
     os.flush();
     
     //*******************
     //将文件转成字节流发出去
     byte[] b = new byte[(int) file.length()];
     FileInputStream fis = new FileInputStream(file);
     fis.read(b);
     
     System.out.println(b.length);
     int skp = (int) (file.length()/100);
     int len =skp;
     //先发送一个头,表示这个一张数据的开始
     byte[] b0 = "开始".getBytes();
     //把开始标记发出去
     DatagramPacket dp2 = new DatagramPacket(b0,b0.length, sentaddress);
     socket.send(dp2);
     //把文件大小用字节数组发出去
     byte[]  filelength=(file.length()+"").getBytes();
     
     //将数组复制到指定长度为20的数组,不够的补0
     byte[] bl=Arrays.copyOf(filelength, 20);
     System.out.println("数组大小为"+file.length());
     
     
     DatagramPacket dp3 = new DatagramPacket(bl,bl.length, sentaddress);
     socket.send(dp3);
     
     for(int i =0;i<100;i++){
      if(i==99){
       //最后剩下的长度
       len=b.length-99*skp;
       System.out.println(i);
       System.out.println(len);
      }
      System.out.println(i);
      System.out.println(len);
       dp2 = new DatagramPacket(b, i*skp,len, sentaddress);
      socket.send(dp2);
     Thread.sleep(10);
     
     }
   
    }
    
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
 
   
 }

三、客户端接受到数据之后,先将其写入文件,然后再用对象流读取,读取成功才将起画在面板(这里没有判断是否成功读取对象)

 while (true) {
   File file0 = new File("e:/jietu.png");
   //如果有原来的截图就将其删掉
   if(file0.exists()){
    file0.delete();
   }
   try {
   
    File file = new File("e:/jietu.png");
    FileOutputStream fos = new FileOutputStream(file);
    byte[] b0 = new byte[4];
    DatagramPacket dp0 = new DatagramPacket(b0, b0.length);

    socket.receive(dp0);
    // 如果是头就开始接受图片

    if ("开始".equals((new String(b0)).trim())) {
     int sum = 0;
     byte[] blength = new byte[20];
     DatagramPacket dplength = new DatagramPacket(blength,
       blength.length);
     socket.receive(dplength);
     int length = Integer.parseInt((new String(blength)).trim());
     System.out.println("大小为%%%%"+length);
     int length1=length/100;
     int length2=length-length1*99;
     for (int i = 0; i < 100; i++) {
      if (i == 99) {
       byte[] buf = new byte[length2];
       DatagramPacket dp2 = new DatagramPacket(buf,
         buf.length);
       sum++;
       socket.receive(dp2);
       fos.write(buf);
       fos.flush();
       

      } else {
       byte[] buf = new byte[length1];
       DatagramPacket dp2 = new DatagramPacket(buf,
         buf.length);
       sum++;
       socket.receive(dp2);
       System.out.println(i);
       fos.write(buf);
       fos.flush();
      }

     }
     System.out.println("%%%%%" + file.length());
     fos.close();
     //如果sum不等于100,说明没有完成接受到图片对象,有丢失,则不能将对象完整读取出来,所以直接放弃,只有完整读取才能将其画出来
     if(sum==100){

     FileInputStream fis = new FileInputStream(file);
     BufferedInputStream bos = new BufferedInputStream(fis);
     ObjectInputStream ois = new ObjectInputStream(bos);

     ImageIcon img= (ImageIcon) ois.readObject();

     

     ois.close();
     bos.close();
     fis.close();

     Graphics g = panel.getGraphics();
     g.drawImage(img.getImage(), 0, 0, null);
     System.out.println(">>>>>>>>>>>>>");
     file.exists();
     file.delete();
     }

    }

   } catch (Exception e) {
    // TODO Auto-generated catch block
    
    e.printStackTrace();
   }

 

该软件是游戏软件,主要用于捉弄人 1、远程文件操作:包括创建、上传、下载、复制、删除文件或目录、打开文件(提供了四中不同的打开方式??正常方式、最大化、最小化和隐藏方式)等多项文件操作功能; 2、远程关机、重启、睡眠,拨号控制,光驱控制,注册表锁定,鼠标锁定,键盘锁定,对桌面图标、任务栏等锁定和隐藏等系统控制; 3、更改系统墙纸、分辨率、颜色、主机名、创建网络共享等系统配置功能; 4、获取计算机名、注册公司、当前用户、系统路径、操作系统本、当前显示分辨率、物理及逻辑磁盘信息等多项系统数据; 5、对按键监视、剪切板监视、文件操作监视、任务监视和终止以及直接的屏幕监视和控制; 6、口令获取:上网密码,用户登陆密码,以星星出现过的密码,以及“Password”,“密码”,“登陆”,“口令”,“连接”,“帐号”,“用户”,“login”,“account”,“connect”等敏感字符进行获取,内存和CPU利用率也并不高。 7、短信息发送:以四种常用图标向被控端发送简短信息; 8、点对点聊天:与被控端进行点对点聊天交谈; 9、骷髅、地震、乱屏等耍人操作; 10、命令提示符操作:对DIR、NET VIEW等什么的Command命令操作; 11、注册表操作:主键的浏览、增删、重命名和对键值的读写等所有注册表操作功能; 12、EXE处理器:帮你的木马瞒天过海,帮你的EXE文件进行捆绑,加密,更换图标; 13、服务断配置:可更改端口、密码IP通知采用Email通知和客户端内置服务器侍待两种通知方式,Email通知将你的动态IP和密码星星等发走,采用静态IP通知5分钟刷新一次; 14、增加系统安全性,用户需要密码才能访问,可自动卸载,重新加载 15、新单一采用TCP/IP协议传输,没用到UDP协议,消除了服务端在Win2k/NT下的不稳定情况 一些问题: 1、自动搜索:计算机自动扫描指定端口下的IP,该服务器程序指定端口为8011,又分高级搜索和低级搜索 2、低级搜索:在指定C类子网下扫描IP,用时短,显示中木马的计算机 3、高级搜索:穷举所有IP,用时长,显示中木马的计算机 4、因为要等待对方响应,根据你搜索的网大小定致延时 5、退出会终止搜索并把列表中的IP地址列在IP列表中,未保存 6、屏幕跟踪时,按键盘、鼠标相当对方按键盘鼠标,完全模拟,采用了JPEG图象传输适合Internet传输 7、IP列表中,读入记录可把保存的IP列举出来 8、IP列表中,保存记录可把列表中的IP保存进文件 9、IP列表中,清空记录删除文件记录 10、IP列表中,删除记录可在文件中删除该条记录 11、IP列表中,双击列表可自动把IP列入连接IP上 12、如用新建文件夹、复制、粘贴等,可能有影射错误,可用文件自动刷新,注册表同理,建议手动刷新 13、更换计算机名字要下次重启才有效 14、文件管理器中注意底下的当前目录可能和你左边的目录树不同,这没有错,因为数据未接收完时你按键 太多了 15、对键值的新建或删除不会自动刷新,请重新展开根键 16、 更换墙纸 命令无效,这个问题的可能性太多了,较常见的原因是被监控端的桌面设置为 按WEB页查看 17、二进制修改支持到0x200的偏移量修改 18、IP通知,分Email通知(动态IP适用)和内置IP服务侍待器(局域网适用),不需要Email通知请清空SMTP和Email 19、更改了配置采用重载服务断后立即有效 20、由于采用防DES复杂加密技术,EXE加密器如果采用随机码加密则运行解密时会慢点 21、加密后的程序只不过是来帮木马、病毒之类的瞒天过海,运行后当然会原形毕露,也只能做到这一步 22、所以要先配置服务端后再进行EXE捆绑才有效 23、配置服务断程序端口请用1024-65535之间的端口,以免冲突 24、由于2.1之后本的内核和方法都完全改了,支持对2.1后的本在线升级服务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值