static int sendStartPacket() { if (startMode%3 == 2) /* 赛尔 */ { if (sendCount == 0) { printf(_(">> 寻找服务器...\n")); memcpy(sendPacket, STANDARD_ADDR, 6); memcpy(sendPacket+0x06, localMAC, 6); *(u_int32_t *)(sendPacket+0x0C) = htonl(0x888E0101); *(u_int16_t *)(sendPacket+0x10) = 0; memset(sendPacket+0x12, 0xa5, 42); setTimer(timeout); } return pcap_sendpacket(hPcap, sendPacket, 60); } if (sendCount == 0) { printf(_(">> 寻找服务器...\n")); fillStartPacket(); fillEtherAddr(0x888E0101); memcpy(sendPacket+0x12, fillBuf, fillSize); setTimer(timeout); } return pcap_sendpacket(hPcap, sendPacket, 0x3E8); }
void fillStartPacket() { if (bufType <= 1) { /* 使用xrgsu? */ const u_char packet0[] = { 0x00,0x00,0x13,0x11,0x38,0x30,0x32,0x31,0x78,0x2e,0x65,0x78,0x65,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x13,0x11,0x00,0x28,0x1a, 0x28,0x00,0x00,0x13,0x11,0x17,0x22,0x91,0x66,0x64,0x93,0x67,0x60,0x65,0x62,0x62, 0x94,0x61,0x69,0x67,0x63,0x91,0x93,0x92,0x68,0x66,0x93,0x91,0x66,0x95,0x65,0xaa, 0xdc,0x64,0x98,0x96,0x6a,0x9d,0x66,0x00,0x00,0x13,0x11,0x18,0x06,0x02,0x00,0x00 }; const u_char packet1[] = { 0x00,0x00,0x13,0x11,0x38,0x30,0x32,0x31,0x78,0x2e,0x65,0x78,0x65,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x04,0x0a,0x00,0x02,0x00,0x00,0x00,0x13,0x11,0x01,0x8c,0x1a, 0x28,0x00,0x00,0x13,0x11,0x17,0x22,0x36,0x38,0x44,0x43,0x31,0x32,0x33,0x42,0x37, 0x45,0x42,0x32,0x33,0x39,0x46,0x32,0x33,0x41,0x38,0x43,0x30,0x30,0x30,0x33,0x38, 0x38,0x34,0x39,0x38,0x36,0x33,0x39,0x1a,0x0c,0x00,0x00,0x13,0x11,0x18,0x06,0x00, 0x00,0x00,0x00,0x1a,0x0e,0x00,0x00,0x13,0x11,0x2d,0x08,0x00,0x00,0x00,0x00,0x00, 0x00,0x1a,0x08,0x00,0x00,0x13,0x11,0x2f,0x02,0x1a,0x09,0x00,0x00,0x13,0x11,0x35, 0x03,0x01,0x1a,0x18,0x00,0x00,0x13,0x11,0x36,0x12,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x18,0x00,0x00,0x13,0x11, 0x38,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x86, 0x13,0x4c,0x1a,0x88,0x00,0x00,0x13,0x11,0x4d,0x82,0x36,0x38,0x64,0x63,0x31,0x32, 0x33,0x62,0x30,0x37,0x65,0x62,0x32,0x33,0x39,0x66,0x32,0x33,0x61,0x38,0x30,0x64, 0x63,0x66,0x32,0x35,0x38,0x37,0x35,0x64,0x30,0x35,0x37,0x37,0x30,0x63,0x37,0x32, 0x31,0x65,0x34,0x35,0x36,0x34,0x35,0x65,0x35,0x33,0x37,0x61,0x62,0x33,0x35,0x31, 0x62,0x62,0x36,0x33,0x31,0x35,0x35,0x61,0x65,0x31,0x36,0x32,0x36,0x31,0x36,0x37, 0x65,0x62,0x30,0x39,0x32,0x32,0x33,0x65,0x32,0x61,0x30,0x61,0x37,0x38,0x30,0x33, 0x31,0x31,0x36,0x31,0x61,0x63,0x30,0x39,0x64,0x61,0x32,0x64,0x63,0x30,0x37,0x33, 0x36,0x39,0x33,0x61,0x34,0x66,0x35,0x61,0x32,0x39,0x32,0x38,0x36,0x37,0x35,0x31, 0x66,0x39,0x37,0x66,0x34,0x64,0x30,0x34,0x36,0x38,0x1a,0x28,0x00,0x00,0x13,0x11, 0x39,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x1a,0x48,0x00,0x00,0x13,0x11,0x54,0x42,0x48,0x55,0x53,0x54,0x4d,0x4f, 0x4f,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x08,0x00,0x00,0x13,0x11, 0x55,0x02,0x1a,0x09,0x00,0x00,0x13,0x11,0x62,0x03,0x00,0x00,0x00,0x00,0x00,0x00 }; u_char dhcp[] = {0x00}; if (dhcpMode == 1) /* 二次认证第一次 */ dhcp[0] = 0x01; if (bufType == 1) { memcpy(fillBuf+0x17, packet1, sizeof(packet1)); memcpy(fillBuf+0x3b, version, 2); } else memcpy(fillBuf+0x17, packet0, sizeof(packet0)); setProperty(0x18, dhcp, 1); setProperty(0x2D, localMAC, 6); } else if (readPacket(0) == -1) /* 读取数据失败就用默认的填充 */ fillStartPacket(); }
void fillMd5Packet(const u_char *md5Seed) { if (bufType <= 1) { /* 不使用数据包? */ /* xrgsu的Md5包与Start包只有一个字节的差异,若以其他版本为基础,可进一步区别对待 */ fillStartPacket(); if (bufType == 1) Check(md5Seed); } else { if (readPacket(1) == -1) fillMd5Packet(md5Seed); else Check(md5Seed); } echoNo = 0x0000102B; /* 初始化echoNo */ }
static int sendLogoffPacket() { setTimer(0); /* 取消定时器 */ if (startMode%3 == 2) /* 赛尔 */ { *(u_int16_t *)(sendPacket+0x0E) = htons(0x0102); *(u_int16_t *)(sendPacket+0x10) = 0; memset(sendPacket+0x12, 0xa5, 42); return pcap_sendpacket(hPcap, sendPacket, 60); } fillStartPacket(); /* 锐捷的退出包与Start包类似,不过其实不这样也是没问题的 */ fillEtherAddr(0x888E0102); memcpy(sendPacket+0x12, fillBuf, fillSize); return pcap_sendpacket(hPcap, sendPacket, 0x3E8); }