এএস 3 ব্যবহার করে আরডিপিতে লগইন করার চেষ্টা করা হচ্ছে


147

আমি এএস 3 (এয়ার) ব্যবহার করে আরডিপিতে লগইন করার চেষ্টা করছি। প্রকৃত প্রক্রিয়াটি বোঝার জন্য সেখানে সংস্থানগুলির অভাব বিবেচনা করে আমি ঠিক করছি।

আমি প্রারম্ভিক প্রেরণকারীর নামটি শেষ করেছি, সার্ভারের কাছ থেকে প্রতিক্রিয়া পেয়েছি এবং আমি এখন প্রাথমিক অনুরোধ সংযোগে আছি।

আমি আমার সমস্ত ডেটা প্রেরণ করছি এবং ট্র্যাফিক স্নিগ্ধ করার সময়, আমি দেখতে পাচ্ছি যে নেটমন আমি কী ধরণের প্যাকেট পাঠাচ্ছি তা সঠিকভাবে সনাক্ত করছে (t125)। আরডিপি দ্বারা আমার সংযোগ বিচ্ছিন্ন হচ্ছে না এবং তারা একটি ackপ্যাকেট প্রেরণ করে - তবে আমি যে প্রতিক্রিয়াটি প্রত্যাশা করছি তা আমি পাই না।

আমি ক্রস রেফারেন্সিং করছি connectoid, যা একটি ওপেন সোর্স আরডিপি ক্লায়েন্ট। সংযোগ কোডে, আমি আটকে আছি যেখানে তারা ছোট এবং বড়-ইন্ডিয়ান পূর্ণসংখ্যার মিশ্রণ লেখেন।

আমি যখন সীমাবদ্ধ উদাহরণগুলি দেখি (আরও প্যাকেট ডাম্পের মতো), তখন আমি দেখতে পাই যে এই প্রক্রিয়াটির জন্য সংযোগের দৈর্ঘ্য 412, তবে আমার bytearrayআরও 470 এর মতো।

আমি connectoidবিশ্বাস করি যে পদ্ধতিগুলি সঠিক তা আমি রূপান্তর করেছি, তবে এন্ডিয়ান ধরণের মিশ্রণের সাথে আমি এখনও অনিশ্চিত।

আমি যদি দুঃখিত হয় তবে আমি দুঃখিত, তবে আপনাকে সাহায্য করার জন্য আমি যথাসাধ্য চেষ্টা করছি। রূপান্তরকরণে আমি কী চেষ্টা করেছি তা দেখিয়ে আমি কিছু কোড সংযুক্ত করব।

public function sendMcsData(): void {
    trace("Secure.sendMcsData");
    var num_channels: int = 2;
    //RdpPacket_Localised dataBuffer = new RdpPacket_Localised(512);
    var hostlen: int = 2 * "myhostaddress.ath.cx".length;
    if (hostlen > 30) {
        hostlen = 30;
    }
    var length: int = 158;
    length += 76 + 12 + 4;
    length += num_channels * 12 + 8;
    dataBuffer.writeShort(5); /* unknown */
    dataBuffer.writeShort(0x14);
    dataBuffer.writeByte(0x7c); //set 8 is write byte //write short is setbigendian 16 //
    dataBuffer.writeShort(1);
    dataBuffer.writeShort(length | 0x8000); // remaining length
    dataBuffer.writeShort(8); // length?
    dataBuffer.writeShort(16);
    dataBuffer.writeByte(0);
    var b1: ByteArray = new ByteArray();
    b1.endian = Endian.LITTLE_ENDIAN;
    b1.writeShort(0xc001);
    dataBuffer.writeBytes(b1);
    dataBuffer.writeByte(0);
    var b2: ByteArray = new ByteArray();
    b2.endian = Endian.LITTLE_ENDIAN;
    b2.writeInt(0x61637544);
    dataBuffer.writeBytes(b2);
    //dataBuffer.setLittleEndian32(0x61637544); // "Duca" ?!
    dataBuffer.writeShort(length - 14 | 0x8000); // remaining length
    var b3: ByteArray = new ByteArray();
    b3.endian = Endian.LITTLE_ENDIAN;
    // Client information
    b3.writeShort(SEC_TAG_CLI_INFO);
    b3.writeShort(true ? 212 : 136); // length
    b3.writeShort(true ? 4 : 1);
    b3.writeShort(8);
    b3.writeShort(600);
    b3.writeShort(1024);
    b3.writeShort(0xca01);
    b3.writeShort(0xaa03);
    b3.writeInt(0x809); //should be option.keybaortd layout just guessed 1
    b3.writeInt(true ? 2600 : 419); // or 0ece
    dataBuffer.writeBytes(b3);
    // // client
    // build? we
    // are 2600
    // compatible
    // :-)
    /* Unicode name of client, padded to 32 bytes */
    dataBuffer.writeMultiByte("myhost.ath.cx".toLocaleUpperCase(), "ISO");
    dataBuffer.position = dataBuffer.position + (30 - "myhost.ath.cx".toLocaleUpperCase()
        .length);
    var b4: ByteArray = new ByteArray();
    b4.endian = Endian.LITTLE_ENDIAN;
    b4.writeInt(4);
    b4.writeInt(0);
    b4.writeInt(12);
    dataBuffer.writeBytes(b4);
    dataBuffer.position = dataBuffer.position + 64; /* reserved? 4 + 12 doublewords */
    var b5: ByteArray = new ByteArray();
    b5.endian = Endian.LITTLE_ENDIAN;
    b5.writeShort(0xca01); // out_uint16_le(s, 0xca01);
    b5.writeShort(true ? 1 : 0);
    if (true) //Options.use_rdp5)
    {
        b5.writeInt(0); // out_uint32(s, 0);
        b5.writeByte(24); // out_uint8(s, g_server_bpp);
        b5.writeShort(0x0700); // out_uint16_le(s, 0x0700);
        b5.writeByte(0); // out_uint8(s, 0);
        b5.writeInt(1); // out_uint32_le(s, 1);
        b5.position = b5.position + 64;
        b5.writeShort(SEC_TAG_CLI_4); // out_uint16_le(s,
        // SEC_TAG_CLI_4);
        b5.writeShort(12); // out_uint16_le(s, 12);
        b5.writeInt(false ? 0xb : 0xd); // out_uint32_le(s,
        // g_console_session
        // ?
        // 0xb
        // :
        // 9);
        b5.writeInt(0); // out_uint32(s, 0);
    }
    // Client encryption settings //
    b5.writeShort(SEC_TAG_CLI_CRYPT);
    b5.writeShort(true ? 12 : 8); // length
    // if(Options.use_rdp5) dataBuffer.setLittleEndian32(Options.encryption ?
    // 0x1b : 0); // 128-bit encryption supported
    // else
    b5.writeInt(true ? (false ? 0xb : 0x3) : 0);
    if (true) b5.writeInt(0); // unknown
    if (true && (num_channels > 0)) {
        trace(("num_channels is " + num_channels));
        b5.writeShort(SEC_TAG_CLI_CHANNELS); // out_uint16_le(s,
        // SEC_TAG_CLI_CHANNELS);
        b5.writeShort(num_channels * 12 + 8); // out_uint16_le(s,
        // g_num_channels
        // * 12
        // + 8);
        // //
        // length
        b5.writeInt(num_channels); // out_uint32_le(s,
        // g_num_channels);
        // // number of
        // virtual
        // channels
        dataBuffer.writeBytes(b5);
        trace("b5 is bigendin" + (b5.endian == Endian.BIG_ENDIAN));
        for (var i: int = 0; i < num_channels; i++) {
            dataBuffer.writeMultiByte("testtes" + i, "ascii"); //, 8); // out_uint8a(s,
            // g_channels[i].name,
            // 8);
            dataBuffer.writeInt(0x40000000); // out_uint32_be(s,
            // g_channels[i].flags);
        }
    }
    //socket.
    //buffer.markEnd();
    //return buffer;
}

3
আপনি কি কোনও পরিচিত ভাল আরডিপি ক্লায়েন্টের কাছ থেকে আপত্তিজনক প্যাকেটটি ক্যাপচার করতে পারেন এবং যে প্যাকেটগুলির সম্পর্কে আপনি আগ্রহী তার সাথে তুলনা করতে পারেন? আপনি কীভাবে আপনার বাইট অ্যারের কোনও অংশকে এনকোডিং করছেন তার মধ্যে এটি একটি বাগ হতে পারে।
বেন

আপনি কি "প্রাথমিক অনুরোধ সংযোগে" বলতে চাইছেন তা বোঝাতে পারেন, দয়া করে? প্রাথমিক অনুরোধটি আপনার লগইন করার জন্য ইতিমধ্যে পাস করা উচিত ছিল যাতে আপনি ঠিক কী অবস্থায় আটকে রয়েছেন তা পরিষ্কার নয়। আপনি আপনার সংযোগ অনুরোধ (0xe0) প্রেরণ করেছেন এবং আপনার নিশ্চিতকরণ (0xd0) পেয়েছেন এবং এখন আপনি "সংযোগ-প্রাথমিক" পর্যায়ে আছেন? নাকি আরও কোথাও ঘটনার লাইনে? উপরের কোডটিতে আপনি যে প্যাকেট তৈরি করছেন তা কি "এমসিএস: কানেক্ট-ইনিশিয়াল" প্যাকেট?
ম্যাক্স ওয়ার্জ

2
নির্বোধ প্রশ্ন কিন্তু আপনি কি বাক্সে ম্যানুয়ালি আরডিপি চেষ্টা করে দেখেছেন যে এটি কাজ করে? ব্যানারের মতো লগইন প্রতিরোধের জন্য এখানে কিছু ঘটতে পারে "এই মেশিনটি কেবলমাত্র ব্যবহারের জন্যই ব্লাহা ব্লাহ"
ক্রিপ্টোগ্রাফিক_আইএস

আপনি ইতিমধ্যে এটি করেছেন কিনা জানেন না তবে আপনার কেআরডিসি ( লিঙ্ক ) বা ফিরডিপিপি ( লিঙ্ক ) এর উত্স কোডটি একবার দেখে নেওয়া উচিত । তারা আপনার সমস্যার দুর্দান্ত অন্তর্দৃষ্টি দিতে পারে।
নাদিম দৌবা

এটি কানেকটয়েড উত্স কোড থেকে মনে হচ্ছে, এই প্যাকেটের ডেটাগুলি বিইআর এনকোডড; ম্যানুয়ালি প্যাকেট ডেটা তৈরি করার হাত থেকে নিজেকে সহজ করার জন্য এবং আপনার কোডটি আপনার (এবং আমাদের) ডিবাগ করতে সহায়তা করার জন্য আপনার কয়েকটি ফাংশন লিখতে হবে।
অ্যালেক্স মাজারারিওল

উত্তর:


4

স্পষ্টতই বাফারের বেশিরভাগ অংশই সামান্য এডিয়ান, তবে এর শুরুতে বেশ কয়েকটি বাইট 16 বিট (সংক্ষিপ্ত) এর বড় এন্ডিয়ান সংখ্যা হবে বলে আশা করা যায়। এর অর্থ, আপনাকে অল্প এডিয়ানতে ডেটা লিখতে হবে যেন এটি বড় এন্ডিয়ান হিসাবে ব্যাখ্যা করা হবে। বড় এন্ডিয়ান থেকে ডেটাটি এন্ডিয়ান এন্ডিয়ান রূপান্তর করতে, আপনি একটি অস্থায়ী ব্যবহার করতে পারেন ByteArrayযা এর এন্ডিয়ান বড়তে সেট করে আছে, এতে ডেটা লিখতে পারেন, তারপরে writeBytes()আপনার মূল বাফার অ্যারেতে কল করুন, তারপরে অস্থায়ী বড় এন্ডিয়ান অ্যারে সাফ করুন। লেখার ধ্রুবকটি ম্যানুয়ালি করা যেতে পারে, যেহেতু আপনি নিজেই বাইট ক্রমটি স্থানান্তর করতে পারেন, যখন আপনি 0x0005বড় এন্ডিয়ানতে সংক্ষেপে লিখছেন তখন বলুন , আপনি কেবল 0x0500তার পরিবর্তে সামান্য এন্ডিয়ান লিখবেন । আপনি বাহ্যিকভাবে বহিরাগত সহ কোডটি লিখেছিলেনdataBufferএন্ডিয়ান বড় হওয়ার সাথে সাথে আপনি এই কৌশলটি জানেন। তবুও, এটি ভাল যে আপনি কেবলমাত্র dataBufferফাংশনে একটি যথাযথ উত্পাদন করবেন । আমি যে connectoidকোডটি ডাউনলোড করেছি তার ভিত্তিতে নীচে আপনার কোডটি ঠিক করার চেষ্টা করছি , যাতে এটি ByteArrayএন্ডিয়ান খুব কম থাকার সাথে সঠিকভাবে গঠিত হয় - এটি কেবল তখনই গুরুত্বপূর্ণ যখন আপনি সেগুলি থেকে অর্ডার করা ডেটা পড়বেন, আপনি যখন বাইটস পড়বেন না।

public function sendMcsData(): ByteArray {
    trace("Secure.sendMcsData");
    var num_channels: int = 2;
    var dataBuffer:ByteArray=new ByteArray(); //RdpPacket_Localised dataBuffer = new RdpPacket_Localised(512);
    // it's better to build the data buffer in the function, as in java, otherwise you can receive interference
    dataBuffer.endian=Endian.LITTLE_ENDIAN; // for clarity
    var hostlen: int = 2 * "myhost.ath.cx".length; // hardcoded? TODO FIX
    if (hostlen > 30) {
        hostlen = 30;
    }
    var length: int = 158;
    length += 76 + 12 + 4; // Options.use_rdp5 is true, apparently
    length += num_channels * 12 + 8;
    dataBuffer.writeShort(0x0500); // writing big-endian 0x5 *unknown*
    dataBuffer.writeShort(0x1400); // writing big-endian 0x14
    dataBuffer.writeByte(0x7c); //set 8 is write byte 
    //write short is setbigendian 16 //
    dataBuffer.writeShort(0x0100); // writing big-endian 0x01
    var be:ByteArray=new ByteArray();
    be.endian=Endian.BIG_ENDIAN; // create big-endian array for the data that's not static
    be.writeShort(length | 0x8000); // remaining length
    dataBuffer.writeBytes(be);
    be.clear(); // so that extra writing will not spoil the array
    dataBuffer.writeShort(0x0800); // writing big-endian 0x08 (length?)
    dataBuffer.writeShort(0x1000); // writing big-endian 16 (0x10)
    dataBuffer.writeByte(0);
    dataBuffer.writeShort(0xc001); // this one is little endian by default
    dataBuffer.writeByte(0);
    dataBuffer.writeUnsignedInt(0x61637544);
    //dataBuffer.setLittleEndian32(0x61637544); // "Duca" ?!
    be.writeShort((length - 14) | 0x8000); // remaining length
    dataBuffer.writeBytes(be);
    be.clear();
    dataBuffer.writeShort(SEC_TAG_CLI_INFO);
    dataBuffer.writeShort(212); // length
    dataBuffer.writeShort(4);
    dataBuffer.writeShort(8);
    dataBuffer.writeShort(600); // Options.width
    dataBuffer.writeShort(1024); // Options.height
    dataBuffer.writeShort(0xca01);
    dataBuffer.writeShort(0xaa03);
    dataBuffer.writeInt(0x0409); //Options.keylayout, default English/US - fixed
    dataBuffer.writeInt(2600); // or 0ece
    dataBuffer.writeBytes(b3);
    // // client
    // build? we
    // are 2600
    // compatible
    // :-)
    /* Unicode name of client, padded to 32 bytes */
    var targetPos:int=dataBuffer.position+32; // to account for padding
    dataBuffer.writeMultiByte("myhost.ath.cx".toLocaleUpperCase(), "UTF-16"); 
    // buffer.outUnicodeString(Options.hostname.toUpperCase(), hostlen);
    // apparently encoding is used "Unicode" that is UTF-16. If that will not work, set UTF-8 here
    // and by all means check what is on the wire when you connect via conventional RDP

    dataBuffer.position = targetPos;
    // this seems to be your mistake in converting position truncate, 
    // as position after writing already accounts for the writing been processed.
    // This line alone can be the source of size discrepancy you observe.
    dataBuffer.writeInt(4);
    dataBuffer.writeInt(0);
    dataBuffer.writeInt(12);
    dataBuffer.position = dataBuffer.position + 64; // /* reserved? 4 + 12 doublewords */
    // note, if the position wouldn't shift forward, write zeroes manually
    dataBuffer.writeShort(0xca01); // out_uint16_le(s, 0xca01);
    dataBuffer.writeShort(1);
    if (true) //Options.use_rdp5)
    {
        dataBuffer.writeInt(0); // out_uint32(s, 0);
        dataBuffer.writeByte(24); // out_uint8(s, g_server_bpp);
        dataBuffer.writeShort(0x0700); // out_uint16_le(s, 0x0700);
        dataBuffer.writeByte(0); // out_uint8(s, 0);
        dataBuffer.writeInt(1); // out_uint32_le(s, 1);
        dataBuffer.position = dataBuffer.position + 64;
        dataBuffer.writeShort(SEC_TAG_CLI_4); // out_uint16_le(s,
        // SEC_TAG_CLI_4);
        dataBuffer.writeShort(12); // out_uint16_le(s, 12);
        dataBuffer.writeInt(0xd); // out_uint32_le(s,
        // g_console_session
        // ?
        // 0xb
        // :
        // 9);
        // the comments say 9, but the code says 0xd - leaving 0xd in place
        // Options.console_session is hardcoded false
        dataBuffer.writeInt(0); // out_uint32(s, 0);
    }
    // Client encryption settings //
    dataBuffer.writeShort(SEC_TAG_CLI_CRYPT);
    dataBuffer.writeShort(12); // length
    // if(Options.use_rdp5) dataBuffer.setLittleEndian32(Options.encryption ?
    // 0x1b : 0); // 128-bit encryption supported
    // else
    dataBuffer.writeInt(true ? (false ? 0xb : 0x3) : 0);
    dataBuffer.writeInt(0); // unknown
    if (true && (num_channels > 0)) {
        trace(("num_channels is", num_channels));
        dataBuffer.writeShort(SEC_TAG_CLI_CHANNELS); // out_uint16_le(s,
        // SEC_TAG_CLI_CHANNELS);
        dataBuffer.writeShort(num_channels * 12 + 8); // out_uint16_le(s,
        // g_num_channels
        // * 12
        // + 8);
        // //
        // length
        dataBuffer.writeInt(num_channels); // out_uint32_le(s,
        // g_num_channels);
        // // number of
        // virtual
        // channels
        for (var i: int = 0; i < num_channels; i++) {
            targetPos=dataBuffer.position+8; // account for padding/truncation
            dataBuffer.writeMultiByte("testtes" + i, "ascii"); //, 8); // out_uint8a(s,
            // g_channels[i].name,
            // 8);
            dataBuffer.position=targetPos;
            dataBuffer.writeInt(0x00000040); // out_uint32_be(s,
            // g_channels[i].flags);
            // writing big-endian 0x40000000
        }
    }
    trace("sendMCSData: Data buffer length is",dataBuffer.length); // debug
    return dataBuffer;
}

আশাকরি এটা সাহায্য করবে.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.