Добавил:
korayakov
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабы / 2 / lab.05.by mice / spice / src / csp_parser
.cpp/*******************************************************************************
* 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("&", "&");
_str.Replace("<", "<");
_str.Replace(">", ">");
_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