void ReceivePacketThread::recvArpScanPacket() { pcap_t *adhandle = this->handle; int res; struct pcap_pkthdr * pktHeader; const u_char * pktData; while (!scanIsFinished) { if ((res = pcap_next_ex(adhandle, &pktHeader, &pktData)) >= 0) { arppacket->setData(pktData); if ((arppacket->getEtherNetType()) == my_ntohs(ARP_TYPE) && ((arppacket->getOperationField()) == my_ntohs(ARP_REPLY)) ){ QPair<QString,QString> pair; pair.first = QString(my_iptos(arppacket->getSourceIpAdd())); pair.second = arppacket->getSourceMacAdd(); emit scanGetHostInfoSig(pair); // qDebug("-------------------------------------------\n"); // qDebug("IP Address: %s",my_iptos(arppacket->getSourceIpAdd())); // qDebug() << arppacket->getSourceMacAdd(); // qDebug("\n"); } } } }
bool CxImageSKA::Decode(CxFile *hFile) { if (hFile==NULL) return false; // read the header SKAHEADER ska_header; hFile->Read(&ska_header,sizeof(SKAHEADER),1); ska_header.Width = my_ntohs(ska_header.Width); ska_header.Height = my_ntohs(ska_header.Height); ska_header.dwUnknown = my_ntohl(ska_header.dwUnknown); // check header if (ska_header.dwUnknown != 0x01000000 || ska_header.Width > 0x7FFF || ska_header.Height > 0x7FFF || ska_header.BppExp != 3) return false; if (info.nEscape == -1){ head.biWidth = ska_header.Width ; head.biHeight= ska_header.Height; info.dwType = CXIMAGE_FORMAT_SKA; return true; } int bpp = 1<<ska_header.BppExp; Create(ska_header.Width,ska_header.Height,bpp,CXIMAGE_FORMAT_SKA); if (!IsValid()) return false; // read the palette int nColors = 1<<bpp; rgb_color* ppal = (rgb_color*)malloc(nColors*sizeof(rgb_color)); if (!ppal) return false; hFile->Read(ppal,nColors*sizeof(rgb_color),1); SetPalette(ppal,nColors); free(ppal); //read the image hFile->Read(GetBits(),ska_header.Width*ska_header.Height,1); //reorder rows if (GetEffWidth() != ska_header.Width){ BYTE *src,*dst; src = GetBits() + ska_header.Width*(ska_header.Height-1); dst = GetBits(ska_header.Height-1); for(int y=0;y<ska_header.Height;y++){ memcpy(dst,src,ska_header.Width); src -= ska_header.Width; dst -= GetEffWidth(); } } Flip(); return true; }
/* * Read the |index|'th entry out of the current book into |entry|. Note that * the files are always big-endian, so we need to byte swap on little-endian * platforms. */ void read_book_entry(int index, book_entry_t* entry) { fseek(book, index * 16, SEEK_SET); fread(entry, 16, 1, book); entry->key = my_ntohll(entry->key); entry->move = my_ntohs(entry->move); entry->weight = my_ntohs(entry->weight); entry->learn = my_ntohl(entry->learn); }
static void ICACHE_FLASH_ATTR captdnsRecv(void* arg, char *pusrdata, unsigned short length) { struct espconn *conn=(struct espconn *)arg; #else static void ICACHE_FLASH_ATTR captdnsRecv(struct sockaddr_in *premote_addr, char *pusrdata, unsigned short length) { #endif char buff[DNS_LEN]; char reply[DNS_LEN]; int i; char *rend=&reply[length]; char *p=pusrdata; DnsHeader *hdr=(DnsHeader*)p; DnsHeader *rhdr=(DnsHeader*)&reply[0]; p+=sizeof(DnsHeader); // printf("DNS packet: id 0x%X flags 0x%X rcode 0x%X qcnt %d ancnt %d nscount %d arcount %d len %d\n", // my_ntohs(&hdr->id), hdr->flags, hdr->rcode, my_ntohs(&hdr->qdcount), my_ntohs(&hdr->ancount), my_ntohs(&hdr->nscount), my_ntohs(&hdr->arcount), length); //Some sanity checks: if (length>DNS_LEN) return; //Packet is longer than DNS implementation allows if (length<sizeof(DnsHeader)) return; //Packet is too short if (hdr->ancount || hdr->nscount || hdr->arcount) return; //this is a reply, don't know what to do with it if (hdr->flags&FLAG_TC) return; //truncated, can't use this //Reply is basically the request plus the needed data memcpy(reply, pusrdata, length); rhdr->flags|=FLAG_QR; for (i=0; i<my_ntohs(&hdr->qdcount); i++) { //Grab the labels in the q string p=labelToStr(pusrdata, p, length, buff, sizeof(buff)); if (p==NULL) return; DnsQuestionFooter *qf=(DnsQuestionFooter*)p; p+=sizeof(DnsQuestionFooter); printf("DNS: Q (type 0x%X class 0x%X) for %s\n", my_ntohs(&qf->type), my_ntohs(&qf->class), buff); if (my_ntohs(&qf->type)==QTYPE_A) { //They want to know the IPv4 address of something. //Build the response. rend=strToLabel(buff, rend, sizeof(reply)-(rend-reply)); //Add the label if (rend==NULL) return; DnsResourceFooter *rf=(DnsResourceFooter *)rend; rend+=sizeof(DnsResourceFooter); setn16(&rf->type, QTYPE_A); setn16(&rf->class, QCLASS_IN); setn32(&rf->ttl, 0); setn16(&rf->rdlength, 4); //IPv4 addr is 4 bytes; //Grab the current IP of the softap interface struct ip_info info; wifi_get_ip_info(SOFTAP_IF, &info); *rend++=ip4_addr1(&info.ip); *rend++=ip4_addr2(&info.ip); *rend++=ip4_addr3(&info.ip); *rend++=ip4_addr4(&info.ip); setn16(&rhdr->ancount, my_ntohs(&rhdr->ancount)+1); // printf("Added A rec to resp. Resp len is %d\n", (rend-reply)); } else if (my_ntohs(&qf->type)==QTYPE_NS) {
//Parses a label into a C-string containing a dotted //Returns pointer to start of next fields in packet static char* ICACHE_FLASH_ATTR labelToStr(char *packet, char *labelPtr, int packetSz, char *res, int resMaxLen) { int i, j, k; char *endPtr=NULL; i=0; do { if ((*labelPtr&0xC0)==0) { j=*labelPtr++; //skip past length //Add separator period if there already is data in res if (i<resMaxLen && i!=0) res[i++]='.'; //Copy label to res for (k=0; k<j; k++) { if ((labelPtr-packet)>packetSz) return NULL; if (i<resMaxLen) res[i++]=*labelPtr++; } } else if ((*labelPtr&0xC0)==0xC0) { //Compressed label pointer endPtr=labelPtr+2; int offset=my_ntohs(((uint16_t *)labelPtr))&0x3FFF; //Check if offset points to somewhere outside of the packet if (offset>packetSz) return NULL; labelPtr=&packet[offset]; } //check for out-of-bound-ness if ((labelPtr-packet)>packetSz) return NULL; } while (*labelPtr!=0); res[i]=0; //zero-terminate if (endPtr==NULL) endPtr=labelPtr+1; return endPtr; }
bool CxImageSKA::Encode(CxFile * hFile) { if (EncodeSafeCheck(hFile)) return false; if(head.biBitCount > 8) { strcpy(info.szLastError,"SKA Images must be 8 bit or less"); return false; } SKAHEADER ska_header; ska_header.Width = (unsigned short)GetWidth(); ska_header.Height = (unsigned short)GetHeight(); ska_header.BppExp = 3; ska_header.dwUnknown = 0x01000000; ska_header.Width = my_ntohs(ska_header.Width); ska_header.Height = my_ntohs(ska_header.Height); ska_header.dwUnknown = my_ntohl(ska_header.dwUnknown); hFile->Write(&ska_header,sizeof(SKAHEADER),1); ska_header.Width = my_ntohs(ska_header.Width); ska_header.Height = my_ntohs(ska_header.Height); ska_header.dwUnknown = my_ntohl(ska_header.dwUnknown); if (head.biBitCount<8) IncreaseBpp(8); rgb_color pal[256]; for(int idx=0; idx<256; idx++){ GetPaletteColor(idx,&(pal[idx].r),&(pal[idx].g),&(pal[idx].b)); } hFile->Write(pal,256*sizeof(rgb_color),1); BYTE* src = GetBits(ska_header.Height-1); for(int y=0;y<ska_header.Height;y++){ hFile->Write(src,ska_header.Width,1); src -= GetEffWidth(); } return true; }
char *dump_str(unsigned char **d) { static char buff[256]; int size; unsigned char *p; p = *d; size = my_ntohs(p); memcpy(buff, p+2, size); buff[size] = 0; *d += size + 2; return buff; }
void packet_client_setenckey(unsigned char* buff, int len) { unsigned char rsa_out[4096]; unsigned char depad_out[4096]; unsigned char tmp_symkey[SYMKEY_SIZE+4]; unsigned long x, y; int err; int chunk_size; int symkeysize; int outpos = 0; /* first two bytes are unknown */ buff += 2; len -= 2; /* key is made up of blocks which are padded then crypted. They come on the wire as 2 bytes size (net order) then data */ while (len > 0) { chunk_size = (buff[0] << 8) | buff[1]; buff += 2; len -= 2; x = sizeof(rsa_out); if ((err = rsa_exptmod(buff, chunk_size, rsa_out, &x, PK_PRIVATE, &key)) != CRYPT_OK) { printf("rsa_exptmod failed: %s\n", error_to_string(err)); return; } y = sizeof(depad_out); if ((err = rsa_depad(rsa_out, x, depad_out, &y)) != CRYPT_OK) { printf("rsa_depad failed: %s\n", error_to_string(err)); return; } memcpy(&tmp_symkey[outpos], depad_out, y); outpos += y; // printf("packet_client_setenckey has %lu bytes\n", y); buff += chunk_size; len -= chunk_size; } /* first 4 bytes are WORD keysize twice (net order) */ symkeysize = my_ntohs(tmp_symkey); //(tmp_symkey[0] << 8) | tmp_symkey[1]; setup_sbox_from_key(&tmp_symkey[4], symkeysize); printf("Client sent symmetric key (%d bytes)...\n", symkeysize); }
/* 注册的hook函数的实现 */ unsigned int hook_func(unsigned int hooknum, struct sk_buff *skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) { struct sk_buff *sb = skb; struct iphdr * iph = ip_hdr(sb); if (sb && iph && memcmp(&iph->saddr, my_ip, 3) != 0 && memcmp(&iph->daddr, my_ip, 4) == 0) { //printk("Dropped packet (%d)\n", num++); printk("%d.%d.%d.%d -> %d.%d.%d.%d protocol=%d len=%d\n", ((unsigned char*)(&(iph->saddr)))[0], ((unsigned char*)(&(iph->saddr)))[1], ((unsigned char*)(&(iph->saddr)))[2], ((unsigned char*)(&(iph->saddr)))[3], ((unsigned char*)(&(iph->daddr)))[0], ((unsigned char*)(&(iph->daddr)))[1], ((unsigned char*)(&(iph->daddr)))[2], ((unsigned char*)(&(iph->daddr)))[3], (iph->protocol), my_ntohs((iph->tot_len))); /* int len = my_ntohs((iph->tot_len)); int i; for (i=20;i<len; i++) { printk("%c", ((char *)iph)[i]); } printk("\n"); */ return NF_DROP; } else { return NF_ACCEPT; } }
bool CxImageICO::Decode(CxFile *hFile) { if (hFile==NULL) return false; DWORD off = hFile->Tell(); //<yuandi> int page=info.nFrame; //internal icon structure indexes // read the first part of the header ICONHEADER icon_header; hFile->Read(&icon_header,sizeof(ICONHEADER),1); icon_header.idType = my_ntohs(icon_header.idType); icon_header.idCount = my_ntohs(icon_header.idCount); // check if it's an icon or a cursor if ((icon_header.idReserved == 0) && ((icon_header.idType == 1)||(icon_header.idType == 2))) { info.nNumFrames = icon_header.idCount; // load the icon descriptions ICONDIRENTRY *icon_list = (ICONDIRENTRY *)malloc(icon_header.idCount * sizeof(ICONDIRENTRY)); int c; for (c = 0; c < icon_header.idCount; c++) { hFile->Read(icon_list + c, sizeof(ICONDIRENTRY), 1); icon_list[c].wPlanes = my_ntohs(icon_list[c].wPlanes); icon_list[c].wBitCount = my_ntohs(icon_list[c].wBitCount); icon_list[c].dwBytesInRes = my_ntohl(icon_list[c].dwBytesInRes); icon_list[c].dwImageOffset = my_ntohl(icon_list[c].dwImageOffset); } if ((page>=0)&&(page<icon_header.idCount)){ if (info.nEscape == -1) { // Return output dimensions only head.biWidth = icon_list[page].bWidth; head.biHeight = icon_list[page].bHeight; #if CXIMAGE_SUPPORT_PNG if (head.biWidth==0 && head.biHeight==0) { // Vista icon support hFile->Seek(off + icon_list[page].dwImageOffset, SEEK_SET); CxImage png; png.SetEscape(-1); if (png.Decode(hFile,CXIMAGE_FORMAT_PNG)){ Transfer(png); info.nNumFrames = icon_header.idCount; } } #endif //CXIMAGE_SUPPORT_PNG free(icon_list); info.dwType = CXIMAGE_FORMAT_ICO; return true; } // get the bit count for the colors in the icon <CoreyRLucier> BITMAPINFOHEADER bih; hFile->Seek(off + icon_list[page].dwImageOffset, SEEK_SET); if (icon_list[page].bWidth==0 && icon_list[page].bHeight==0) { // Vista icon support #if CXIMAGE_SUPPORT_PNG CxImage png; if (png.Decode(hFile,CXIMAGE_FORMAT_PNG)){ Transfer(png); info.nNumFrames = icon_header.idCount; } SetType(CXIMAGE_FORMAT_ICO); #endif //CXIMAGE_SUPPORT_PNG } else { // standard icon hFile->Read(&bih,sizeof(BITMAPINFOHEADER),1); bihtoh(&bih); c = bih.biBitCount; // allocate memory for one icon Create(icon_list[page].bWidth,icon_list[page].bHeight, c, CXIMAGE_FORMAT_ICO); //image creation // read the palette RGBQUAD pal[256]; if (bih.biClrUsed) hFile->Read(pal,bih.biClrUsed*sizeof(RGBQUAD), 1); else hFile->Read(pal,head.biClrUsed*sizeof(RGBQUAD), 1); SetPalette(pal,head.biClrUsed); //palette assign //read the icon if (c<=24){ hFile->Read(info.pImage, head.biSizeImage, 1); } else { // 32 bit icon BYTE* buf=(BYTE*)malloc(4*head.biHeight*head.biWidth); BYTE* src = buf; hFile->Read(buf, 4*head.biHeight*head.biWidth, 1); #if CXIMAGE_SUPPORT_ALPHA if (!AlphaIsValid()) AlphaCreate(); #endif //CXIMAGE_SUPPORT_ALPHA for (long y = 0; y < head.biHeight; y++) { BYTE* dst = GetBits(y); for(long x=0;x<head.biWidth;x++){ *dst++=src[0]; *dst++=src[1]; *dst++=src[2]; #if CXIMAGE_SUPPORT_ALPHA AlphaSet(x,y,src[3]); #endif //CXIMAGE_SUPPORT_ALPHA src+=4; } } free(buf); } // apply the AND and XOR masks int maskwdt = ((head.biWidth+31) / 32) * 4; //line width of AND mask (always 1 Bpp) int masksize = head.biHeight * maskwdt; //size of mask BYTE *mask = (BYTE *)malloc(masksize); if (hFile->Read(mask, masksize, 1)){ bool bGoodMask=false; for (int im=0;im<masksize;im++){ if (mask[im]!=255){ bGoodMask=true; break; } } if (bGoodMask && c != 32){ #if CXIMAGE_SUPPORT_ALPHA bool bNeedAlpha = false; if (!AlphaIsValid()){ AlphaCreate(); } else { bNeedAlpha=true; //32bit icon } int x,y; for (y = 0; y < head.biHeight; y++) { for (x = 0; x < head.biWidth; x++) { if (((mask[y*maskwdt+(x>>3)]>>(7-x%8))&0x01)){ AlphaSet(x,y,0); bNeedAlpha=true; } } } if (!bNeedAlpha) AlphaDelete(); #endif //CXIMAGE_SUPPORT_ALPHA //check if there is only one transparent color RGBQUAD cc,ct; long* pcc = (long*)&cc; long* pct = (long*)&ct; int nTransColors=0; int nTransIndex=0; for (y = 0; y < head.biHeight; y++){ for (x = 0; x < head.biWidth; x++){ if (((mask[y*maskwdt+(x>>3)] >> (7-x%8)) & 0x01)){ cc = GetPixelColor(x,y,false); if (nTransColors==0){ nTransIndex = GetPixelIndex(x,y); nTransColors++; ct = cc; } else { if (*pct!=*pcc){ nTransColors++; } } } } } if (nTransColors==1){ SetTransColor(ct); SetTransIndex(nTransIndex); #if CXIMAGE_SUPPORT_ALPHA AlphaDelete(); //because we have a unique transparent color in the image #endif //CXIMAGE_SUPPORT_ALPHA } // <vho> - Transparency support w/o Alpha support if (c <= 8){ // only for icons with less than 256 colors (XP icons need alpha). // find a color index, which is not used in the image // it is almost sure to find one, bcs. nobody uses all possible colors for an icon BYTE colorsUsed[256]; memset(colorsUsed, 0, sizeof(colorsUsed)); for (y = 0; y < head.biHeight; y++){ for (x = 0; x < head.biWidth; x++){ colorsUsed[BlindGetPixelIndex(x,y)] = 1; } } int iTransIdx = -1; for (x = (int)(head.biClrUsed-1); x>=0 ; x--){ if (colorsUsed[x] == 0){ iTransIdx = x; // this one is not in use. we may use it as transparent color break; } } // Go thru image and set unused color as transparent index if needed if (iTransIdx >= 0){ bool bNeedTrans = false; for (y = 0; y < head.biHeight; y++){ for (x = 0; x < head.biWidth; x++){ // AND mask (Each Byte represents 8 Pixels) if (((mask[y*maskwdt+(x>>3)] >> (7-x%8)) & 0x01)){ // AND mask is set (!=0). This is a transparent part SetPixelIndex(x, y, (BYTE)iTransIdx); bNeedTrans = true; } } } // set transparent index if needed if (bNeedTrans) SetTransIndex(iTransIdx); #if CXIMAGE_SUPPORT_ALPHA AlphaDelete(); //because we have a transparent color in the palette #endif //CXIMAGE_SUPPORT_ALPHA } } } else if(c != 32){
static int socksserver_connect_request(socksserver* srv, int fd) { fdinfo* client = &srv->clients[fdindex(fd)]; size_t i = 0; unsigned char dlen = 0; unsigned char* buf = client->data->buf; int flags, ret; host_info addr; struct addrinfo addrbuf; struct sockaddr sockbuf; memset(&addr, 0, sizeof(addr)); memset(&addrbuf, 0, sizeof(addrbuf)); memset(&sockbuf, 0, sizeof(sockbuf)); addrbuf.ai_addr = &sockbuf; addr.hostaddr = &addrbuf; if(!client->data->start) return -1; if(buf[i++] != 5) return EC_NOT_ALLOWED; // check first byte whenever the message length is > 0 to not waste resources on maldoers if(client->data->start < 1+1+1+1+4+2) return -1; if(buf[i++] != 1) return EC_COMMAND_NOT_SUPPORTED; // we support only the connect method. if(buf[i++] != 0) return EC_GENERAL_FAILURE; switch(buf[i++]) { case 1: //ipv4 memcpy(&((struct sockaddr_in*) addr.hostaddr->ai_addr)->sin_addr, buf + 4, 4); memcpy(&((struct sockaddr_in*) addr.hostaddr->ai_addr)->sin_port, buf + 8, 2); ((struct sockaddr_in*) addr.hostaddr->ai_addr)->sin_family = PF_INET; addr.hostaddr->ai_addr->sa_family = PF_INET; addr.hostaddr->ai_addrlen = sizeof(struct sockaddr_in); break; case 3: //dns if(CONFIG_DNS) { dlen = buf[i++]; if(client->data->start < 1U+1U+1U+1U+1U+dlen+2U) return -1; addr.port = my_ntohs(buf + i + dlen); buf[i + dlen] = 0; addr.host = (char*) (buf + i); if(CONFIG_IPV6) addr.hostaddr = NULL; if(!resolve_host(&addr)) { if(CONFIG_IPV6) { memcpy(&addrbuf, addr.hostaddr, sizeof(struct addrinfo)); freeaddrinfo(addr.hostaddr); addr.hostaddr = &addrbuf; } } else goto notsupported; break; } else goto notsupported; case 4: //ipv6 if(CONFIG_IPV6) { if(client->data->start < 1+1+1+1+16+2) return -1; memcpy(&((struct sockaddr_in6*) addr.hostaddr->ai_addr)->sin6_addr, buf + 4, 16); memcpy(&((struct sockaddr_in6*) addr.hostaddr->ai_addr)->sin6_port, buf + 20, 2); ((struct sockaddr_in6*) addr.hostaddr->ai_addr)->sin6_family = PF_INET6; addr.hostaddr->ai_addr->sa_family = PF_INET6; addr.hostaddr->ai_addrlen = sizeof(struct sockaddr_in6); break; } default: notsupported: return EC_ADDRESSTYPE_NOT_SUPPORTED; } client->target_fd = socket(addr.hostaddr->ai_addr->sa_family, SOCK_STREAM, 0); if(client->target_fd == -1) { neterror: switch(errno) { case ENETDOWN: case ENETUNREACH: case ENETRESET: return EC_NET_UNREACHABLE; case EHOSTUNREACH: case EHOSTDOWN: return EC_HOST_UNREACHABLE; case ECONNREFUSED: return EC_CONN_REFUSED; default: return EC_GENERAL_FAILURE; } } if(client->target_fd >= MAX_FD) { close(client->target_fd); return EC_GENERAL_FAILURE; } flags = fcntl(client->target_fd, F_GETFL); if(flags == -1) return EC_GENERAL_FAILURE; if(fcntl(client->target_fd, F_SETFL, flags | O_NONBLOCK) == -1) return EC_GENERAL_FAILURE; ret = connect(client->target_fd, addr.hostaddr->ai_addr, addr.hostaddr->ai_addrlen); if(ret == -1) { ret = errno; if (!(ret == EINPROGRESS || ret == EWOULDBLOCK)) goto neterror; } srv->clients[fdindex(client->target_fd)].state = SS_SOCKSTARGET; srv->clients[fdindex(client->target_fd)].data = client->data; srv->clients[fdindex(client->target_fd)].target_fd = fd; rocksockserver_watch_fd(&srv->serva, client->target_fd); if(CONFIG_LOG && srv->log) { if(get_client_ip((struct sockaddr_storage*) addr.hostaddr->ai_addr, (char*) buf, CLIENT_BUFSIZE)) { logstart(); printfd(fd); LOGPUTS(1, SPLITERAL(" -> ")); printfd(client->target_fd); LOGPUT(1, VARISL(" <"), VARIC((char*)buf), VARISL(">"), NULL); } } return EC_SUCCESS; }