Tôi đang cố đăng nhập vào RDP bằng AS3 (không khí). Tôi đang làm ok, xem xét việc thiếu các nguồn lực ra khỏi đó để hiểu được quá trình thực tế.Cố gắng đăng nhập vào RDP bằng AS3
Tôi đã vượt qua tên người dùng gửi ban đầu, nhận được phản hồi từ máy chủ và tôi hiện đang ở kết nối yêu cầu ban đầu.
Tôi gửi tất cả dữ liệu của mình và khi đánh hơi lưu lượng truy cập, tôi thấy rằng netmon nhận dạng chính xác loại gói tôi đang gửi (t125). Tôi là không phải là bị RDP ngắt kết nối và họ gửi gói ack
- nhưng tôi không nhận được phản hồi mà tôi mong đợi.
Tôi đã tham chiếu chéo với connectoid
, là ứng dụng khách RDP nguồn mở. Trong mã kết nối, tôi đang mắc kẹt nơi họ viết một hỗn hợp của các số nguyên nhỏ và lớn cuối.
Khi tôi nhìn vào các ví dụ hạn chế ra ở đó (giống như gói bãi), tôi thấy rằng chiều dài kết nối cho quá trình này là 412, nhưng bytearray
của tôi là giống như 470.
tôi đã chuyển đổi connectoid
phương pháp để những gì Tôi tin là đúng, nhưng với một hỗn hợp của loại cuối cùng, tôi vẫn không chắc chắn.
Tôi rất tiếc nếu điều này bị cắt xén, nhưng tôi đang cố hết sức để giúp bạn giúp tôi. Tôi sẽ đính kèm một số mã cho thấy những gì tôi đã cố gắng làm trong chuyển đổi.
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;
}
Bạn có thể nắm bắt gói dữ liệu vi phạm từ một khách hàng RDP tốt đã biết và so sánh với các gói bạn tò mò không? Nó có thể là một lỗi trong cách bạn mã hóa một phân đoạn của mảng byte của bạn. – Ben
Bạn có thể giải thích về ý nghĩa của bạn ở "kết nối yêu cầu ban đầu" không? Yêu cầu ban đầu đã được thông qua để bạn đăng nhập, do đó, không rõ chính xác trạng thái bạn đang mắc kẹt. Bạn đã gửi yêu cầu kết nối (0xe0) và nhận được xác nhận (0xd0) và bây giờ bạn đang ở giai đoạn "kết nối ban đầu"? Hoặc ở đâu đó tiếp tục xuống dòng sự kiện? Gói dữ liệu mà bạn tạo trong đoạn mã trên là gói "MCS: connect-initial"? –
Câu hỏi ngớ ngẩn nhưng bạn đã cố gắng tự RDP vào hộp đó để thấy rằng nó hoạt động? có thể có điều gì đó xảy ra để ngăn chặn đăng nhập như một biểu ngữ "máy này chỉ được phép sử dụng blah blah" –