Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы / 2 / lab.05.by mice / spice / src / csp_parser

.cpp
Скачиваний:
9
Добавлен:
17.04.2013
Размер:
9.6 Кб
Скачать
/*******************************************************************************
* file:         csp_parser.h                                                   *
* version:      0.0.1                                                          *
* author:       d-evil [tmd] (mailto:d-evil.tmd@mail.ru)                       *
* description:  not available                                                  *
*******************************************************************************/

#include "csp_parser.h"


////////////////////////////////////////////////////////////////////////////////
// csp_parser public definitions
csp_parser::csp_parser() {
	_dtgm = NULL;
	_dtgm_sz = 0;
}


csp_parser::~csp_parser() {
}


int csp_parser::parse(char *const dtgm, const int sz, const bool resolve) {
	if (sizeof(header_ip) > sz) return -1;

	_dtgm = dtgm;
	_dtgm_sz = sz;
	++_id;

	_html = "<div class=\"dtgm\">";
	_parse_ip(resolve);
	_html.Append("</div>");

	return 0;
}


const char *csp_parser::proto_str(const int proto) {
	if (proto < sizeof(protocols)/sizeof(protocols[0])) {
		return protocols[proto];
	} else return proto_unknown_str;
}


////////////////////////////////////////////////////////////////////////////////
// csp_parser protected definitions
int csp_parser::_parse_ip(const bool resolve) {
	memcpy(&_header_ip, _dtgm, sizeof(header_ip));
	_header_ip.total_len = ntohs(_header_ip.total_len);
	_header_ip.flags = ntohs(_header_ip.flags);
	_header_ip.checksum = ntohs(_header_ip.checksum);

	SYSTEMTIME now;
	GetLocalTime(&now);
	_html.AppendFormat("<div class=\"dtgmh\">%02d:%02d:%02d ",now.wHour,now.wMinute,now.wSecond);
	CString from, to;
	from = inet_ntoa(*(in_addr *)&_header_ip.sourceIP);
	to = inet_ntoa(*(in_addr *)&_header_ip.destIP);
	if (resolve) {
		_addr_solver.set_host(from);
		if (NULL != _addr_solver.host() && 0 != strlen(_addr_solver.host()))
			from = _addr_solver.host();
		_addr_solver.set_host(to);
		if (NULL != _addr_solver.host() && 0 != strlen(_addr_solver.host()))
			to = _addr_solver.host();
	}

	_html.AppendFormat("<b>IP datagram from</b> %s <b>to</b> %s <b>Protocol: </b> %s <b>Service: </b>%i</div>",
		from, to, proto_str(_header_ip.proto), (int)_header_ip.type_of_service);

	_html.Append("<table cellspacing=0><tr><td class=\"hs\" valign=\"top\"><table cellspacing=\"0\"><tr><td colspan=2 class=\"iphc\">IP info</td></tr>");
	_html.AppendFormat("<tr><td class=\"iphi\">version:</td><td class=\"iphi\">%i</td></tr>", (int)_header_ip.ver);
	size_to_str(_header_ip.hlen*4, _str);
	_html.AppendFormat("<tr><td class=\"iphi\">ip header size:</td><td class=\"iphi\">%s</td></tr>", _str);
	size_to_str(_header_ip.total_len, _str);
	_html.AppendFormat("<tr><td class=\"iphi\">declared total size:</td><td class=\"iphi\">%s</td></tr>", _str);
	size_to_str(_dtgm_sz, _str);
	_html.AppendFormat("<tr><td class=\"iphi\"><i>true total size:</i></td><td class=\"iphi\">%s</td></tr>", _str);
	_html.AppendFormat("<tr><td class=\"iphi\">identification:</td><td class=\"iphi\">0x%x</td></tr>", (int)_header_ip.id);

	// flags
	if (_header_ip.flags & 0x4000) _str ="[DF]"; else _str="";
	if (_header_ip.flags & 0x2000) _str.Append("[MF]");
	int i = _header_ip.flags & 0x1FFF;
	_str.AppendFormat("[%i]", i);
	_html.AppendFormat("<tr><td class=\"iphi\">flags:</td><td class=\"iphi\">%s</td></tr>", _str);

	_html.AppendFormat("<tr><td class=\"iphi\">ttl:</td><td class=\"iphi\">%i</td></tr>", (int)_header_ip.ttl);
	_html.AppendFormat("<tr><td class=\"iphi\">checksum:</td><td class=\"iphi\">0x%x</td></tr>", (int)_header_ip.checksum);

	_parse_ip_params();

	_html.Append("</td><td class=\"dta\">");
	_html.Append("</td></tr>");
	_parse_proto();
	_html.Append("</table>");

	_html.Append("</td><td class=\"dta\" valign=\"top\">");
	_print_content();
	_html.Append("</td></tr></table>");

	return 0;
}


int csp_parser::_parse_ip_params() {
	return 0;
}


int csp_parser::_parse_proto() {
	_html.Append("<tr><td colspan=2 class=\"prhc\">Protocol info:</td></tr>");
	_proto_d = _dtgm + _header_ip.hlen*4;
	if (_proto_d > _dtgm + _dtgm_sz) {
		_proto_d = _dtgm;
		_proto_dsz = _dtgm_sz;
		return _parse_unknown();
	} else _proto_dsz = _dtgm_sz - _header_ip.hlen*4;

	switch (_header_ip.proto) {
		case IPPROTO_ICMP:	return _parse_icmp();
		// case IPPROTO_IGMP:	return _parse_icmp();
		case IPPROTO_UDP:	return _parse_udp();
		case IPPROTO_TCP:	return _parse_tcp();

		default: _parse_unknown(); break;
	}

	return -1;	// dummy return
}


int csp_parser::_parse_icmp() {
	header_icmp *icmp = (header_icmp *)_proto_d;

	_html.AppendFormat("<tr><td class=\"prhi\">type:</td><td class=\"prhi\">%s</td></tr>", _icmp_type_str(icmp->type));
	_html.AppendFormat("<tr><td class=\"prhi\">code:</td><td class=\"prhi\">0x%x</td></tr>", (int)icmp->code);
	_html.AppendFormat("<tr><td class=\"prhi\">checksum:</td><td class=\"prhi\">0x%x</td></tr>", ntohs(icmp->checksum));

	_data2pr = _proto_d + sizeof(*icmp);
	_data2pr_sz = _proto_dsz - sizeof(*icmp);

	return 0;
}


int csp_parser::_parse_udp() {
	header_udp *udp = (header_udp *)_proto_d;

	CString str;
	_html.AppendFormat("<tr><td class=\"prhi\">Source Port:</td><td class=\"prhi\">%i</td></tr>", ntohs(udp->src_port));
	_html.AppendFormat("<tr><td class=\"prhi\">Destination Port:</td><td class=\"prhi\">%i</td></tr>", ntohs(udp->dest_port));
	size_to_str(ntohs(udp->length), str);
	_html.AppendFormat("<tr><td class=\"prhi\">Length:</td><td class=\"prhi\">%s</td></tr>", str);
	_html.AppendFormat("<tr><td class=\"prhi\">Checksum:</td><td class=\"prhi\">0x%x</td></tr>", ntohs(udp->check_sum));

	_data2pr = _proto_d + sizeof(*udp);
	_data2pr_sz = _proto_dsz - sizeof(*udp);

	return 0;
}


int csp_parser::_parse_tcp() {
	header_tcp *tcp = (header_tcp *)_proto_d;

	_html.AppendFormat("<tr><td class=\"prhi\">Source Port:</td><td class=\"prhi\">%i</td></tr>", ntohs(tcp->src_port));
	_html.AppendFormat("<tr><td class=\"prhi\">Destination Port:</td><td class=\"prhi\">%i</td></tr>", ntohs(tcp->dest_port));
	_html.AppendFormat("<tr><td class=\"prhi\">Sequence Number:</td><td class=\"prhi\">0x%x</td></tr>", ntohl(tcp->seq_num));
	_html.AppendFormat("<tr><td class=\"prhi\">Acknowledgment Number:</td><td class=\"prhi\">0x%x</td></tr>", ntohl(tcp->ackn_num));
	_html.AppendFormat("<tr><td class=\"prhi\">Data offset:</td><td class=\"prhi\">0x%x</td></tr>", (int)tcp->data_offset);
	_html.AppendFormat("<tr><td class=\"prhi\">Reserved:</td><td class=\"prhi\">0x%x</td></tr>", (int)tcp->reserved);

	// flags
	CString str;
	if ((char)tcp->flags & 0x20) _str ="[URG]";
	if ((char)tcp->flags & 0x10) _str ="[ACK]";
	if ((char)tcp->flags & 0x08) _str ="[PSH]";
	if ((char)tcp->flags & 0x04) _str ="[RST]";
	if ((char)tcp->flags & 0x02) _str ="[SYN]";
	if ((char)tcp->flags & 0x01) _str ="[FIN]";
	if (0 >= str.GetLength()) str = "none";
	_html.AppendFormat("<tr><td class=\"prhi\">Flags:</td><td class=\"prhi\">%s</td></tr>", str);

	_html.AppendFormat("<tr><td class=\"prhi\">Window:</td><td class=\"prhi\">0x%x</td></tr>", ntohs(tcp->wnd));
	_html.AppendFormat("<tr><td class=\"prhi\">Checksum:</td><td class=\"prhi\">0x%x</td></tr>", ntohs(tcp->check_sum));
	_html.AppendFormat("<tr><td class=\"prhi\">Urgent Pointer:</td><td class=\"prhi\">0x%x</td></tr>", ntohs(tcp->urgent_ptr));

	_data2pr = _proto_d + sizeof(*tcp);
	_data2pr_sz = _proto_dsz - sizeof(*tcp);

	return 0;
}


int csp_parser::_parse_unknown() {
	_html.Append("<tr><td class=\"prhi\">not available</td><td class=\"prhi\">n/a</td></tr>");
	_data2pr = _proto_d;
	_data2pr_sz = _proto_dsz;

	return 0;
}


int csp_parser::_print_content() {
	_html.AppendFormat("<table cellspacing=\"0\"><tr><td class=\"ctbl\"><pre>");

	_str = "";
	char buf[12];
	buf[4] = ' ';
	buf[5] = ' ';
	buf[10] = '\n';
	buf[11] = '\0';
	for (int i = 7; i < _data2pr_sz; i+=8) {
		_html.AppendFormat("%02x %02x %02x %02x  %02x %02x %02x %02x\n",
					(BYTE)_data2pr[i-7], (BYTE)_data2pr[i-6], (BYTE)_data2pr[i-5], (BYTE)_data2pr[i-4],
					(BYTE)_data2pr[i-3], (BYTE)_data2pr[i-2], (BYTE)_data2pr[i-1], (BYTE)_data2pr[i-0]
		);
		buf[0] = (BYTE)_data2pr[i-7];
		buf[1] = (BYTE)_data2pr[i-6];
		buf[2] = (BYTE)_data2pr[i-5];
		buf[3] = (BYTE)_data2pr[i-4];
		buf[6] = (BYTE)_data2pr[i-3];
		buf[7] = (BYTE)_data2pr[i-2];
		buf[8] = (BYTE)_data2pr[i-1];
		buf[9] = (BYTE)_data2pr[i-0];
		for (int k = 9; 0 <= k; --k) {
			char &ch = buf[k];
			if ((unsigned char)' ' > (unsigned char)ch) ch = '?';
		}
		_str.Append(buf);
	}

	const int k = _data2pr_sz % 8;
	const int m = _data2pr_sz - k + 4;
	for (int i = _data2pr_sz - k; i < _data2pr_sz; ++i) {
		if (m == i) {
			_html.Append(" ");
			_str.Append("  ");
		}

		_html.AppendFormat("%02x ", (BYTE)_data2pr[i]);
		char ch = _data2pr[i];
		if ((unsigned char)' ' > (unsigned char)ch) ch = '?';
		_str.AppendFormat("%c", ch);
	}

	_html.Append("</pre></td><td class=\"ctbl\"><pre>");
	_str.Replace("&", "&amp;");
	_str.Replace("<", "&lt;");
	_str.Replace(">", "&gt;");
	_html.Append(_str);
	_html.AppendFormat("</pre></td></tr></table>");

	return 0;
}


const char *csp_parser::_icmp_type_str(const int type) {
	if (type < sizeof(icmp_types)/sizeof(icmp_types[0])) {
		return icmp_types[type];
	} else return icmp_types[1];
}


////////////////////////////////////////////////////////////////////////////////
// csp_parser private definitions
int csp_parser::_id = 0;
Соседние файлы в папке src