mirror of
https://github.com/nmap/nmap.git
synced 2025-12-06 04:31:29 +00:00
Replaced nmap's hex dump functions with new hexdump() included in nbase. Before
Nmap used two functions: one of them, hdump(), just printed raw hex bytes
(no ASCII equivalents) and the other one, lamont_hdump() had a bug when
printing buffers where bufflen%16==3. A new function has been implemented
from scratch, that basically produces the same output as Wireshark.
Output looks like this:
0000 e8 60 65 86 d7 86 6d 30 35 97 54 87 ff 67 05 9e .`e...m05.T..g..
0010 07 5a 98 c0 ea ad 50 d2 62 4f 7b ff e1 34 f8 fc .Z....P.bO{..4..
0020 c4 84 0a 6a 39 ad 3c 10 63 b2 22 c4 24 40 f4 b1 ...j9.<.c.".$@..
Changes:
- The new hexdump() function has been added to nbase.
- Old hdump() and lamont_dump() have been removed from nmap's code.
- A wrapper to the new hexdump(), called nmap_hexdump(), has been added
to nmap's utils.cc. The wrapper basically prints the buffer returned
by hexdump() using nmap's log_write() function.
This commit is contained in:
@@ -317,7 +317,7 @@ int send_rpc_query(Target *target_host, unsigned short portno,
|
|||||||
/* Simply send this sucker we have created ... */
|
/* Simply send this sucker we have created ... */
|
||||||
do {
|
do {
|
||||||
if (o.debugging > 1)
|
if (o.debugging > 1)
|
||||||
hdump((unsigned char *) rpch, sizeof(struct rpc_hdr));
|
nmap_hexdump((unsigned char *) rpch, sizeof(struct rpc_hdr));
|
||||||
res = sendto(udp_rpc_socket, (char *)rpch, sizeof(struct rpc_hdr), 0,
|
res = sendto(udp_rpc_socket, (char *)rpch, sizeof(struct rpc_hdr), 0,
|
||||||
(struct sockaddr *) &sock, socklen);
|
(struct sockaddr *) &sock, socklen);
|
||||||
if (res == -1)
|
if (res == -1)
|
||||||
|
|||||||
@@ -4264,9 +4264,9 @@ static bool get_pcap_result(UltraScanInfo *USI, struct timeval *stime) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
error("Unexpected ICMP type/code 3/%d unreachable packet:",
|
error("Unexpected ICMP type/code 3/%d unreachable packet:\n",
|
||||||
icmp->icmp_code);
|
icmp->icmp_code);
|
||||||
hdump((unsigned char *)icmp, ntohs(ip->ip_len) -
|
nmap_hexdump((unsigned char *)icmp, ntohs(ip->ip_len) -
|
||||||
sizeof(struct ip));
|
sizeof(struct ip));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
2
tcpip.cc
2
tcpip.cc
@@ -2223,7 +2223,7 @@ if (!pd) fatal("NULL packet device passed to %s", __func__);
|
|||||||
fatal("FATAL: %s: bogus caplen from libpcap (%d) on interface type %d", __func__, head.caplen, datalink);
|
fatal("FATAL: %s: bogus caplen from libpcap (%d) on interface type %d", __func__, head.caplen, datalink);
|
||||||
}
|
}
|
||||||
error("FATAL: Unknown datalink type (%d). Caplen: %d; Packet:", datalink, head.caplen);
|
error("FATAL: Unknown datalink type (%d). Caplen: %d; Packet:", datalink, head.caplen);
|
||||||
lamont_hdump(p, head.caplen);
|
nmap_hexdump((unsigned char*)p, head.caplen);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
89
utils.cc
89
utils.cc
@@ -137,89 +137,18 @@ int wildtest(char *wild, char *test) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Wrapper for nbase function hexdump() */
|
||||||
|
void nmap_hexdump(unsigned char *cp, unsigned int length){
|
||||||
|
|
||||||
|
char *string=NULL;
|
||||||
/* Hex dump */
|
string = hexdump((u8*)cp, length);
|
||||||
void hdump(unsigned char *packet, unsigned int len) {
|
if(string){
|
||||||
unsigned int i=0, j=0;
|
log_write(LOG_PLAIN, "%s", string);
|
||||||
|
free(string);
|
||||||
log_write(LOG_PLAIN, "Here it is:\n");
|
}
|
||||||
|
return;
|
||||||
for(i=0; i < len; i++){
|
|
||||||
j = (unsigned) (packet[i]);
|
|
||||||
log_write(LOG_PLAIN, "%-2X ", j);
|
|
||||||
if (!((i+1)%16))
|
|
||||||
log_write(LOG_PLAIN, "\n");
|
|
||||||
else if (!((i+1)%4))
|
|
||||||
log_write(LOG_PLAIN, " ");
|
|
||||||
}
|
|
||||||
log_write(LOG_PLAIN, "\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* A better version of hdump, from Lamont Granquist. Modified slightly
|
|
||||||
by Fyodor (fyodor@insecure.org) */
|
|
||||||
void lamont_hdump(char *cp, unsigned int length) {
|
|
||||||
|
|
||||||
/* stolen from tcpdump, then kludged extensively */
|
|
||||||
|
|
||||||
static const char asciify[] = "................................ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~.................................................................................................................................";
|
|
||||||
|
|
||||||
const u_short *sp;
|
|
||||||
const u_char *ap;
|
|
||||||
unsigned char *bp = (unsigned char *) cp;
|
|
||||||
u_int i, j;
|
|
||||||
int nshorts, nshorts2;
|
|
||||||
int padding;
|
|
||||||
|
|
||||||
log_write(LOG_PLAIN, "\n\t");
|
|
||||||
padding = 0;
|
|
||||||
sp = (u_short *)bp;
|
|
||||||
ap = (u_char *)bp;
|
|
||||||
nshorts = (u_int) length / sizeof(u_short);
|
|
||||||
nshorts2 = (u_int) length / sizeof(u_short);
|
|
||||||
i = 0;
|
|
||||||
j = 0;
|
|
||||||
while(1) {
|
|
||||||
while (--nshorts >= 0) {
|
|
||||||
log_write(LOG_PLAIN, " %04x", ntohs(*sp));
|
|
||||||
sp++;
|
|
||||||
if ((++i % 8) == 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (nshorts < 0) {
|
|
||||||
if ((length & 1) && (((i-1) % 8) != 0)) {
|
|
||||||
log_write(LOG_PLAIN, " %02x ", *(u_char *)sp);
|
|
||||||
padding++;
|
|
||||||
}
|
|
||||||
nshorts = (8 - (nshorts2 - nshorts));
|
|
||||||
while(--nshorts >= 0) {
|
|
||||||
log_write(LOG_PLAIN, " ");
|
|
||||||
}
|
|
||||||
if (!padding) log_write(LOG_PLAIN, " ");
|
|
||||||
}
|
|
||||||
log_write(LOG_PLAIN, " ");
|
|
||||||
|
|
||||||
while (--nshorts2 >= 0) {
|
|
||||||
log_write(LOG_PLAIN, "%c%c", asciify[*ap], asciify[*(ap+1)]);
|
|
||||||
ap += 2;
|
|
||||||
if ((++j % 8) == 0) {
|
|
||||||
log_write(LOG_PLAIN, "\n\t");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (nshorts2 < 0) {
|
|
||||||
if ((length & 1) && (((j-1) % 8) != 0)) {
|
|
||||||
log_write(LOG_PLAIN, "%c", asciify[*ap]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((length & 1) && (((i-1) % 8) == 0)) {
|
|
||||||
log_write(LOG_PLAIN, " %02x", *(u_char *)sp);
|
|
||||||
log_write(LOG_PLAIN, " %c", asciify[*ap]);
|
|
||||||
}
|
|
||||||
log_write(LOG_PLAIN, "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef HAVE_STRERROR
|
#ifndef HAVE_STRERROR
|
||||||
char *strerror(int errnum) {
|
char *strerror(int errnum) {
|
||||||
|
|||||||
3
utils.h
3
utils.h
@@ -173,8 +173,7 @@ template<class T> T box(T bmin, T bmax, T bnum) {
|
|||||||
|
|
||||||
int wildtest(char *wild, char *test);
|
int wildtest(char *wild, char *test);
|
||||||
|
|
||||||
void hdump(unsigned char *packet, unsigned int len);
|
void nmap_hexdump(unsigned char *cp, unsigned int length);
|
||||||
void lamont_hdump(char *cp, unsigned int length);
|
|
||||||
|
|
||||||
/* Compare a canonical option name (e.g. "max-scan-delay") with a
|
/* Compare a canonical option name (e.g. "max-scan-delay") with a
|
||||||
user-generated option such as "max_scan_delay" and returns 0 if the
|
user-generated option such as "max_scan_delay" and returns 0 if the
|
||||||
|
|||||||
Reference in New Issue
Block a user