예제 #1
0
  /**
   * Construct MCS data, including channel, encryption and display options
   *
   * @return Packet populated with MCS data
   */
  public RdpPacket_Localised sendMcsData() {
    logger.debug("Secure.sendMcsData");

    RdpPacket_Localised buffer = new RdpPacket_Localised(512);

    int hostlen = 2 * (Options.hostname == null ? 0 : Options.hostname.length());

    if (hostlen > 30) {
      hostlen = 30;
    }

    int length = 162 + 76 + 12 + 4;

    if (Options.use_rdp5 && (channels.num_channels() > 0))
      length += channels.num_channels() * 12 + 8;

    buffer.setBigEndian16(5); /* unknown */
    buffer.setBigEndian16(0x14);
    buffer.set8(0x7c);
    buffer.setBigEndian16(1);

    buffer.setBigEndian16(length | 0x8000); // remaining length

    buffer.setBigEndian16(8); // length?
    buffer.setBigEndian16(16);
    buffer.set8(0);
    buffer.setLittleEndian16(0xc001);
    buffer.set8(0);

    buffer.setLittleEndian32(0x61637544); // "Duca" ?!
    buffer.setBigEndian16(length - 14 | 0x8000); // remaining length

    // Client information
    buffer.setLittleEndian16(SEC_TAG_CLI_INFO);
    buffer.setLittleEndian16(216); // length
    buffer.setLittleEndian16(Options.use_rdp5 ? 4 : 1);
    buffer.setLittleEndian16(8);
    buffer.setLittleEndian16(Options.width);
    buffer.setLittleEndian16(Options.height);
    buffer.setLittleEndian16(0xca01);
    buffer.setLittleEndian16(0xaa03);
    buffer.setLittleEndian32(Options.keylayout);
    buffer.setLittleEndian32(2600); // or 0ece
    // // client
    // build? we
    // are 2600
    // compatible
    // :-)

    /* Unicode name of client, padded to 32 bytes */
    buffer.outUnicodeString(Options.hostname, hostlen);
    buffer.incrementPosition(30 - hostlen);

    buffer.setLittleEndian32(4);
    buffer.setLittleEndian32(0);
    buffer.setLittleEndian32(12);
    buffer.incrementPosition(64); /* reserved? 4 + 12 doublewords */

    buffer.setLittleEndian16(0xca01); // out_uint16_le(s, 0xca01);
    buffer.setLittleEndian16(1);

    buffer.setLittleEndian32(0); // out_uint32(s, 0);
    buffer.set8(Options.server_bpp); // out_uint8(s, g_server_bpp);
    buffer.setLittleEndian16(0x0700); // out_uint16_le(s, 0x0700);
    buffer.set8(0); // out_uint8(s, 0);
    buffer.setLittleEndian32(1); // out_uint32_le(s, 1);
    buffer.incrementPosition(64);
    buffer.setLittleEndian32(0); // selected_protocol /* End of client info */

    buffer.setLittleEndian16(SEC_TAG_CLI_4); // out_uint16_le(s, SEC_TAG_CLI_4);
    buffer.setLittleEndian16(12); // out_uint16_le(s, 12);

    int cluster_flags = 0;
    cluster_flags |= SEC_CC_REDIRECTION_SUPPORTED;
    cluster_flags |= (SEC_CC_REDIRECT_VERSION_3 << 2);
    if (Options.console_session) {
      cluster_flags |= SEC_CC_REDIRECT_SESSIONID_FIELD_VALID;
    }
    buffer.setLittleEndian32(cluster_flags); // out_uint32_le(s,
    buffer.setLittleEndian32(0); // redirect session id?

    // Client encryption settings //
    buffer.setLittleEndian16(SEC_TAG_CLI_CRYPT);
    buffer.setLittleEndian16(12); // length
    buffer.setLittleEndian32(Options.encryption ? 0x3 : 0);
    buffer.setLittleEndian32(0); // unknown

    if (Options.use_rdp5 && (channels.num_channels() > 0)) {
      logger.debug(("num_channels is " + channels.num_channels()));
      buffer.setLittleEndian16(SEC_TAG_CLI_CHANNELS); // out_uint16_le(s,
      // SEC_TAG_CLI_CHANNELS);
      buffer.setLittleEndian16(channels.num_channels() * 12 + 8); // out_uint16_le(s,
      buffer.setLittleEndian32(channels.num_channels()); // out_uint32_le(s,
      // g_num_channels);
      // // number of
      // virtual
      // channels
      for (int i = 0; i < channels.num_channels(); i++) {
        logger.debug(("Requesting channel " + channels.channel(i).name()));
        buffer.out_uint8p(channels.channel(i).name(), 8); // out_uint8a(s,
        // g_channels[i].name,
        // 8);
        buffer.setBigEndian32(channels.channel(i).flags()); // out_uint32_be(s,
        // g_channels[i].flags);
      }
    }

    buffer.markEnd();
    return buffer;
  }