AS3 (공중)을 사용하여 RDP에 로그인하려고합니다. 나는 실제 프로세스를 이해할 수있는 자원이 부족하다는 점을 감안하여 잘하고 있습니다.AS3을 사용하여 RDP에 로그인하려고 시도했습니다.
나는 초기 전송 사용자 이름을 지나쳐 서버로부터 응답을 받았고, 지금은 초기 요청 연결 상태입니다.
나는 모든 데이터를 보내고 있으며 트래픽을 스니핑 할 때 netmon은 내가 보내는 패킷의 종류를 정확히 인식하고 있습니다 (t125). 나는 이 아니며은 RDP에 의해 연결이 끊어졌으며 그들은 ack
패킷을 보냈지 만, 내가 기대하는 응답을받지 못했습니다.
나는 오픈 소스 RDP 클라이언트 인 connectoid
으로 상호 참조하고 있습니다. 연결 코드에서, 나는 그들이 작은 엔디안과 빅 엔디안 정수의 혼합을 쓰는 곳에서 붙어있다. 내가 거기 제한의 예를 볼 때
(자세한 패킷 덤프 등) 나는이 과정에 대한 연결 길이는 412이지만, 내 bytearray
더 I가 connectoid
방법을 변환 한 470
같은 것을 볼 것 나는 틀림 없다고 생각하지만, 엔디안 유형이 혼합되어서, 나는 아직도 확신 할 수 없다.
이것이 왜곡되면 유감이지만 도움을 드리기 위해 최선을 다하고 있습니다. 내가 변환하려고 시도한 것을 보여주는 몇 가지 코드를 첨부 할 것입니다.
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;
}
알려진 양호한 RDP 클라이언트로부터 문제의 패킷을 캡처하여 궁금한 패킷과 비교할 수 있습니까? 바이트 배열의 세그먼트를 인코딩하는 방법의 버그 일 수 있습니다. – Ben
"초기 요청 연결"에 있음을 의미하는 것을 자세히 설명해 주시겠습니까? 초기 요청이 이미 사용자가 로그인 할 수 있도록 전달되어야하므로 정확히 어떤 상태에 머물러 있는지 명확하지 않습니다. 연결 요청 (0xe0)을 보내고 확인 (0xd0)을 받았습니다. 이제 "연결 초기"단계에 있습니까? 아니면 어딘가에서 사건의 줄을 어딘가에? 위의 코드에서 생성 한 패킷이 "MCS : connect-initial"패킷입니까? –
어리석은 질문이지만 수동으로 해당 상자에 RDP가 작동하는지 확인해 보았습니까? 배너와 같은 로그인을 막는 일이 발생할 수 있습니다. "이 컴퓨터는 승인 된 용도로만 사용됩니다" –