mirror of
https://github.com/nmap/nmap.git
synced 2025-12-06 04:31:29 +00:00
Merge from /nmap-exp/luis/nmap-os6.
svn merge --ignore-ancestry svn://svn.insecure.org/nmap@26621 svn://svn.insecure.org/nmap-exp/luis/nmap-os6 This is the IPv6 OS detection branch. "nmap -6 -O" works now, though at this point it only prints fingerprints and not OS guesses, because we need to collect more submissions.
This commit is contained in:
2582
FPEngine.cc
Normal file
2582
FPEngine.cc
Normal file
File diff suppressed because it is too large
Load Diff
437
FPEngine.h
Normal file
437
FPEngine.h
Normal file
@@ -0,0 +1,437 @@
|
||||
|
||||
/***************************************************************************
|
||||
* FPEngine.h -- Header info for IPv6 OS detection via TCP/IP *
|
||||
* fingerprinting. For more information on how this works in Nmap, see *
|
||||
* http://insecure.org/osdetect/ *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
#ifndef __FPENGINE_H__
|
||||
#define __FPENGINE_H__ 1
|
||||
|
||||
#include "nsock.h"
|
||||
#include <list>
|
||||
#include <vector>
|
||||
#include "nmap.h"
|
||||
#include "libnetutil/npacket.h"
|
||||
using namespace std;
|
||||
|
||||
/* Mention some classes here so we don't have to place the declarations in
|
||||
* the right order (otherwise the compiler complains). */
|
||||
class FPHost;
|
||||
class FPHost6;
|
||||
class FPProbe;
|
||||
|
||||
class Target;
|
||||
class FingerPrintResultsIPv6;
|
||||
|
||||
/******************************************************************************
|
||||
* CONSTANT DEFINITIONS *
|
||||
******************************************************************************/
|
||||
|
||||
#define NELEMS(a) (sizeof(a) / sizeof((a)[0]))
|
||||
|
||||
#define NUM_FP_PROBES_IPv6_TCP 13
|
||||
#define NUM_FP_PROBES_IPv6_ICMPv6 4
|
||||
#define NUM_FP_PROBES_IPv6_UDP 1
|
||||
/* Total number of IPv6 OS detection probes. */
|
||||
#define NUM_FP_PROBES_IPv6 (NUM_FP_PROBES_IPv6_TCP+NUM_FP_PROBES_IPv6_ICMPv6+NUM_FP_PROBES_IPv6_UDP)
|
||||
|
||||
const unsigned int OSDETECT_FLOW_LABEL = 0x12345;
|
||||
|
||||
|
||||
|
||||
/* Number of timed probes for IPv6 OS scan. This is, the number of probes that
|
||||
* have specific timing requirements and need to be processed together. This
|
||||
* are the probes that are sent 100ms apart. */
|
||||
#define NUM_FP_TIMEDPROBES_IPv6 6
|
||||
|
||||
/* Initial congestion window. It is set to the number of timed probes because
|
||||
* hosts need to be able to schedule all of them at once. */
|
||||
#define OSSCAN_INITIAL_CWND (NUM_FP_TIMEDPROBES_IPv6)
|
||||
|
||||
/* Initial Slow Start threshold. It is set to four times the initial CWND. */
|
||||
#define OSSCAN_INITIAL_SSTHRESH (4 * OSSCAN_INITIAL_CWND)
|
||||
|
||||
/* Host group size is the number of osscan hosts that are processed in parallel.
|
||||
* Note that this osscan engine always keeps a working group of this many hosts.
|
||||
* in other words, if one host in the group finishes, another is added to it
|
||||
* dynamically. */
|
||||
#define OSSCAN_GROUP_SIZE 10
|
||||
|
||||
/* Initial retransmission timeout. This is the time we initially wait for a
|
||||
* probe response before retransmitting the original probe. Note that this is
|
||||
* only the initial RTO, used only when no RTT measures have been taken yet.
|
||||
* The actual RTO varies each time we get a response to a probe.
|
||||
* It is set to 3 seconds (3*10^6 usecs) as per RFC 2988. */
|
||||
#define OSSCAN_INITIAL_RTO (3*1000000)
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* CLASS DEFINITIONS *
|
||||
******************************************************************************/
|
||||
|
||||
/* This class handles the access to the network. It handles packet transmission
|
||||
* scheduling, packet capture and congestion control. Every FPHost should be
|
||||
* linked to the same instance of this class, so the access to the network can
|
||||
* be managed globally (for the whole OS detection process). */
|
||||
class FPNetworkControl {
|
||||
|
||||
private:
|
||||
nsock_pool nsp; /* Nsock pool. */
|
||||
nsock_iod pcap_nsi; /* Nsock Pcap descriptor. */
|
||||
nsock_event_id pcap_ev_id; /* Last pcap read event that was scheduled. */
|
||||
bool first_pcap_scheduled; /* True if we scheduled the first pcap read event. */
|
||||
bool nsock_init; /* True if the nsock pool has been initialized. */
|
||||
int rawsd; /* Raw socket. */
|
||||
vector<FPHost *> callers; /* List of users of this instance (used for callbacks).*/
|
||||
int probes_sent; /* Number of unique probes sent (not retransmissions). */
|
||||
int responses_recv; /* Number of probe responses received. */
|
||||
int probes_timedout; /* Number of probes that timeout after all retransms. */
|
||||
float cc_cwnd; /* Current congestion window. */
|
||||
float cc_ssthresh; /* Current Slow Start threshold. */
|
||||
|
||||
int cc_init();
|
||||
int cc_update_sent(int pkts);
|
||||
int cc_report_drop();
|
||||
int cc_update_received();
|
||||
|
||||
public:
|
||||
FPNetworkControl();
|
||||
~FPNetworkControl();
|
||||
void init(const char *ifname, devtype iftype);
|
||||
int register_caller(FPHost *newcaller);
|
||||
int unregister_caller(FPHost *oldcaller);
|
||||
int setup_sniffer(const char *iface, const char *bfp_filter);
|
||||
void handle_events();
|
||||
int scheduleProbe(FPProbe *pkt, int in_msecs_time);
|
||||
void probe_transmission_handler(nsock_pool nsp, nsock_event nse, void *arg);
|
||||
void response_reception_handler(nsock_pool nsp, nsock_event nse, void *arg);
|
||||
bool request_slots(size_t num_packets);
|
||||
int cc_report_final_timeout();
|
||||
|
||||
};
|
||||
|
||||
/* +-----------+
|
||||
| FPEngine |
|
||||
+-----------+
|
||||
| |
|
||||
+-----+-----+
|
||||
|
|
||||
+-------+-------+
|
||||
| |
|
||||
| |
|
||||
+-----------+ +-----------+
|
||||
| FPEngine4 | | FPEngine6 |
|
||||
+-----------+ +-----------+
|
||||
| | | |
|
||||
+-----------+ +-----------+ */
|
||||
/* This class is the generic fingerprinting engine. */
|
||||
class FPEngine {
|
||||
|
||||
protected:
|
||||
size_t osgroup_size;
|
||||
|
||||
public:
|
||||
FPEngine();
|
||||
~FPEngine();
|
||||
void reset();
|
||||
virtual int os_scan(vector<Target *> &Targets) = 0;
|
||||
const char *bpf_filter(vector<Target *> &Targets);
|
||||
|
||||
};
|
||||
|
||||
|
||||
/* This class handles IPv6 OS fingerprinting. Using it is very simple, just
|
||||
* instance it and then call os_scan() with the list of IPv6 targets to
|
||||
* fingerprint. If everything goes well, the internal state of the supplied
|
||||
* target objects will be modified to reflect the results of the fingerprinting
|
||||
* process. */
|
||||
class FPEngine6 : public FPEngine {
|
||||
|
||||
private:
|
||||
vector<FPHost6 *> fphosts; /* Information about each target to fingerprint */
|
||||
|
||||
public:
|
||||
FPEngine6();
|
||||
~FPEngine6();
|
||||
void reset();
|
||||
int os_scan(vector<Target *> &Targets);
|
||||
|
||||
};
|
||||
|
||||
|
||||
/* +----------+
|
||||
| FPPacket |
|
||||
+----------+
|
||||
| |
|
||||
+-----+----+
|
||||
|
|
||||
|
|
||||
+-----------+
|
||||
| FPProbe |
|
||||
+-----------+
|
||||
| |
|
||||
+-----+-----+ */
|
||||
/* This class represents a generic packet for the OS fingerprinting process */
|
||||
class FPPacket {
|
||||
|
||||
protected:
|
||||
PacketElement *pkt; /* Actual packet associated with this FPPacket */
|
||||
bool link_eth; /* Ethernet layer required? */
|
||||
struct eth_nfo eth_hdr; /* Eth info, valid when this->link_eth==true */
|
||||
struct timeval pkt_time; /* Time at which the packet was sent or received */
|
||||
|
||||
int resetTime();
|
||||
void __reset();
|
||||
|
||||
public:
|
||||
FPPacket();
|
||||
~FPPacket();
|
||||
int setTime(const struct timeval *tv = NULL);
|
||||
struct timeval getTime() const;
|
||||
int setPacket(PacketElement *pkt);
|
||||
int setEthernet(const u8 *src_mac, const u8 *dst_mac, const char *devname);
|
||||
const struct eth_nfo *getEthernet() const;
|
||||
const PacketElement *getPacket() const;
|
||||
size_t getLength() const;
|
||||
u8 *getPacketBuffer(size_t *pkt_len) const;
|
||||
bool is_set() const;
|
||||
|
||||
};
|
||||
|
||||
/* This class represents a generic OS fingerprinting probe. In other words, it
|
||||
* represents a network packet that Nmap sends to a target in order to
|
||||
* obtain information about the target's TCP/IP stack. */
|
||||
class FPProbe : public FPPacket {
|
||||
|
||||
private:
|
||||
char *probe_id;
|
||||
int probe_no;
|
||||
int retransmissions;
|
||||
int times_replied;
|
||||
bool failed;
|
||||
bool timed;
|
||||
|
||||
public:
|
||||
FPHost *host;
|
||||
|
||||
FPProbe();
|
||||
~FPProbe();
|
||||
void reset();
|
||||
bool isResponse(PacketElement *rcvd);
|
||||
int setProbeID(const char *id);
|
||||
const char *getProbeID() const;
|
||||
int getRetransmissions() const;
|
||||
int incrementRetransmissions();
|
||||
int getReplies() const;
|
||||
int incrementReplies();
|
||||
int setTimeSent();
|
||||
int resetTimeSent();
|
||||
struct timeval getTimeSent() const;
|
||||
bool probeFailed() const;
|
||||
int setFailed();
|
||||
bool isTimed() const;
|
||||
int setTimed();
|
||||
|
||||
};
|
||||
|
||||
/* This class represents a generic received packet. */
|
||||
struct FPResponse {
|
||||
const char *probe_id;
|
||||
u8 *buf;
|
||||
size_t len;
|
||||
struct timeval senttime, rcvdtime;
|
||||
|
||||
FPResponse(const char *probe_id, const u8 *buf, size_t len,
|
||||
struct timeval senttime, struct timeval rcvdtime);
|
||||
~FPResponse();
|
||||
};
|
||||
|
||||
|
||||
/* +-----------+
|
||||
| FPHost |
|
||||
+-----------+
|
||||
| |
|
||||
+-----+-----+
|
||||
|
|
||||
+-------+-------+
|
||||
| |
|
||||
| |
|
||||
+-----------+ +-----------+
|
||||
| FPHost4 | | FPHost6 |
|
||||
+-----------+ +-----------+
|
||||
| | | |
|
||||
+-----------+ +-----------+ */
|
||||
/* This class represents a generic host to be fingerprinted. */
|
||||
class FPHost {
|
||||
|
||||
protected:
|
||||
unsigned int total_probes; /* Number of different OS scan probes to be sent to targets */
|
||||
unsigned int timed_probes; /* Number of probes that have specific timing requirements */
|
||||
unsigned int probes_sent; /* Number of FPProbes sent (not counting retransmissions) */
|
||||
unsigned int probes_answered; /* Number of FPResponses received */
|
||||
unsigned int probes_unanswered; /* Number of FPProbes that timedout (after all retransmissions) */
|
||||
bool detection_done; /* True if the OS detection process has been completed. */
|
||||
bool timedprobes_sent; /* True if the probes that have timing requirements were sent */
|
||||
Target *target_host; /* Info about the host to fingerprint */
|
||||
FPNetworkControl *netctl; /* Link to the network manager (for scheduling and CC) */
|
||||
bool netctl_registered; /* True if we are already registered in the network controller */
|
||||
u32 tcpSeqBase; /* Base for sequence numbers set in outgoing probes */
|
||||
int open_port_tcp; /* Open TCP port to be used in the OS detection probes */
|
||||
int closed_port_tcp; /* Closed TCP port for the OS detection probes. */
|
||||
int closed_port_udp; /* Closed UDP port. */
|
||||
int tcp_port_base; /* Send TCP probes starting with this port number. */
|
||||
int udp_port_base; /* Send UDP probes with this port number. */
|
||||
u16 icmp_seq_counter; /* ICMPv6 sequence number counter. */
|
||||
int rto; /* Retransmission timeout for the host */
|
||||
int rttvar; /* Round-Trip Time variation (RFC 2988) */
|
||||
int srtt; /* Smoothed Round-Trip Time (RFC 2988) */
|
||||
|
||||
void __reset();
|
||||
int update_RTO(int measured_rtt_usecs, bool retransmission);
|
||||
int choose_osscan_ports();
|
||||
|
||||
private:
|
||||
virtual int build_probe_list() = 0;
|
||||
|
||||
public:
|
||||
struct timeval begin_time;
|
||||
|
||||
FPHost();
|
||||
~FPHost();
|
||||
virtual bool done() = 0;
|
||||
virtual int schedule() = 0;
|
||||
virtual int callback(const u8 *pkt, size_t pkt_len, const struct timeval *tv) = 0;
|
||||
const struct sockaddr_storage *getTargetAddress();
|
||||
|
||||
};
|
||||
|
||||
/* This class represents IPv6 hosts to be fingerprinted. The class performs
|
||||
* OS detection asynchronously. To use it, shedule() must be called at regular
|
||||
* intervals until done() returns true. After that, status() will indicate
|
||||
* whether the host was successfully matched with a particular OS or not. */
|
||||
class FPHost6 : public FPHost {
|
||||
|
||||
private:
|
||||
FPProbe fp_probes[NUM_FP_PROBES_IPv6]; /* OS detection probes to be sent.*/
|
||||
FPResponse *fp_responses[NUM_FP_PROBES_IPv6]; /* Received responses. */
|
||||
FPResponse *aux_resp[NUM_FP_TIMEDPROBES_IPv6]; /* Aux vector for timed responses */
|
||||
|
||||
int build_probe_list();
|
||||
int set_done_and_wrap_up();
|
||||
|
||||
public:
|
||||
FPHost6(Target *tgt, FPNetworkControl *fpnc);
|
||||
~FPHost6();
|
||||
void reset();
|
||||
void init(Target *tgt, FPNetworkControl *fpnc);
|
||||
void finish();
|
||||
bool done();
|
||||
int schedule();
|
||||
int callback(const u8 *pkt, size_t pkt_len, const struct timeval *tv);
|
||||
const FPProbe *getProbe(const char *id);
|
||||
const FPResponse *getResponse(const char *id);
|
||||
|
||||
void fill_FPR(FingerPrintResultsIPv6 *FPR);
|
||||
|
||||
};
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* Nsock handler wrappers. *
|
||||
******************************************************************************/
|
||||
|
||||
void probe_transmission_handler_wrapper(nsock_pool nsp, nsock_event nse, void *arg);
|
||||
void response_reception_handler_wrapper(nsock_pool nsp, nsock_event nse, void *arg);
|
||||
|
||||
|
||||
std::vector<FingerMatch> load_fp_matches();
|
||||
|
||||
|
||||
#endif /* __FPENGINE_H__ */
|
||||
1590
FPmodel.cc
Normal file
1590
FPmodel.cc
Normal file
File diff suppressed because it is too large
Load Diff
@@ -104,12 +104,18 @@ FingerPrintResults::FingerPrintResults() {
|
||||
osscan_opentcpport = osscan_closedtcpport = osscan_closedudpport = -1;
|
||||
distance = -1;
|
||||
distance_guess = -1;
|
||||
FPs = (FingerPrint **) safe_zalloc(o.maxOSTries() * sizeof(FingerPrint *));
|
||||
maxTimingRatio = 0;
|
||||
numFPs = 0;
|
||||
}
|
||||
|
||||
FingerPrintResults::~FingerPrintResults() {
|
||||
}
|
||||
|
||||
FingerPrintResultsIPv4::FingerPrintResultsIPv4() {
|
||||
FPs = (FingerPrint **) safe_zalloc(o.maxOSTries() * sizeof(FingerPrint *));
|
||||
numFPs = 0;
|
||||
}
|
||||
|
||||
FingerPrintResultsIPv4::~FingerPrintResultsIPv4() {
|
||||
int i;
|
||||
|
||||
/* Free OS fingerprints of OS scanning was done */
|
||||
@@ -121,6 +127,25 @@ FingerPrintResults::~FingerPrintResults() {
|
||||
free(FPs);
|
||||
}
|
||||
|
||||
FingerPrintResultsIPv6::FingerPrintResultsIPv6() {
|
||||
unsigned int i;
|
||||
|
||||
begin_time.tv_sec = 0;
|
||||
begin_time.tv_usec = 0;
|
||||
for (i = 0; i < sizeof(fp_responses) / sizeof(*fp_responses); i++)
|
||||
fp_responses[i] = NULL;
|
||||
flow_label = 0;
|
||||
}
|
||||
|
||||
FingerPrintResultsIPv6::~FingerPrintResultsIPv6() {
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < sizeof(fp_responses) / sizeof(*fp_responses); i++) {
|
||||
if (fp_responses[i])
|
||||
delete fp_responses[i];
|
||||
}
|
||||
}
|
||||
|
||||
const struct OS_Classification_Results *FingerPrintResults::getOSClassification() {
|
||||
if (!isClassified) { populateClassification(); isClassified = true; }
|
||||
return &OSR;
|
||||
@@ -178,6 +203,19 @@ const char *FingerPrintResults::OmitSubmissionFP() {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* IPv6 classification is more robust to errors than IPv4, so apply less
|
||||
stringent conditions than the general OmitSubmissionFP. */
|
||||
const char *FingerPrintResultsIPv6::OmitSubmissionFP() {
|
||||
static char reason[128];
|
||||
|
||||
if (o.scan_delay > 500) { // This can screw up the sequence timing
|
||||
Snprintf(reason, sizeof(reason), "Scan delay (%d) is greater than 500", o.scan_delay);
|
||||
return reason;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* Goes through fingerprinting results to populate OSR */
|
||||
void FingerPrintResults::populateClassification() {
|
||||
@@ -196,8 +234,8 @@ void FingerPrintResults::populateClassification() {
|
||||
|
||||
for(printno = 0; printno < num_matches; printno++) {
|
||||
// a single print may have multiple classifications
|
||||
for (osclass = prints[printno]->OS_class.begin();
|
||||
osclass != prints[printno]->OS_class.end();
|
||||
for (osclass = matches[printno]->OS_class.begin();
|
||||
osclass != matches[printno]->OS_class.end();
|
||||
osclass++) {
|
||||
if (!classAlreadyExistsInResults(&*osclass)) {
|
||||
// Then we have to add it ... first ensure we have room
|
||||
@@ -217,7 +255,7 @@ void FingerPrintResults::populateClassification() {
|
||||
// OK, we will add the new class
|
||||
OSR.OSC[OSR.OSC_num_matches] = &*osclass;
|
||||
OSR.OSC_Accuracy[OSR.OSC_num_matches] = accuracy[printno];
|
||||
if (accuracy[printno] == 1.0) OSR.OSC_num_perfect_matches++;
|
||||
if (printno < num_perfect_matches) OSR.OSC_num_perfect_matches++;
|
||||
OSR.OSC_num_matches++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -97,6 +97,7 @@ class FingerPrintResults;
|
||||
|
||||
#include "nmap.h"
|
||||
#include "global_structures.h"
|
||||
#include "FPEngine.h"
|
||||
|
||||
/* Maximum number of results allowed in one of these things ... */
|
||||
#define MAX_FP_RESULTS 36
|
||||
@@ -112,11 +113,11 @@ struct OS_Classification_Results {
|
||||
class FingerPrintResults {
|
||||
public: /* For now ... a lot of the data members should be made private */
|
||||
FingerPrintResults();
|
||||
~FingerPrintResults();
|
||||
virtual ~FingerPrintResults();
|
||||
|
||||
double accuracy[MAX_FP_RESULTS]; /* Percentage of match (1.0 == perfect
|
||||
match) in same order as pritns[] below */
|
||||
FingerPrint *prints[MAX_FP_RESULTS]; /* ptrs to matching references --
|
||||
FingerMatch *matches[MAX_FP_RESULTS]; /* ptrs to matching references --
|
||||
highest accuracy matches first */
|
||||
int num_perfect_matches; /* Number of 1.0 accuracy matches in prints[] */
|
||||
int num_matches; /* Total number of matches in prints[] */
|
||||
@@ -147,14 +148,13 @@ class FingerPrintResults {
|
||||
consistancy standpoint. */
|
||||
double maxTimingRatio;
|
||||
|
||||
FingerPrint **FPs; /* Fingerprint data obtained from host */
|
||||
int numFPs;
|
||||
|
||||
/* If the fingerprint is of potentially poor quality, we don't want to
|
||||
print it and ask the user to submit it. In that case, the reason
|
||||
for skipping the FP is returned as a static string. If the FP is
|
||||
great and should be printed, NULL is returned. */
|
||||
const char *OmitSubmissionFP();
|
||||
virtual const char *OmitSubmissionFP();
|
||||
|
||||
virtual const char *merge_fpr(const Target *currenths, bool isGoodFP, bool wrapit) const = 0;
|
||||
|
||||
private:
|
||||
bool isClassified; // Whether populateClassification() has been called
|
||||
@@ -165,4 +165,27 @@ class FingerPrintResults {
|
||||
struct OS_Classification_Results OSR;
|
||||
};
|
||||
|
||||
class FingerPrintResultsIPv4 : public FingerPrintResults {
|
||||
public:
|
||||
FingerPrint **FPs; /* Fingerprint data obtained from host */
|
||||
int numFPs;
|
||||
|
||||
FingerPrintResultsIPv4();
|
||||
virtual ~FingerPrintResultsIPv4();
|
||||
const char *merge_fpr(const Target *currenths, bool isGoodFP, bool wrapit) const;
|
||||
};
|
||||
|
||||
class FingerPrintResultsIPv6 : public FingerPrintResults {
|
||||
public:
|
||||
FPResponse *fp_responses[NUM_FP_PROBES_IPv6];
|
||||
struct timeval begin_time;
|
||||
/* The flow label we set in our sent packets, for calculating offsets later. */
|
||||
unsigned int flow_label;
|
||||
|
||||
FingerPrintResultsIPv6();
|
||||
virtual ~FingerPrintResultsIPv6();
|
||||
const char *OmitSubmissionFP();
|
||||
const char *merge_fpr(const Target *currenths, bool isGoodFP, bool wrapit) const;
|
||||
};
|
||||
|
||||
#endif /* FINGERPRINTRESULTS_H */
|
||||
|
||||
24
Makefile.in
24
Makefile.in
@@ -17,8 +17,10 @@ NMAPDEVDIR=~/nmap-private-dev
|
||||
export NBASEDIR=@NBASEDIR@
|
||||
export NSOCKDIR=@NSOCKDIR@
|
||||
export LIBLUADIR = @LIBLUADIR@
|
||||
export LIBLINEARDIR = @LIBLINEARDIR@
|
||||
export NDIR=$(shell pwd)
|
||||
export LIBLUA_LIBS = @LIBLUA_LIBS@
|
||||
export LIBLINEAR_LIBS = @LIBLINEAR_LIBS@
|
||||
export NCATDIR=@NCATDIR@
|
||||
CC = @CC@
|
||||
CXX = @CXX@
|
||||
@@ -47,7 +49,7 @@ export CFLAGS = $(CXXFLAGS)
|
||||
# CFLAGS = $(DEFS) $(INCLS)
|
||||
STATIC =
|
||||
LDFLAGS = @LDFLAGS@ $(DBGFLAGS) $(STATIC)
|
||||
LIBS = @LIBNBASE_LIBS@ @LIBNSOCK_LIBS@ @LIBPCRE_LIBS@ @LIBPCAP_LIBS@ $(OPENSSL_LIBS) libnetutil/libnetutil.a @LIBDNET_LIBS@ @LIBLUA_LIBS@ @LIBS@
|
||||
LIBS = @LIBNBASE_LIBS@ @LIBNSOCK_LIBS@ @LIBPCRE_LIBS@ @LIBPCAP_LIBS@ $(OPENSSL_LIBS) libnetutil/libnetutil.a @LIBDNET_LIBS@ @LIBLUA_LIBS@ @LIBLINEAR_LIBS@ @LIBS@
|
||||
OPENSSL_LIBS = @OPENSSL_LIBS@
|
||||
# LIBS = -lefence @LIBS@
|
||||
# LIBS = -lrmalloc @LIBS@
|
||||
@@ -93,20 +95,20 @@ NSE_OBJS+=nse_openssl.o nse_ssl_cert.o
|
||||
endif
|
||||
endif
|
||||
|
||||
export SRCS = main.cc nmap.cc targets.cc tcpip.cc nmap_error.cc utils.cc idle_scan.cc osscan.cc osscan2.cc output.cc payload.cc scan_engine.cc timing.cc charpool.cc services.cc protocols.cc nmap_rpc.cc portlist.cc NmapOps.cc TargetGroup.cc Target.cc FingerPrintResults.cc service_scan.cc NmapOutputTable.cc MACLookup.cc nmap_tty.cc nmap_dns.cc traceroute.cc portreasons.cc xml.cc $(NSE_SRC) @COMPAT_SRCS@
|
||||
export SRCS = main.cc nmap.cc targets.cc tcpip.cc nmap_error.cc utils.cc idle_scan.cc osscan.cc osscan2.cc FPEngine.cc FPmodel.cc output.cc payload.cc scan_engine.cc timing.cc charpool.cc services.cc protocols.cc nmap_rpc.cc portlist.cc NmapOps.cc TargetGroup.cc Target.cc FingerPrintResults.cc service_scan.cc NmapOutputTable.cc MACLookup.cc nmap_tty.cc nmap_dns.cc traceroute.cc portreasons.cc xml.cc $(NSE_SRC) @COMPAT_SRCS@
|
||||
|
||||
export HDRS = charpool.h FingerPrintResults.h global_structures.h idle_scan.h MACLookup.h nmap_amigaos.h nmap_dns.h nmap_error.h nmap.h NmapOps.h NmapOutputTable.h nmap_rpc.h nmap_tty.h nmap_winconfig.h osscan.h osscan2.h output.h payload.h portlist.h protocols.h scan_engine.h service_scan.h services.h TargetGroup.h Target.h targets.h tcpip.h timing.h utils.h traceroute.h portreasons.h xml.h $(NSE_HDRS)
|
||||
export HDRS = charpool.h FingerPrintResults.h global_structures.h idle_scan.h MACLookup.h nmap_amigaos.h nmap_dns.h nmap_error.h nmap.h NmapOps.h NmapOutputTable.h nmap_rpc.h nmap_tty.h nmap_winconfig.h osscan.h osscan2.h FPEngine.h output.h payload.h portlist.h protocols.h scan_engine.h service_scan.h services.h TargetGroup.h Target.h targets.h tcpip.h timing.h utils.h traceroute.h portreasons.h xml.h $(NSE_HDRS)
|
||||
|
||||
OBJS = main.o nmap.o targets.o tcpip.o nmap_error.o utils.o idle_scan.o osscan.o osscan2.o output.o payload.o scan_engine.o timing.o charpool.o services.o protocols.o nmap_rpc.o portlist.o NmapOps.o TargetGroup.o Target.o FingerPrintResults.o service_scan.o NmapOutputTable.o MACLookup.o nmap_tty.o nmap_dns.o traceroute.o portreasons.o xml.o $(NSE_OBJS) @COMPAT_OBJS@
|
||||
OBJS = main.o nmap.o targets.o tcpip.o nmap_error.o utils.o idle_scan.o osscan.o osscan2.o FPEngine.o FPmodel.o output.o payload.o scan_engine.o timing.o charpool.o services.o protocols.o nmap_rpc.o portlist.o NmapOps.o TargetGroup.o Target.o FingerPrintResults.o service_scan.o NmapOutputTable.o MACLookup.o nmap_tty.o nmap_dns.o traceroute.o portreasons.o xml.o $(NSE_OBJS) @COMPAT_OBJS@
|
||||
|
||||
# %.o : %.cc -- nope this is a GNU extension
|
||||
.cc.o:
|
||||
$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@
|
||||
|
||||
all: @LUA_BUILD@ @PCAP_BUILD@ @PCRE_BUILD@ @DNET_BUILD@ @NBASE_BUILD@ @NSOCK_BUILD@ @NCAT_BUILD@ netutil_build
|
||||
all: @LUA_BUILD@ @LIBLINEAR_BUILD@ @PCAP_BUILD@ @PCRE_BUILD@ @DNET_BUILD@ @NBASE_BUILD@ @NSOCK_BUILD@ @NCAT_BUILD@ netutil_build
|
||||
$(MAKE) $(TARGET) $(BUILDZENMAP) $(BUILDNDIFF) $(BUILDNPING)
|
||||
|
||||
$(TARGET): @LUA_DEPENDS@ @PCAP_DEPENDS@ @PCRE_DEPENDS@ @DNET_DEPENDS@ $(NBASEDIR)/libnbase.a $(NSOCKDIR)/src/libnsock.a libnetutil/libnetutil.a $(OBJS)
|
||||
$(TARGET): @LUA_DEPENDS@ @LIBLINEAR_DEPENDS@ @PCAP_DEPENDS@ @PCRE_DEPENDS@ @DNET_DEPENDS@ $(NBASEDIR)/libnbase.a $(NSOCKDIR)/src/libnsock.a libnetutil/libnetutil.a $(OBJS)
|
||||
@echo Compiling nmap
|
||||
rm -f $@
|
||||
$(CXX) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
|
||||
@@ -138,6 +140,9 @@ ncat_build: $(NCATDIR)/Makefile nbase_build nsock_build $(NCATDIR)/ncat.h
|
||||
lua_build: $(LIBLUADIR)/Makefile
|
||||
@echo Compiling liblua; cd $(LIBLUADIR) && $(MAKE) liblua.a CC="$(CC)" MYCFLAGS="$(CFLAGS) @LUA_CFLAGS@"
|
||||
|
||||
liblinear_build: $(LIBLINEARDIR)/Makefile
|
||||
@echo Compiling liblinear; cd $(LIBLINEARDIR) && $(MAKE) liblinear.a CC="$(CC)" CFLAGS="$(CFLAGS)"
|
||||
|
||||
#$(LIBPCAPDIR)/Makefile:
|
||||
# @echo Configuring libpcap; cd $(LIBPCAPDIR); ./configure
|
||||
|
||||
@@ -166,7 +171,7 @@ release-rpms:
|
||||
web:
|
||||
cd $(NMAPDEVDIR) && $(MAKE) web
|
||||
|
||||
clean: @LUA_CLEAN@ @PCAP_CLEAN@ @PCRE_CLEAN@ @DNET_CLEAN@ nsock_clean nbase_clean netutil_clean my_clean @NPING_CLEAN@ @ZENMAP_CLEAN@ @NCAT_CLEAN@
|
||||
clean: @LUA_CLEAN@ @LIBLINEAR_CLEAN@ @PCAP_CLEAN@ @PCRE_CLEAN@ @DNET_CLEAN@ nsock_clean nbase_clean netutil_clean my_clean @NPING_CLEAN@ @ZENMAP_CLEAN@ @NCAT_CLEAN@
|
||||
|
||||
my_clean:
|
||||
rm -f dependencies.mk makefile.dep
|
||||
@@ -187,6 +192,8 @@ ncat_clean:
|
||||
-cd $(NCATDIR) && $(MAKE) clean
|
||||
lua_clean:
|
||||
-cd $(LIBLUADIR) && $(MAKE) clean
|
||||
liblinear_clean:
|
||||
-cd $(LIBLINEARDIR) && $(MAKE) clean
|
||||
zenmap_clean:
|
||||
-cd $(ZENMAPDIR) && $(PYTHON) setup.py clean --all
|
||||
ndiff_clean:
|
||||
@@ -201,6 +208,7 @@ dnet_dist_clean:
|
||||
-cd $(LIBDNETDIR) && $(MAKE) distclean
|
||||
lua_dist_clean:
|
||||
-cd $(LIBLUADIR) && $(MAKE) clean
|
||||
liblinear_dist_clean: liblinear_clean
|
||||
nbase_dist_clean:
|
||||
-cd $(NBASEDIR) && $(MAKE) distclean
|
||||
nsock_dist_clean:
|
||||
@@ -218,7 +226,7 @@ nping_dist_clean:
|
||||
debugclean:
|
||||
rm -f *.gcov *.gcda *.gcno gmon.out
|
||||
|
||||
distclean: my_clean my_distclean @LUA_DIST_CLEAN@ @PCAP_DIST_CLEAN@ @PCRE_DIST_CLEAN@ @DNET_DIST_CLEAN@ @NPING_DIST_CLEAN@ @ZENMAP_DIST_CLEAN@ @NCAT_DIST_CLEAN@ nsock_dist_clean nbase_dist_clean netutil_dist_clean
|
||||
distclean: my_clean my_distclean @LUA_DIST_CLEAN@ @LIBLINEAR_DIST_CLEAN@ @PCAP_DIST_CLEAN@ @PCRE_DIST_CLEAN@ @DNET_DIST_CLEAN@ @NPING_DIST_CLEAN@ @ZENMAP_DIST_CLEAN@ @NCAT_DIST_CLEAN@ nsock_dist_clean nbase_dist_clean netutil_dist_clean
|
||||
|
||||
my_distclean:
|
||||
rm -f Makefile Makefile.bak makefile.dep nmap_config.h stamp-h stamp-h.in \
|
||||
|
||||
@@ -326,6 +326,7 @@ void NmapOps::Initialize() {
|
||||
ipopt_firsthop = 0;
|
||||
ipopt_lasthop = 0;
|
||||
release_memory = false;
|
||||
disable_ipv6_os_results = true;
|
||||
topportlevel = -1;
|
||||
#ifndef NOLUA
|
||||
script = 0;
|
||||
@@ -526,7 +527,7 @@ dialog where you can start NPF if you have administrator privileges.";
|
||||
fatal("--min-rate=%g must be less than or equal to --max-rate=%g", min_packet_send_rate, max_packet_send_rate);
|
||||
}
|
||||
|
||||
if (af() == AF_INET6 && (generate_random_ips|numdecoys|osscan|bouncescan|fragscan|idlescan)) {
|
||||
if (af() == AF_INET6 && (generate_random_ips|numdecoys|bouncescan|fragscan|idlescan)) {
|
||||
fatal("Sorry -- IPv6 support is currently only available for TCP, UDP, and SCTP port scans and list scan (-sL). OS detection, random targets and decoys are also not supported with IPv6. Further support is under consideration.");
|
||||
}
|
||||
|
||||
|
||||
@@ -187,6 +187,7 @@ class NmapOps {
|
||||
int nogcc; /* Turn off group congestion control with --nogcc */
|
||||
int generate_random_ips; /* -iR option */
|
||||
FingerPrintDB *reference_FPs; /* Used in the new OS scan system. */
|
||||
std::vector<FingerMatch> os_labels_ipv6;
|
||||
u16 magic_port;
|
||||
unsigned short magic_port_set; /* Was this set by user? */
|
||||
|
||||
@@ -351,6 +352,11 @@ class NmapOps {
|
||||
bool noninteractive;
|
||||
|
||||
bool release_memory; /* suggest to release memory before quitting. used to find memory leaks. */
|
||||
|
||||
/* This is a temporary option that disables the printing of IPv6 OS results,
|
||||
to allow collection of more fingerprints. */
|
||||
bool disable_ipv6_os_results;
|
||||
|
||||
private:
|
||||
int max_os_tries;
|
||||
int max_rtt_timeout;
|
||||
|
||||
27
Target.cc
27
Target.cc
@@ -113,6 +113,7 @@ void Target::Initialize() {
|
||||
targetname = NULL;
|
||||
memset(&seq, 0, sizeof(seq));
|
||||
distance = -1;
|
||||
distance_calculation_method = DIST_METHOD_NONE;
|
||||
FPR = NULL;
|
||||
osscan_flag = OS_NOTPERF;
|
||||
weird_responses = flags = 0;
|
||||
@@ -124,6 +125,7 @@ void Target::Initialize() {
|
||||
targetsocklen = sourcesocklen = nexthopsocklen = 0;
|
||||
directly_connected = -1;
|
||||
targetipstring[0] = '\0';
|
||||
sourceipstring[0] = '\0';
|
||||
nameIPBuf = NULL;
|
||||
memset(&MACaddress, 0, sizeof(MACaddress));
|
||||
memset(&SrcMACaddress, 0, sizeof(SrcMACaddress));
|
||||
@@ -177,7 +179,7 @@ void Target::FreeInternal() {
|
||||
|
||||
/* Creates a "presentation" formatted string out of the IPv4/IPv6 address.
|
||||
Called when the IP changes */
|
||||
void Target::GenerateIPString() {
|
||||
void Target::GenerateTargetIPString() {
|
||||
struct sockaddr_in *sin = (struct sockaddr_in *) &targetsock;
|
||||
#if HAVE_IPV6
|
||||
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) &targetsock;
|
||||
@@ -195,6 +197,26 @@ void Target::GenerateIPString() {
|
||||
}
|
||||
}
|
||||
|
||||
/* Creates a "presentation" formatted string out of the IPv4/IPv6 address.
|
||||
Called when the IP changes */
|
||||
void Target::GenerateSourceIPString() {
|
||||
struct sockaddr_in *sin = (struct sockaddr_in *) &sourcesock;
|
||||
#if HAVE_IPV6
|
||||
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) &sourcesock;
|
||||
#endif
|
||||
|
||||
if (inet_ntop(sin->sin_family, (sin->sin_family == AF_INET)?
|
||||
(char *) &sin->sin_addr :
|
||||
#if HAVE_IPV6
|
||||
(char *) &sin6->sin6_addr,
|
||||
#else
|
||||
(char *) NULL,
|
||||
#endif
|
||||
sourceipstring, sizeof(sourceipstring)) == NULL) {
|
||||
fatal("Failed to convert source address to presentation format!?! Error: %s", strerror(socket_errno()));
|
||||
}
|
||||
}
|
||||
|
||||
/* Returns the address family of the destination address. */
|
||||
int Target::af() const {
|
||||
return targetsock.ss_family;
|
||||
@@ -233,7 +255,7 @@ void Target::setTargetSockAddr(const struct sockaddr_storage *ss, size_t ss_len)
|
||||
}
|
||||
memcpy(&targetsock, ss, ss_len);
|
||||
targetsocklen = ss_len;
|
||||
GenerateIPString();
|
||||
GenerateTargetIPString();
|
||||
/* The ports array needs to know a name too */
|
||||
ports.setIdStr(targetipstr());
|
||||
}
|
||||
@@ -286,6 +308,7 @@ void Target::setSourceSockAddr(const struct sockaddr_storage *ss, size_t ss_len)
|
||||
assert(ss_len > 0 && ss_len <= sizeof(*ss));
|
||||
memcpy(&sourcesock, ss, ss_len);
|
||||
sourcesocklen = ss_len;
|
||||
GenerateSourceIPString();
|
||||
}
|
||||
|
||||
// Returns IPv4 host address or {0} if unavailable.
|
||||
|
||||
9
Target.h
9
Target.h
@@ -185,6 +185,8 @@ class Target {
|
||||
const struct in6_addr *v6sourceip() const;
|
||||
/* The IPv4 or IPv6 literal string for the target host */
|
||||
const char *targetipstr() const { return targetipstring; }
|
||||
/* The IPv4 or IPv6 literal string for the source address */
|
||||
const char *sourceipstr() const { return sourceipstring; }
|
||||
/* Give the name from the last setHostName() call, which should be
|
||||
the name obtained from reverse-resolution (PTR query) of the IP (v4
|
||||
or v6). If the name has not been set, or was set to NULL, an empty
|
||||
@@ -315,12 +317,15 @@ class Target {
|
||||
private:
|
||||
void Initialize();
|
||||
void FreeInternal(); // Free memory allocated inside this object
|
||||
// Creates a "presentation" formatted string out of the IPv4/IPv6 address
|
||||
void GenerateIPString();
|
||||
// Creates a "presentation" formatted string out of the target's IPv4/IPv6 address
|
||||
void GenerateTargetIPString();
|
||||
// Creates a "presentation" formatted string out of the source IPv4/IPv6 address.
|
||||
void GenerateSourceIPString();
|
||||
struct sockaddr_storage targetsock, sourcesock, nexthopsock;
|
||||
size_t targetsocklen, sourcesocklen, nexthopsocklen;
|
||||
int directly_connected; // -1 = unset; 0 = no; 1 = yes
|
||||
char targetipstring[INET6_ADDRSTRLEN];
|
||||
char sourceipstring[INET6_ADDRSTRLEN];
|
||||
char *nameIPBuf; /* for the NameIP(void) function to return */
|
||||
u8 MACaddress[6], SrcMACaddress[6], NextHopMACaddress[6];
|
||||
bool MACaddress_set, SrcMACaddress_set, NextHopMACaddress_set;
|
||||
|
||||
127
configure
vendored
127
configure
vendored
@@ -606,6 +606,12 @@ NSOCKDIR
|
||||
LIBNBASE_LIBS
|
||||
NBASE_BUILD
|
||||
NBASEDIR
|
||||
LIBLINEAR_DIST_CLEAN
|
||||
LIBLINEAR_CLEAN
|
||||
LIBLINEAR_BUILD
|
||||
LIBLINEAR_DEPENDS
|
||||
LIBLINEARDIR
|
||||
LIBLINEAR_LIBS
|
||||
INSTALLNSE
|
||||
LUA_DIST_CLEAN
|
||||
LUA_CLEAN
|
||||
@@ -741,6 +747,7 @@ with_libpcap
|
||||
with_libpcre
|
||||
with_libdnet
|
||||
with_liblua
|
||||
with_liblinear
|
||||
with_libnbase
|
||||
with_libnsock
|
||||
with_ncat
|
||||
@@ -1403,6 +1410,28 @@ Optional Packages:
|
||||
--with-liblua=included Use the liblua version included with Nmap
|
||||
--without-liblua Compile without lua (this will exclude all of NSE
|
||||
from compilation)
|
||||
--with-liblinear=DIR Use an existing (compiled) liblinear from
|
||||
DIR/include and DIR/lib.
|
||||
--with-liblinear=included
|
||||
Use the liblinear version included with Nmap
|
||||
case "$with_liblinear" in
|
||||
yes)
|
||||
;;
|
||||
included)
|
||||
CPPFLAGS="-I\$(top_srcdir)/$LIBLINEARDIR $CPPFLAGS"
|
||||
LIBLINEAR_LIBS="\$(top_srcdir)/$LIBLINEARDIR/liblinear.a"
|
||||
LIBLINEAR_DEPENDS="\$(top_srcdir)/$LIBLINEARDIR/liblinear.a"
|
||||
LIBLINEAR_BUILD="liblinear_build"
|
||||
LIBLINEAR_CLEAN="liblinear_clean"
|
||||
LIBLINEAR_DIST_CLEAN="liblinear_dist_clean"
|
||||
have_liblinear=yes
|
||||
;;
|
||||
*)
|
||||
CPPFLAGS="-I$with_liblinear/include $CPPFLAGS"
|
||||
LDFLAGS="-L$with_liblinear/lib $LDFLAGS"
|
||||
;;
|
||||
esac
|
||||
|
||||
--with-libnbase=DIR Look for nbase include/libs in DIR
|
||||
--with-libnsock=DIR Compile and link to libnsock in DIR
|
||||
--without-ncat Skip build and installation of Ncat
|
||||
@@ -6797,6 +6826,104 @@ fi
|
||||
|
||||
|
||||
|
||||
|
||||
LIBLINEARDIR=liblinear
|
||||
have_liblinear=no
|
||||
|
||||
# First we test whether they specified liblinear explicitly
|
||||
|
||||
# Check whether --with-liblinear was given.
|
||||
if test "${with_liblinear+set}" = set; then :
|
||||
withval=$with_liblinear;
|
||||
fi
|
||||
|
||||
|
||||
# If they didn't specify it, we try to find it
|
||||
if test $have_liblinear != yes; then
|
||||
for ac_header in linear.h
|
||||
do :
|
||||
ac_fn_c_check_header_mongrel "$LINENO" "linear.h" "ac_cv_header_linear_h" "$ac_includes_default"
|
||||
if test "x$ac_cv_header_linear_h" = x""yes; then :
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define HAVE_LINEAR_H 1
|
||||
_ACEOF
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for predict in -llinear" >&5
|
||||
$as_echo_n "checking for predict in -llinear... " >&6; }
|
||||
if test "${ac_cv_lib_linear_predict+set}" = set; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
ac_check_lib_save_LIBS=$LIBS
|
||||
LIBS="-llinear -lm $LIBS"
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
|
||||
/* Override any GCC internal prototype to avoid an error.
|
||||
Use char because int might match the return type of a GCC
|
||||
builtin and then its argument prototype would still apply. */
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
#endif
|
||||
char predict ();
|
||||
int
|
||||
main ()
|
||||
{
|
||||
return predict ();
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
if ac_fn_c_try_link "$LINENO"; then :
|
||||
ac_cv_lib_linear_predict=yes
|
||||
else
|
||||
ac_cv_lib_linear_predict=no
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
LIBS=$ac_check_lib_save_LIBS
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_linear_predict" >&5
|
||||
$as_echo "$ac_cv_lib_linear_predict" >&6; }
|
||||
if test "x$ac_cv_lib_linear_predict" = x""yes; then :
|
||||
have_liblinear=yes; LIBLINEAR_LIBS="-llinear"; break
|
||||
fi
|
||||
|
||||
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
|
||||
LIBLINEAR_DEPENDS=""
|
||||
LIBLINEAR_BUILD=""
|
||||
LIBLINEAR_CLEAN=""
|
||||
LIBLINEAR_DIST_CLEAN=""
|
||||
fi
|
||||
|
||||
# if we didn't find we use our own
|
||||
if test $have_liblinear != yes; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
CPPFLAGS="-I\$(top_srcdir)/$LIBLINEARDIR $CPPFLAGS"
|
||||
LIBLINEAR_LIBS="\$(top_srcdir)/$LIBLINEARDIR/liblinear.a"
|
||||
LIBLINEAR_DEPENDS="\$(top_srcdir)/$LIBLINEARDIR/liblinear.a"
|
||||
LIBLINEAR_BUILD="liblinear_build"
|
||||
LIBLINEAR_CLEAN="liblinear_clean"
|
||||
LIBLINEAR_DIST_CLEAN="liblinear_dist_clean"
|
||||
$as_echo "#define LIBLINEAR_INCLUDED 1" >>confdefs.h
|
||||
|
||||
else
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||
$as_echo "yes" >&6; }
|
||||
fi
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if sockaddr{} has sa_len member" >&5
|
||||
$as_echo_n "checking if sockaddr{} has sa_len member... " >&6; }
|
||||
if test "${ac_cv_sockaddr_has_sa_len+set}" = set; then :
|
||||
|
||||
61
configure.ac
61
configure.ac
@@ -645,6 +645,67 @@ AC_SUBST(LUA_DIST_CLEAN)
|
||||
AC_SUBST(INSTALLNSE)
|
||||
AC_SUBST(CXXFLAGS)
|
||||
|
||||
|
||||
LIBLINEARDIR=liblinear
|
||||
have_liblinear=no
|
||||
|
||||
# First we test whether they specified liblinear explicitly
|
||||
AC_ARG_WITH(liblinear,
|
||||
AC_HELP_STRING([--with-liblinear=DIR], [Use an existing (compiled) liblinear from DIR/include and DIR/lib.])
|
||||
AC_HELP_STRING([--with-liblinear=included], [Use the liblinear version included with Nmap])
|
||||
[ case "$with_liblinear" in
|
||||
yes)
|
||||
;;
|
||||
included)
|
||||
CPPFLAGS="-I\$(top_srcdir)/$LIBLINEARDIR $CPPFLAGS"
|
||||
LIBLINEAR_LIBS="\$(top_srcdir)/$LIBLINEARDIR/liblinear.a"
|
||||
LIBLINEAR_DEPENDS="\$(top_srcdir)/$LIBLINEARDIR/liblinear.a"
|
||||
LIBLINEAR_BUILD="liblinear_build"
|
||||
LIBLINEAR_CLEAN="liblinear_clean"
|
||||
LIBLINEAR_DIST_CLEAN="liblinear_dist_clean"
|
||||
have_liblinear=yes
|
||||
;;
|
||||
*)
|
||||
CPPFLAGS="-I$with_liblinear/include $CPPFLAGS"
|
||||
LDFLAGS="-L$with_liblinear/lib $LDFLAGS"
|
||||
;;
|
||||
esac]
|
||||
)
|
||||
|
||||
# If they didn't specify it, we try to find it
|
||||
if test $have_liblinear != yes; then
|
||||
AC_CHECK_HEADERS([linear.h],
|
||||
AC_CHECK_LIB(linear, predict, [have_liblinear=yes; LIBLINEAR_LIBS="-llinear"; break],, [-lm])
|
||||
)
|
||||
|
||||
LIBLINEAR_DEPENDS=""
|
||||
LIBLINEAR_BUILD=""
|
||||
LIBLINEAR_CLEAN=""
|
||||
LIBLINEAR_DIST_CLEAN=""
|
||||
fi
|
||||
|
||||
# if we didn't find we use our own
|
||||
if test $have_liblinear != yes; then
|
||||
AC_MSG_RESULT(no)
|
||||
CPPFLAGS="-I\$(top_srcdir)/$LIBLINEARDIR $CPPFLAGS"
|
||||
LIBLINEAR_LIBS="\$(top_srcdir)/$LIBLINEARDIR/liblinear.a"
|
||||
LIBLINEAR_DEPENDS="\$(top_srcdir)/$LIBLINEARDIR/liblinear.a"
|
||||
LIBLINEAR_BUILD="liblinear_build"
|
||||
LIBLINEAR_CLEAN="liblinear_clean"
|
||||
LIBLINEAR_DIST_CLEAN="liblinear_dist_clean"
|
||||
AC_DEFINE(LIBLINEAR_INCLUDED)
|
||||
else
|
||||
AC_MSG_RESULT(yes)
|
||||
fi
|
||||
|
||||
AC_SUBST(LIBLINEAR_LIBS)
|
||||
AC_SUBST(LIBLINEARDIR)
|
||||
AC_SUBST(LIBLINEAR_DEPENDS)
|
||||
AC_SUBST(LIBLINEAR_BUILD)
|
||||
AC_SUBST(LIBLINEAR_CLEAN)
|
||||
AC_SUBST(LIBLINEAR_DIST_CLEAN)
|
||||
|
||||
|
||||
dnl This test is from the configure.in of Unix Network Programming second
|
||||
dnl edition example code by W. Richard Stevens
|
||||
dnl ##################################################################
|
||||
|
||||
@@ -31,6 +31,8 @@ On all platforms, Nmap is normally linked with:
|
||||
the subdirectory mswin32/OpenSSL. OpenSSL can be disabled by
|
||||
configuring with the --without-openssl configuration directive.
|
||||
http://www.openssl.org/
|
||||
o LIBLINEAR. Used for IPv6 OS classifiction.
|
||||
http://www.csie.ntu.edu.tw/~cjlin/liblinear/
|
||||
|
||||
On Windows only, Nmap uses:
|
||||
o WinPcap: libpcap for Windows. The libpcap license applies to WinPcap,
|
||||
@@ -390,6 +392,41 @@ http://www.winpcap.org/misc/copyright.htm.
|
||||
|
||||
========
|
||||
|
||||
License of LIBLINEAR
|
||||
|
||||
Copyright (c) 2007-2011 The LIBLINEAR Project.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither name of copyright holders nor the names of its contributors
|
||||
may be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
========
|
||||
|
||||
License of Python
|
||||
|
||||
PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
|
||||
|
||||
@@ -169,6 +169,14 @@ struct OS_Classification {
|
||||
std::vector<const char *> cpe;
|
||||
};
|
||||
|
||||
/* A description of an operating system: a human-readable name and a list of
|
||||
classifications. */
|
||||
struct FingerMatch {
|
||||
int line; /* For reference prints, the line # in nmap-os-db */
|
||||
char *OS_name;
|
||||
std::vector<OS_Classification> OS_class;
|
||||
};
|
||||
|
||||
struct FingerTest {
|
||||
const char *name;
|
||||
std::vector<struct AVal> results;
|
||||
@@ -176,9 +184,7 @@ struct FingerTest {
|
||||
};
|
||||
|
||||
struct FingerPrint {
|
||||
int line; /* For reference prints, the line # in nmap-os-db */
|
||||
char *OS_name;
|
||||
std::vector<OS_Classification> OS_class;
|
||||
FingerMatch match;
|
||||
std::vector<FingerTest> tests;
|
||||
const FingerTest *gettestbyname(const char *name) const;
|
||||
FingerPrint();
|
||||
|
||||
31
liblinear/COPYRIGHT
Normal file
31
liblinear/COPYRIGHT
Normal file
@@ -0,0 +1,31 @@
|
||||
|
||||
Copyright (c) 2007-2011 The LIBLINEAR Project.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither name of copyright holders nor the names of its contributors
|
||||
may be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
36
liblinear/Makefile
Normal file
36
liblinear/Makefile
Normal file
@@ -0,0 +1,36 @@
|
||||
CXX ?= g++
|
||||
CC ?= gcc
|
||||
CFLAGS = -Wall -Wconversion -O3 -fPIC
|
||||
LIBS = blas/blas.a
|
||||
SHVER = 1
|
||||
AR = ar
|
||||
RANLIB = ranlib
|
||||
#LIBS = -lblas
|
||||
|
||||
all: train predict
|
||||
|
||||
lib: linear.o tron.o blas/blas.a
|
||||
$(CXX) -shared -dynamiclib linear.o tron.o blas/blas.a -o liblinear.so.$(SHVER)
|
||||
|
||||
liblinear.a: linear.o tron.o blas/blas.a
|
||||
$(AR) rcv liblinear.a linear.o tron.o blas/*.o
|
||||
$(RANLIB) liblinear.a
|
||||
|
||||
train: tron.o linear.o train.c blas/blas.a
|
||||
$(CXX) $(CFLAGS) -o train train.c tron.o linear.o $(LIBS)
|
||||
|
||||
predict: tron.o linear.o predict.c blas/blas.a
|
||||
$(CXX) $(CFLAGS) -o predict predict.c tron.o linear.o $(LIBS)
|
||||
|
||||
tron.o: tron.cpp tron.h
|
||||
$(CXX) $(CFLAGS) -c -o tron.o tron.cpp
|
||||
|
||||
linear.o: linear.cpp linear.h
|
||||
$(CXX) $(CFLAGS) -c -o linear.o linear.cpp
|
||||
|
||||
blas/blas.a:
|
||||
cd blas; make OPTFLAGS='$(CFLAGS)' CC='$(CC)';
|
||||
|
||||
clean:
|
||||
cd blas; make clean
|
||||
rm -f *~ tron.o linear.o train predict liblinear.so.$(SHVER) liblinear.a
|
||||
30
liblinear/Makefile.win
Normal file
30
liblinear/Makefile.win
Normal file
@@ -0,0 +1,30 @@
|
||||
#You must ensure nmake.exe, cl.exe, link.exe are in system path.
|
||||
#VCVARS32.bat
|
||||
#Under dosbox prompt
|
||||
#nmake -f Makefile.win
|
||||
|
||||
##########################################
|
||||
CXXC = cl.exe
|
||||
CFLAGS = -nologo -O2 -EHsc -I. -D __WIN32__ -D _CRT_SECURE_NO_DEPRECATE
|
||||
TARGET = windows
|
||||
|
||||
all: $(TARGET)\train.exe $(TARGET)\predict.exe
|
||||
|
||||
$(TARGET)\train.exe: tron.obj linear.obj train.c blas\*.c
|
||||
$(CXX) $(CFLAGS) -Fe$(TARGET)\train.exe tron.obj linear.obj train.c blas\*.c
|
||||
|
||||
$(TARGET)\predict.exe: tron.obj linear.obj predict.c blas\*.c
|
||||
$(CXX) $(CFLAGS) -Fe$(TARGET)\predict.exe tron.obj linear.obj predict.c blas\*.c
|
||||
|
||||
linear.obj: linear.cpp linear.h
|
||||
$(CXX) $(CFLAGS) -c linear.cpp
|
||||
|
||||
tron.obj: tron.cpp tron.h
|
||||
$(CXX) $(CFLAGS) -c tron.cpp
|
||||
|
||||
lib: linear.cpp linear.h linear.def tron.obj
|
||||
$(CXX) $(CFLAGS) -LD linear.cpp tron.obj blas\*.c -Fe$(TARGET)\liblinear -link -DEF:linear.def
|
||||
|
||||
clean:
|
||||
-erase /Q *.obj $(TARGET)\.
|
||||
|
||||
485
liblinear/README
Normal file
485
liblinear/README
Normal file
@@ -0,0 +1,485 @@
|
||||
LIBLINEAR is a simple package for solving large-scale regularized
|
||||
linear classification. It currently supports L2-regularized logistic
|
||||
regression/L2-loss support vector classification/L1-loss support vector
|
||||
classification, and L1-regularized L2-loss support vector classification/
|
||||
logistic regression. This document explains the usage of LIBLINEAR.
|
||||
|
||||
To get started, please read the ``Quick Start'' section first.
|
||||
For developers, please check the ``Library Usage'' section to learn
|
||||
how to integrate LIBLINEAR in your software.
|
||||
|
||||
Table of Contents
|
||||
=================
|
||||
|
||||
- When to use LIBLINEAR but not LIBSVM
|
||||
- Quick Start
|
||||
- Installation
|
||||
- `train' Usage
|
||||
- `predict' Usage
|
||||
- Examples
|
||||
- Library Usage
|
||||
- Building Windows Binaries
|
||||
- Additional Information
|
||||
- MATLAB/OCTAVE interface
|
||||
- PYTHON interface
|
||||
|
||||
When to use LIBLINEAR but not LIBSVM
|
||||
====================================
|
||||
|
||||
There are some large data for which with/without nonlinear mappings
|
||||
gives similar performances. Without using kernels, one can
|
||||
efficiently train a much larger set via a linear classifier. These
|
||||
data usually have a large number of features. Document classification
|
||||
is an example.
|
||||
|
||||
Warning: While generally liblinear is very fast, its default solver
|
||||
may be slow under certain situations (e.g., data not scaled or C is
|
||||
large). See Appendix B of our SVM guide about how to handle such
|
||||
cases.
|
||||
http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf
|
||||
|
||||
Warning: If you are a beginner and your data sets are not large, you
|
||||
should consider LIBSVM first.
|
||||
|
||||
LIBSVM page:
|
||||
http://www.csie.ntu.edu.tw/~cjlin/libsvm
|
||||
|
||||
|
||||
Quick Start
|
||||
===========
|
||||
|
||||
See the section ``Installation'' for installing LIBLINEAR.
|
||||
|
||||
After installation, there are programs `train' and `predict' for
|
||||
training and testing, respectively.
|
||||
|
||||
About the data format, please check the README file of LIBSVM. Note
|
||||
that feature index must start from 1 (but not 0).
|
||||
|
||||
A sample classification data included in this package is `heart_scale'.
|
||||
|
||||
Type `train heart_scale', and the program will read the training
|
||||
data and output the model file `heart_scale.model'. If you have a test
|
||||
set called heart_scale.t, then type `predict heart_scale.t
|
||||
heart_scale.model output' to see the prediction accuracy. The `output'
|
||||
file contains the predicted class labels.
|
||||
|
||||
For more information about `train' and `predict', see the sections
|
||||
`train' Usage and `predict' Usage.
|
||||
|
||||
To obtain good performances, sometimes one needs to scale the
|
||||
data. Please check the program `svm-scale' of LIBSVM. For large and
|
||||
sparse data, use `-l 0' to keep the sparsity.
|
||||
|
||||
Installation
|
||||
============
|
||||
|
||||
On Unix systems, type `make' to build the `train' and `predict'
|
||||
programs. Run them without arguments to show the usages.
|
||||
|
||||
On other systems, consult `Makefile' to build them (e.g., see
|
||||
'Building Windows binaries' in this file) or use the pre-built
|
||||
binaries (Windows binaries are in the directory `windows').
|
||||
|
||||
This software uses some level-1 BLAS subroutines. The needed functions are
|
||||
included in this package. If a BLAS library is available on your
|
||||
machine, you may use it by modifying the Makefile: Unmark the following line
|
||||
|
||||
#LIBS ?= -lblas
|
||||
|
||||
and mark
|
||||
|
||||
LIBS ?= blas/blas.a
|
||||
|
||||
`train' Usage
|
||||
=============
|
||||
|
||||
Usage: train [options] training_set_file [model_file]
|
||||
options:
|
||||
-s type : set type of solver (default 1)
|
||||
0 -- L2-regularized logistic regression (primal)
|
||||
1 -- L2-regularized L2-loss support vector classification (dual)
|
||||
2 -- L2-regularized L2-loss support vector classification (primal)
|
||||
3 -- L2-regularized L1-loss support vector classification (dual)
|
||||
4 -- multi-class support vector classification by Crammer and Singer
|
||||
5 -- L1-regularized L2-loss support vector classification
|
||||
6 -- L1-regularized logistic regression
|
||||
7 -- L2-regularized logistic regression (dual)
|
||||
-c cost : set the parameter C (default 1)
|
||||
-e epsilon : set tolerance of termination criterion
|
||||
-s 0 and 2
|
||||
|f'(w)|_2 <= eps*min(pos,neg)/l*|f'(w0)|_2,
|
||||
where f is the primal function and pos/neg are # of
|
||||
positive/negative data (default 0.01)
|
||||
-s 1, 3, 4 and 7
|
||||
Dual maximal violation <= eps; similar to libsvm (default 0.1)
|
||||
-s 5 and 6
|
||||
|f'(w)|_inf <= eps*min(pos,neg)/l*|f'(w0)|_inf,
|
||||
where f is the primal function (default 0.01)
|
||||
-B bias : if bias >= 0, instance x becomes [x; bias]; if < 0, no bias term added (default -1)
|
||||
-wi weight: weights adjust the parameter C of different classes (see README for details)
|
||||
-v n: n-fold cross validation mode
|
||||
-q : quiet mode (no outputs)
|
||||
|
||||
Option -v randomly splits the data into n parts and calculates cross
|
||||
validation accuracy on them.
|
||||
|
||||
Formulations:
|
||||
|
||||
For L2-regularized logistic regression (-s 0), we solve
|
||||
|
||||
min_w w^Tw/2 + C \sum log(1 + exp(-y_i w^Tx_i))
|
||||
|
||||
For L2-regularized L2-loss SVC dual (-s 1), we solve
|
||||
|
||||
min_alpha 0.5(alpha^T (Q + I/2/C) alpha) - e^T alpha
|
||||
s.t. 0 <= alpha_i,
|
||||
|
||||
For L2-regularized L2-loss SVC (-s 2), we solve
|
||||
|
||||
min_w w^Tw/2 + C \sum max(0, 1- y_i w^Tx_i)^2
|
||||
|
||||
For L2-regularized L1-loss SVC dual (-s 3), we solve
|
||||
|
||||
min_alpha 0.5(alpha^T Q alpha) - e^T alpha
|
||||
s.t. 0 <= alpha_i <= C,
|
||||
|
||||
For L1-regularized L2-loss SVC (-s 5), we solve
|
||||
|
||||
min_w \sum |w_j| + C \sum max(0, 1- y_i w^Tx_i)^2
|
||||
|
||||
For L1-regularized logistic regression (-s 6), we solve
|
||||
|
||||
min_w \sum |w_j| + C \sum log(1 + exp(-y_i w^Tx_i))
|
||||
|
||||
where
|
||||
|
||||
Q is a matrix with Q_ij = y_i y_j x_i^T x_j.
|
||||
|
||||
For L2-regularized logistic regression (-s 7), we solve
|
||||
|
||||
min_alpha 0.5(alpha^T Q alpha) + \sum alpha_i*log(alpha_i) + \sum (C-alpha_i)*log(C-alpha_i) - a constant
|
||||
s.t. 0 <= alpha_i <= C,
|
||||
|
||||
If bias >= 0, w becomes [w; w_{n+1}] and x becomes [x; bias].
|
||||
|
||||
The primal-dual relationship implies that -s 1 and -s 2 give the same
|
||||
model, and -s 0 and -s 7 give the same.
|
||||
|
||||
We implement 1-vs-the rest multi-class strategy. In training i
|
||||
vs. non_i, their C parameters are (weight from -wi)*C and C,
|
||||
respectively. If there are only two classes, we train only one
|
||||
model. Thus weight1*C vs. weight2*C is used. See examples below.
|
||||
|
||||
We also implement multi-class SVM by Crammer and Singer (-s 4):
|
||||
|
||||
min_{w_m, \xi_i} 0.5 \sum_m ||w_m||^2 + C \sum_i \xi_i
|
||||
s.t. w^T_{y_i} x_i - w^T_m x_i >= \e^m_i - \xi_i \forall m,i
|
||||
|
||||
where e^m_i = 0 if y_i = m,
|
||||
e^m_i = 1 if y_i != m,
|
||||
|
||||
Here we solve the dual problem:
|
||||
|
||||
min_{\alpha} 0.5 \sum_m ||w_m(\alpha)||^2 + \sum_i \sum_m e^m_i alpha^m_i
|
||||
s.t. \alpha^m_i <= C^m_i \forall m,i , \sum_m \alpha^m_i=0 \forall i
|
||||
|
||||
where w_m(\alpha) = \sum_i \alpha^m_i x_i,
|
||||
and C^m_i = C if m = y_i,
|
||||
C^m_i = 0 if m != y_i.
|
||||
|
||||
`predict' Usage
|
||||
===============
|
||||
|
||||
Usage: predict [options] test_file model_file output_file
|
||||
options:
|
||||
-b probability_estimates: whether to predict probability estimates, 0 or 1 (default 0)
|
||||
|
||||
Examples
|
||||
========
|
||||
|
||||
> train data_file
|
||||
|
||||
Train linear SVM with L2-loss function.
|
||||
|
||||
> train -s 0 data_file
|
||||
|
||||
Train a logistic regression model.
|
||||
|
||||
> train -v 5 -e 0.001 data_file
|
||||
|
||||
Do five-fold cross-validation using L2-loss svm.
|
||||
Use a smaller stopping tolerance 0.001 than the default
|
||||
0.1 if you want more accurate solutions.
|
||||
|
||||
> train -c 10 -w1 2 -w2 5 -w3 2 four_class_data_file
|
||||
|
||||
Train four classifiers:
|
||||
positive negative Cp Cn
|
||||
class 1 class 2,3,4. 20 10
|
||||
class 2 class 1,3,4. 50 10
|
||||
class 3 class 1,2,4. 20 10
|
||||
class 4 class 1,2,3. 10 10
|
||||
|
||||
> train -c 10 -w3 1 -w2 5 two_class_data_file
|
||||
|
||||
If there are only two classes, we train ONE model.
|
||||
The C values for the two classes are 10 and 50.
|
||||
|
||||
> predict -b 1 test_file data_file.model output_file
|
||||
|
||||
Output probability estimates (for logistic regression only).
|
||||
|
||||
Library Usage
|
||||
=============
|
||||
|
||||
- Function: model* train(const struct problem *prob,
|
||||
const struct parameter *param);
|
||||
|
||||
This function constructs and returns a linear classification model
|
||||
according to the given training data and parameters.
|
||||
|
||||
struct problem describes the problem:
|
||||
|
||||
struct problem
|
||||
{
|
||||
int l, n;
|
||||
int *y;
|
||||
struct feature_node **x;
|
||||
double bias;
|
||||
};
|
||||
|
||||
where `l' is the number of training data. If bias >= 0, we assume
|
||||
that one additional feature is added to the end of each data
|
||||
instance. `n' is the number of feature (including the bias feature
|
||||
if bias >= 0). `y' is an array containing the target values. And
|
||||
`x' is an array of pointers,
|
||||
each of which points to a sparse representation (array of feature_node) of one
|
||||
training vector.
|
||||
|
||||
For example, if we have the following training data:
|
||||
|
||||
LABEL ATTR1 ATTR2 ATTR3 ATTR4 ATTR5
|
||||
----- ----- ----- ----- ----- -----
|
||||
1 0 0.1 0.2 0 0
|
||||
2 0 0.1 0.3 -1.2 0
|
||||
1 0.4 0 0 0 0
|
||||
2 0 0.1 0 1.4 0.5
|
||||
3 -0.1 -0.2 0.1 1.1 0.1
|
||||
|
||||
and bias = 1, then the components of problem are:
|
||||
|
||||
l = 5
|
||||
n = 6
|
||||
|
||||
y -> 1 2 1 2 3
|
||||
|
||||
x -> [ ] -> (2,0.1) (3,0.2) (6,1) (-1,?)
|
||||
[ ] -> (2,0.1) (3,0.3) (4,-1.2) (6,1) (-1,?)
|
||||
[ ] -> (1,0.4) (6,1) (-1,?)
|
||||
[ ] -> (2,0.1) (4,1.4) (5,0.5) (6,1) (-1,?)
|
||||
[ ] -> (1,-0.1) (2,-0.2) (3,0.1) (4,1.1) (5,0.1) (6,1) (-1,?)
|
||||
|
||||
struct parameter describes the parameters of a linear classification model:
|
||||
|
||||
struct parameter
|
||||
{
|
||||
int solver_type;
|
||||
|
||||
/* these are for training only */
|
||||
double eps; /* stopping criteria */
|
||||
double C;
|
||||
int nr_weight;
|
||||
int *weight_label;
|
||||
double* weight;
|
||||
};
|
||||
|
||||
solver_type can be one of L2R_LR, L2R_L2LOSS_SVC_DUAL, L2R_L2LOSS_SVC, L2R_L1LOSS_SVC_DUAL, MCSVM_CS, L1R_L2LOSS_SVC, L1R_LR, L2R_LR_DUAL.
|
||||
|
||||
L2R_LR L2-regularized logistic regression (primal)
|
||||
L2R_L2LOSS_SVC_DUAL L2-regularized L2-loss support vector classification (dual)
|
||||
L2R_L2LOSS_SVC L2-regularized L2-loss support vector classification (primal)
|
||||
L2R_L1LOSS_SVC_DUAL L2-regularized L1-loss support vector classification (dual)
|
||||
MCSVM_CS multi-class support vector classification by Crammer and Singer
|
||||
L1R_L2LOSS_SVC L1-regularized L2-loss support vector classification
|
||||
L1R_LR L1-regularized logistic regression
|
||||
L2R_LR_DUAL L2-regularized logistic regression (dual)
|
||||
|
||||
C is the cost of constraints violation.
|
||||
eps is the stopping criterion.
|
||||
|
||||
nr_weight, weight_label, and weight are used to change the penalty
|
||||
for some classes (If the weight for a class is not changed, it is
|
||||
set to 1). This is useful for training classifier using unbalanced
|
||||
input data or with asymmetric misclassification cost.
|
||||
|
||||
nr_weight is the number of elements in the array weight_label and
|
||||
weight. Each weight[i] corresponds to weight_label[i], meaning that
|
||||
the penalty of class weight_label[i] is scaled by a factor of weight[i].
|
||||
|
||||
If you do not want to change penalty for any of the classes,
|
||||
just set nr_weight to 0.
|
||||
|
||||
*NOTE* To avoid wrong parameters, check_parameter() should be
|
||||
called before train().
|
||||
|
||||
struct model stores the model obtained from the training procedure:
|
||||
|
||||
struct model
|
||||
{
|
||||
struct parameter param;
|
||||
int nr_class; /* number of classes */
|
||||
int nr_feature;
|
||||
double *w;
|
||||
int *label; /* label of each class */
|
||||
double bias;
|
||||
};
|
||||
|
||||
param describes the parameters used to obtain the model.
|
||||
|
||||
nr_class and nr_feature are the number of classes and features, respectively.
|
||||
|
||||
The nr_feature*nr_class array w gives feature weights. We use one
|
||||
against the rest for multi-class classification, so each feature
|
||||
index corresponds to nr_class weight values. Weights are
|
||||
organized in the following way
|
||||
|
||||
+------------------+------------------+------------+
|
||||
| nr_class weights | nr_class weights | ...
|
||||
| for 1st feature | for 2nd feature |
|
||||
+------------------+------------------+------------+
|
||||
|
||||
If bias >= 0, x becomes [x; bias]. The number of features is
|
||||
increased by one, so w is a (nr_feature+1)*nr_class array. The
|
||||
value of bias is stored in the variable bias.
|
||||
|
||||
The array label stores class labels.
|
||||
|
||||
- Function: void cross_validation(const problem *prob, const parameter *param, int nr_fold, int *target);
|
||||
|
||||
This function conducts cross validation. Data are separated to
|
||||
nr_fold folds. Under given parameters, sequentially each fold is
|
||||
validated using the model from training the remaining. Predicted
|
||||
labels in the validation process are stored in the array called
|
||||
target.
|
||||
|
||||
The format of prob is same as that for train().
|
||||
|
||||
- Function: int predict(const model *model_, const feature_node *x);
|
||||
|
||||
This functions classifies a test vector using the given
|
||||
model. The predicted label is returned.
|
||||
|
||||
- Function: int predict_values(const struct model *model_,
|
||||
const struct feature_node *x, double* dec_values);
|
||||
|
||||
This function gives nr_w decision values in the array
|
||||
dec_values. nr_w is 1 if there are two classes except multi-class
|
||||
svm by Crammer and Singer (-s 4), and is the number of classes otherwise.
|
||||
|
||||
We implement one-vs-the rest multi-class strategy (-s 0,1,2,3) and
|
||||
multi-class svm by Crammer and Singer (-s 4) for multi-class SVM.
|
||||
The class with the highest decision value is returned.
|
||||
|
||||
- Function: int predict_probability(const struct model *model_,
|
||||
const struct feature_node *x, double* prob_estimates);
|
||||
|
||||
This function gives nr_class probability estimates in the array
|
||||
prob_estimates. nr_class can be obtained from the function
|
||||
get_nr_class. The class with the highest probability is
|
||||
returned. Currently, we support only the probability outputs of
|
||||
logistic regression.
|
||||
|
||||
- Function: int get_nr_feature(const model *model_);
|
||||
|
||||
The function gives the number of attributes of the model.
|
||||
|
||||
- Function: int get_nr_class(const model *model_);
|
||||
|
||||
The function gives the number of classes of the model.
|
||||
|
||||
- Function: void get_labels(const model *model_, int* label);
|
||||
|
||||
This function outputs the name of labels into an array called label.
|
||||
|
||||
- Function: const char *check_parameter(const struct problem *prob,
|
||||
const struct parameter *param);
|
||||
|
||||
This function checks whether the parameters are within the feasible
|
||||
range of the problem. This function should be called before calling
|
||||
train() and cross_validation(). It returns NULL if the
|
||||
parameters are feasible, otherwise an error message is returned.
|
||||
|
||||
- Function: int save_model(const char *model_file_name,
|
||||
const struct model *model_);
|
||||
|
||||
This function saves a model to a file; returns 0 on success, or -1
|
||||
if an error occurs.
|
||||
|
||||
- Function: struct model *load_model(const char *model_file_name);
|
||||
|
||||
This function returns a pointer to the model read from the file,
|
||||
or a null pointer if the model could not be loaded.
|
||||
|
||||
- Function: void free_model_content(struct model *model_ptr);
|
||||
|
||||
This function frees the memory used by the entries in a model structure.
|
||||
|
||||
- Function: void free_and_destroy_model(struct model **model_ptr_ptr);
|
||||
|
||||
This function frees the memory used by a model and destroys the model
|
||||
structure.
|
||||
|
||||
- Function: void destroy_param(struct parameter *param);
|
||||
|
||||
This function frees the memory used by a parameter set.
|
||||
|
||||
- Function: void set_print_string_function(void (*print_func)(const char *));
|
||||
|
||||
Users can specify their output format by a function. Use
|
||||
set_print_string_function(NULL);
|
||||
for default printing to stdout.
|
||||
|
||||
Building Windows Binaries
|
||||
=========================
|
||||
|
||||
Windows binaries are in the directory `windows'. To build them via
|
||||
Visual C++, use the following steps:
|
||||
|
||||
1. Open a dos command box and change to liblinear directory. If
|
||||
environment variables of VC++ have not been set, type
|
||||
|
||||
"C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat"
|
||||
|
||||
You may have to modify the above command according which version of
|
||||
VC++ or where it is installed.
|
||||
|
||||
2. Type
|
||||
|
||||
nmake -f Makefile.win clean all
|
||||
|
||||
|
||||
MATLAB/OCTAVE Interface
|
||||
=======================
|
||||
|
||||
Please check the file README in the directory `matlab'.
|
||||
|
||||
PYTHON Interface
|
||||
================
|
||||
|
||||
Please check the file README in the directory `python'.
|
||||
|
||||
Additional Information
|
||||
======================
|
||||
|
||||
If you find LIBLINEAR helpful, please cite it as
|
||||
|
||||
R.-E. Fan, K.-W. Chang, C.-J. Hsieh, X.-R. Wang, and C.-J. Lin.
|
||||
LIBLINEAR: A Library for Large Linear Classification, Journal of
|
||||
Machine Learning Research 9(2008), 1871-1874. Software available at
|
||||
http://www.csie.ntu.edu.tw/~cjlin/liblinear
|
||||
|
||||
For any questions and comments, please send your email to
|
||||
cjlin@csie.ntu.edu.tw
|
||||
|
||||
|
||||
22
liblinear/blas/Makefile
Normal file
22
liblinear/blas/Makefile
Normal file
@@ -0,0 +1,22 @@
|
||||
AR = ar rcv
|
||||
RANLIB = ranlib
|
||||
|
||||
HEADERS = blas.h blas.h blasp.h
|
||||
FILES = dnrm2.o daxpy.o ddot.o dscal.o
|
||||
|
||||
CFLAGS = $(OPTFLAGS)
|
||||
FFLAGS = $(OPTFLAGS)
|
||||
|
||||
blas: $(FILES) $(HEADERS)
|
||||
$(AR) blas.a $(FILES)
|
||||
$(RANLIB) blas.a
|
||||
|
||||
clean:
|
||||
- rm -f *.o
|
||||
- rm -f *.a
|
||||
- rm -f *~
|
||||
|
||||
.c.o:
|
||||
$(CC) $(CFLAGS) -c $*.c
|
||||
|
||||
|
||||
25
liblinear/blas/blas.h
Normal file
25
liblinear/blas/blas.h
Normal file
@@ -0,0 +1,25 @@
|
||||
/* blas.h -- C header file for BLAS Ver 1.0 */
|
||||
/* Jesse Bennett March 23, 2000 */
|
||||
|
||||
/** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed."
|
||||
|
||||
- From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */
|
||||
|
||||
#ifndef BLAS_INCLUDE
|
||||
#define BLAS_INCLUDE
|
||||
|
||||
/* Data types specific to BLAS implementation */
|
||||
typedef struct { float r, i; } fcomplex;
|
||||
typedef struct { double r, i; } dcomplex;
|
||||
typedef int blasbool;
|
||||
|
||||
#include "blasp.h" /* Prototypes for all BLAS functions */
|
||||
|
||||
#define FALSE 0
|
||||
#define TRUE 1
|
||||
|
||||
/* Macro functions */
|
||||
#define MIN(a,b) ((a) <= (b) ? (a) : (b))
|
||||
#define MAX(a,b) ((a) >= (b) ? (a) : (b))
|
||||
|
||||
#endif
|
||||
430
liblinear/blas/blasp.h
Normal file
430
liblinear/blas/blasp.h
Normal file
@@ -0,0 +1,430 @@
|
||||
/* blasp.h -- C prototypes for BLAS Ver 1.0 */
|
||||
/* Jesse Bennett March 23, 2000 */
|
||||
|
||||
/* Functions listed in alphabetical order */
|
||||
|
||||
#ifdef F2C_COMPAT
|
||||
|
||||
void cdotc_(fcomplex *dotval, int *n, fcomplex *cx, int *incx,
|
||||
fcomplex *cy, int *incy);
|
||||
|
||||
void cdotu_(fcomplex *dotval, int *n, fcomplex *cx, int *incx,
|
||||
fcomplex *cy, int *incy);
|
||||
|
||||
double sasum_(int *n, float *sx, int *incx);
|
||||
|
||||
double scasum_(int *n, fcomplex *cx, int *incx);
|
||||
|
||||
double scnrm2_(int *n, fcomplex *x, int *incx);
|
||||
|
||||
double sdot_(int *n, float *sx, int *incx, float *sy, int *incy);
|
||||
|
||||
double snrm2_(int *n, float *x, int *incx);
|
||||
|
||||
void zdotc_(dcomplex *dotval, int *n, dcomplex *cx, int *incx,
|
||||
dcomplex *cy, int *incy);
|
||||
|
||||
void zdotu_(dcomplex *dotval, int *n, dcomplex *cx, int *incx,
|
||||
dcomplex *cy, int *incy);
|
||||
|
||||
#else
|
||||
|
||||
fcomplex cdotc_(int *n, fcomplex *cx, int *incx, fcomplex *cy, int *incy);
|
||||
|
||||
fcomplex cdotu_(int *n, fcomplex *cx, int *incx, fcomplex *cy, int *incy);
|
||||
|
||||
float sasum_(int *n, float *sx, int *incx);
|
||||
|
||||
float scasum_(int *n, fcomplex *cx, int *incx);
|
||||
|
||||
float scnrm2_(int *n, fcomplex *x, int *incx);
|
||||
|
||||
float sdot_(int *n, float *sx, int *incx, float *sy, int *incy);
|
||||
|
||||
float snrm2_(int *n, float *x, int *incx);
|
||||
|
||||
dcomplex zdotc_(int *n, dcomplex *cx, int *incx, dcomplex *cy, int *incy);
|
||||
|
||||
dcomplex zdotu_(int *n, dcomplex *cx, int *incx, dcomplex *cy, int *incy);
|
||||
|
||||
#endif
|
||||
|
||||
/* Remaining functions listed in alphabetical order */
|
||||
|
||||
int caxpy_(int *n, fcomplex *ca, fcomplex *cx, int *incx, fcomplex *cy,
|
||||
int *incy);
|
||||
|
||||
int ccopy_(int *n, fcomplex *cx, int *incx, fcomplex *cy, int *incy);
|
||||
|
||||
int cgbmv_(char *trans, int *m, int *n, int *kl, int *ku,
|
||||
fcomplex *alpha, fcomplex *a, int *lda, fcomplex *x, int *incx,
|
||||
fcomplex *beta, fcomplex *y, int *incy);
|
||||
|
||||
int cgemm_(char *transa, char *transb, int *m, int *n, int *k,
|
||||
fcomplex *alpha, fcomplex *a, int *lda, fcomplex *b, int *ldb,
|
||||
fcomplex *beta, fcomplex *c, int *ldc);
|
||||
|
||||
int cgemv_(char *trans, int *m, int *n, fcomplex *alpha, fcomplex *a,
|
||||
int *lda, fcomplex *x, int *incx, fcomplex *beta, fcomplex *y,
|
||||
int *incy);
|
||||
|
||||
int cgerc_(int *m, int *n, fcomplex *alpha, fcomplex *x, int *incx,
|
||||
fcomplex *y, int *incy, fcomplex *a, int *lda);
|
||||
|
||||
int cgeru_(int *m, int *n, fcomplex *alpha, fcomplex *x, int *incx,
|
||||
fcomplex *y, int *incy, fcomplex *a, int *lda);
|
||||
|
||||
int chbmv_(char *uplo, int *n, int *k, fcomplex *alpha, fcomplex *a,
|
||||
int *lda, fcomplex *x, int *incx, fcomplex *beta, fcomplex *y,
|
||||
int *incy);
|
||||
|
||||
int chemm_(char *side, char *uplo, int *m, int *n, fcomplex *alpha,
|
||||
fcomplex *a, int *lda, fcomplex *b, int *ldb, fcomplex *beta,
|
||||
fcomplex *c, int *ldc);
|
||||
|
||||
int chemv_(char *uplo, int *n, fcomplex *alpha, fcomplex *a, int *lda,
|
||||
fcomplex *x, int *incx, fcomplex *beta, fcomplex *y, int *incy);
|
||||
|
||||
int cher_(char *uplo, int *n, float *alpha, fcomplex *x, int *incx,
|
||||
fcomplex *a, int *lda);
|
||||
|
||||
int cher2_(char *uplo, int *n, fcomplex *alpha, fcomplex *x, int *incx,
|
||||
fcomplex *y, int *incy, fcomplex *a, int *lda);
|
||||
|
||||
int cher2k_(char *uplo, char *trans, int *n, int *k, fcomplex *alpha,
|
||||
fcomplex *a, int *lda, fcomplex *b, int *ldb, float *beta,
|
||||
fcomplex *c, int *ldc);
|
||||
|
||||
int cherk_(char *uplo, char *trans, int *n, int *k, float *alpha,
|
||||
fcomplex *a, int *lda, float *beta, fcomplex *c, int *ldc);
|
||||
|
||||
int chpmv_(char *uplo, int *n, fcomplex *alpha, fcomplex *ap, fcomplex *x,
|
||||
int *incx, fcomplex *beta, fcomplex *y, int *incy);
|
||||
|
||||
int chpr_(char *uplo, int *n, float *alpha, fcomplex *x, int *incx,
|
||||
fcomplex *ap);
|
||||
|
||||
int chpr2_(char *uplo, int *n, fcomplex *alpha, fcomplex *x, int *incx,
|
||||
fcomplex *y, int *incy, fcomplex *ap);
|
||||
|
||||
int crotg_(fcomplex *ca, fcomplex *cb, float *c, fcomplex *s);
|
||||
|
||||
int cscal_(int *n, fcomplex *ca, fcomplex *cx, int *incx);
|
||||
|
||||
int csscal_(int *n, float *sa, fcomplex *cx, int *incx);
|
||||
|
||||
int cswap_(int *n, fcomplex *cx, int *incx, fcomplex *cy, int *incy);
|
||||
|
||||
int csymm_(char *side, char *uplo, int *m, int *n, fcomplex *alpha,
|
||||
fcomplex *a, int *lda, fcomplex *b, int *ldb, fcomplex *beta,
|
||||
fcomplex *c, int *ldc);
|
||||
|
||||
int csyr2k_(char *uplo, char *trans, int *n, int *k, fcomplex *alpha,
|
||||
fcomplex *a, int *lda, fcomplex *b, int *ldb, fcomplex *beta,
|
||||
fcomplex *c, int *ldc);
|
||||
|
||||
int csyrk_(char *uplo, char *trans, int *n, int *k, fcomplex *alpha,
|
||||
fcomplex *a, int *lda, fcomplex *beta, fcomplex *c, int *ldc);
|
||||
|
||||
int ctbmv_(char *uplo, char *trans, char *diag, int *n, int *k,
|
||||
fcomplex *a, int *lda, fcomplex *x, int *incx);
|
||||
|
||||
int ctbsv_(char *uplo, char *trans, char *diag, int *n, int *k,
|
||||
fcomplex *a, int *lda, fcomplex *x, int *incx);
|
||||
|
||||
int ctpmv_(char *uplo, char *trans, char *diag, int *n, fcomplex *ap,
|
||||
fcomplex *x, int *incx);
|
||||
|
||||
int ctpsv_(char *uplo, char *trans, char *diag, int *n, fcomplex *ap,
|
||||
fcomplex *x, int *incx);
|
||||
|
||||
int ctrmm_(char *side, char *uplo, char *transa, char *diag, int *m,
|
||||
int *n, fcomplex *alpha, fcomplex *a, int *lda, fcomplex *b,
|
||||
int *ldb);
|
||||
|
||||
int ctrmv_(char *uplo, char *trans, char *diag, int *n, fcomplex *a,
|
||||
int *lda, fcomplex *x, int *incx);
|
||||
|
||||
int ctrsm_(char *side, char *uplo, char *transa, char *diag, int *m,
|
||||
int *n, fcomplex *alpha, fcomplex *a, int *lda, fcomplex *b,
|
||||
int *ldb);
|
||||
|
||||
int ctrsv_(char *uplo, char *trans, char *diag, int *n, fcomplex *a,
|
||||
int *lda, fcomplex *x, int *incx);
|
||||
|
||||
int daxpy_(int *n, double *sa, double *sx, int *incx, double *sy,
|
||||
int *incy);
|
||||
|
||||
int dcopy_(int *n, double *sx, int *incx, double *sy, int *incy);
|
||||
|
||||
int dgbmv_(char *trans, int *m, int *n, int *kl, int *ku,
|
||||
double *alpha, double *a, int *lda, double *x, int *incx,
|
||||
double *beta, double *y, int *incy);
|
||||
|
||||
int dgemm_(char *transa, char *transb, int *m, int *n, int *k,
|
||||
double *alpha, double *a, int *lda, double *b, int *ldb,
|
||||
double *beta, double *c, int *ldc);
|
||||
|
||||
int dgemv_(char *trans, int *m, int *n, double *alpha, double *a,
|
||||
int *lda, double *x, int *incx, double *beta, double *y,
|
||||
int *incy);
|
||||
|
||||
int dger_(int *m, int *n, double *alpha, double *x, int *incx,
|
||||
double *y, int *incy, double *a, int *lda);
|
||||
|
||||
int drot_(int *n, double *sx, int *incx, double *sy, int *incy,
|
||||
double *c, double *s);
|
||||
|
||||
int drotg_(double *sa, double *sb, double *c, double *s);
|
||||
|
||||
int dsbmv_(char *uplo, int *n, int *k, double *alpha, double *a,
|
||||
int *lda, double *x, int *incx, double *beta, double *y,
|
||||
int *incy);
|
||||
|
||||
int dscal_(int *n, double *sa, double *sx, int *incx);
|
||||
|
||||
int dspmv_(char *uplo, int *n, double *alpha, double *ap, double *x,
|
||||
int *incx, double *beta, double *y, int *incy);
|
||||
|
||||
int dspr_(char *uplo, int *n, double *alpha, double *x, int *incx,
|
||||
double *ap);
|
||||
|
||||
int dspr2_(char *uplo, int *n, double *alpha, double *x, int *incx,
|
||||
double *y, int *incy, double *ap);
|
||||
|
||||
int dswap_(int *n, double *sx, int *incx, double *sy, int *incy);
|
||||
|
||||
int dsymm_(char *side, char *uplo, int *m, int *n, double *alpha,
|
||||
double *a, int *lda, double *b, int *ldb, double *beta,
|
||||
double *c, int *ldc);
|
||||
|
||||
int dsymv_(char *uplo, int *n, double *alpha, double *a, int *lda,
|
||||
double *x, int *incx, double *beta, double *y, int *incy);
|
||||
|
||||
int dsyr_(char *uplo, int *n, double *alpha, double *x, int *incx,
|
||||
double *a, int *lda);
|
||||
|
||||
int dsyr2_(char *uplo, int *n, double *alpha, double *x, int *incx,
|
||||
double *y, int *incy, double *a, int *lda);
|
||||
|
||||
int dsyr2k_(char *uplo, char *trans, int *n, int *k, double *alpha,
|
||||
double *a, int *lda, double *b, int *ldb, double *beta,
|
||||
double *c, int *ldc);
|
||||
|
||||
int dsyrk_(char *uplo, char *trans, int *n, int *k, double *alpha,
|
||||
double *a, int *lda, double *beta, double *c, int *ldc);
|
||||
|
||||
int dtbmv_(char *uplo, char *trans, char *diag, int *n, int *k,
|
||||
double *a, int *lda, double *x, int *incx);
|
||||
|
||||
int dtbsv_(char *uplo, char *trans, char *diag, int *n, int *k,
|
||||
double *a, int *lda, double *x, int *incx);
|
||||
|
||||
int dtpmv_(char *uplo, char *trans, char *diag, int *n, double *ap,
|
||||
double *x, int *incx);
|
||||
|
||||
int dtpsv_(char *uplo, char *trans, char *diag, int *n, double *ap,
|
||||
double *x, int *incx);
|
||||
|
||||
int dtrmm_(char *side, char *uplo, char *transa, char *diag, int *m,
|
||||
int *n, double *alpha, double *a, int *lda, double *b,
|
||||
int *ldb);
|
||||
|
||||
int dtrmv_(char *uplo, char *trans, char *diag, int *n, double *a,
|
||||
int *lda, double *x, int *incx);
|
||||
|
||||
int dtrsm_(char *side, char *uplo, char *transa, char *diag, int *m,
|
||||
int *n, double *alpha, double *a, int *lda, double *b,
|
||||
int *ldb);
|
||||
|
||||
int dtrsv_(char *uplo, char *trans, char *diag, int *n, double *a,
|
||||
int *lda, double *x, int *incx);
|
||||
|
||||
|
||||
int saxpy_(int *n, float *sa, float *sx, int *incx, float *sy, int *incy);
|
||||
|
||||
int scopy_(int *n, float *sx, int *incx, float *sy, int *incy);
|
||||
|
||||
int sgbmv_(char *trans, int *m, int *n, int *kl, int *ku,
|
||||
float *alpha, float *a, int *lda, float *x, int *incx,
|
||||
float *beta, float *y, int *incy);
|
||||
|
||||
int sgemm_(char *transa, char *transb, int *m, int *n, int *k,
|
||||
float *alpha, float *a, int *lda, float *b, int *ldb,
|
||||
float *beta, float *c, int *ldc);
|
||||
|
||||
int sgemv_(char *trans, int *m, int *n, float *alpha, float *a,
|
||||
int *lda, float *x, int *incx, float *beta, float *y,
|
||||
int *incy);
|
||||
|
||||
int sger_(int *m, int *n, float *alpha, float *x, int *incx,
|
||||
float *y, int *incy, float *a, int *lda);
|
||||
|
||||
int srot_(int *n, float *sx, int *incx, float *sy, int *incy,
|
||||
float *c, float *s);
|
||||
|
||||
int srotg_(float *sa, float *sb, float *c, float *s);
|
||||
|
||||
int ssbmv_(char *uplo, int *n, int *k, float *alpha, float *a,
|
||||
int *lda, float *x, int *incx, float *beta, float *y,
|
||||
int *incy);
|
||||
|
||||
int sscal_(int *n, float *sa, float *sx, int *incx);
|
||||
|
||||
int sspmv_(char *uplo, int *n, float *alpha, float *ap, float *x,
|
||||
int *incx, float *beta, float *y, int *incy);
|
||||
|
||||
int sspr_(char *uplo, int *n, float *alpha, float *x, int *incx,
|
||||
float *ap);
|
||||
|
||||
int sspr2_(char *uplo, int *n, float *alpha, float *x, int *incx,
|
||||
float *y, int *incy, float *ap);
|
||||
|
||||
int sswap_(int *n, float *sx, int *incx, float *sy, int *incy);
|
||||
|
||||
int ssymm_(char *side, char *uplo, int *m, int *n, float *alpha,
|
||||
float *a, int *lda, float *b, int *ldb, float *beta,
|
||||
float *c, int *ldc);
|
||||
|
||||
int ssymv_(char *uplo, int *n, float *alpha, float *a, int *lda,
|
||||
float *x, int *incx, float *beta, float *y, int *incy);
|
||||
|
||||
int ssyr_(char *uplo, int *n, float *alpha, float *x, int *incx,
|
||||
float *a, int *lda);
|
||||
|
||||
int ssyr2_(char *uplo, int *n, float *alpha, float *x, int *incx,
|
||||
float *y, int *incy, float *a, int *lda);
|
||||
|
||||
int ssyr2k_(char *uplo, char *trans, int *n, int *k, float *alpha,
|
||||
float *a, int *lda, float *b, int *ldb, float *beta,
|
||||
float *c, int *ldc);
|
||||
|
||||
int ssyrk_(char *uplo, char *trans, int *n, int *k, float *alpha,
|
||||
float *a, int *lda, float *beta, float *c, int *ldc);
|
||||
|
||||
int stbmv_(char *uplo, char *trans, char *diag, int *n, int *k,
|
||||
float *a, int *lda, float *x, int *incx);
|
||||
|
||||
int stbsv_(char *uplo, char *trans, char *diag, int *n, int *k,
|
||||
float *a, int *lda, float *x, int *incx);
|
||||
|
||||
int stpmv_(char *uplo, char *trans, char *diag, int *n, float *ap,
|
||||
float *x, int *incx);
|
||||
|
||||
int stpsv_(char *uplo, char *trans, char *diag, int *n, float *ap,
|
||||
float *x, int *incx);
|
||||
|
||||
int strmm_(char *side, char *uplo, char *transa, char *diag, int *m,
|
||||
int *n, float *alpha, float *a, int *lda, float *b,
|
||||
int *ldb);
|
||||
|
||||
int strmv_(char *uplo, char *trans, char *diag, int *n, float *a,
|
||||
int *lda, float *x, int *incx);
|
||||
|
||||
int strsm_(char *side, char *uplo, char *transa, char *diag, int *m,
|
||||
int *n, float *alpha, float *a, int *lda, float *b,
|
||||
int *ldb);
|
||||
|
||||
int strsv_(char *uplo, char *trans, char *diag, int *n, float *a,
|
||||
int *lda, float *x, int *incx);
|
||||
|
||||
int zaxpy_(int *n, dcomplex *ca, dcomplex *cx, int *incx, dcomplex *cy,
|
||||
int *incy);
|
||||
|
||||
int zcopy_(int *n, dcomplex *cx, int *incx, dcomplex *cy, int *incy);
|
||||
|
||||
int zdscal_(int *n, double *sa, dcomplex *cx, int *incx);
|
||||
|
||||
int zgbmv_(char *trans, int *m, int *n, int *kl, int *ku,
|
||||
dcomplex *alpha, dcomplex *a, int *lda, dcomplex *x, int *incx,
|
||||
dcomplex *beta, dcomplex *y, int *incy);
|
||||
|
||||
int zgemm_(char *transa, char *transb, int *m, int *n, int *k,
|
||||
dcomplex *alpha, dcomplex *a, int *lda, dcomplex *b, int *ldb,
|
||||
dcomplex *beta, dcomplex *c, int *ldc);
|
||||
|
||||
int zgemv_(char *trans, int *m, int *n, dcomplex *alpha, dcomplex *a,
|
||||
int *lda, dcomplex *x, int *incx, dcomplex *beta, dcomplex *y,
|
||||
int *incy);
|
||||
|
||||
int zgerc_(int *m, int *n, dcomplex *alpha, dcomplex *x, int *incx,
|
||||
dcomplex *y, int *incy, dcomplex *a, int *lda);
|
||||
|
||||
int zgeru_(int *m, int *n, dcomplex *alpha, dcomplex *x, int *incx,
|
||||
dcomplex *y, int *incy, dcomplex *a, int *lda);
|
||||
|
||||
int zhbmv_(char *uplo, int *n, int *k, dcomplex *alpha, dcomplex *a,
|
||||
int *lda, dcomplex *x, int *incx, dcomplex *beta, dcomplex *y,
|
||||
int *incy);
|
||||
|
||||
int zhemm_(char *side, char *uplo, int *m, int *n, dcomplex *alpha,
|
||||
dcomplex *a, int *lda, dcomplex *b, int *ldb, dcomplex *beta,
|
||||
dcomplex *c, int *ldc);
|
||||
|
||||
int zhemv_(char *uplo, int *n, dcomplex *alpha, dcomplex *a, int *lda,
|
||||
dcomplex *x, int *incx, dcomplex *beta, dcomplex *y, int *incy);
|
||||
|
||||
int zher_(char *uplo, int *n, double *alpha, dcomplex *x, int *incx,
|
||||
dcomplex *a, int *lda);
|
||||
|
||||
int zher2_(char *uplo, int *n, dcomplex *alpha, dcomplex *x, int *incx,
|
||||
dcomplex *y, int *incy, dcomplex *a, int *lda);
|
||||
|
||||
int zher2k_(char *uplo, char *trans, int *n, int *k, dcomplex *alpha,
|
||||
dcomplex *a, int *lda, dcomplex *b, int *ldb, double *beta,
|
||||
dcomplex *c, int *ldc);
|
||||
|
||||
int zherk_(char *uplo, char *trans, int *n, int *k, double *alpha,
|
||||
dcomplex *a, int *lda, double *beta, dcomplex *c, int *ldc);
|
||||
|
||||
int zhpmv_(char *uplo, int *n, dcomplex *alpha, dcomplex *ap, dcomplex *x,
|
||||
int *incx, dcomplex *beta, dcomplex *y, int *incy);
|
||||
|
||||
int zhpr_(char *uplo, int *n, double *alpha, dcomplex *x, int *incx,
|
||||
dcomplex *ap);
|
||||
|
||||
int zhpr2_(char *uplo, int *n, dcomplex *alpha, dcomplex *x, int *incx,
|
||||
dcomplex *y, int *incy, dcomplex *ap);
|
||||
|
||||
int zrotg_(dcomplex *ca, dcomplex *cb, double *c, dcomplex *s);
|
||||
|
||||
int zscal_(int *n, dcomplex *ca, dcomplex *cx, int *incx);
|
||||
|
||||
int zswap_(int *n, dcomplex *cx, int *incx, dcomplex *cy, int *incy);
|
||||
|
||||
int zsymm_(char *side, char *uplo, int *m, int *n, dcomplex *alpha,
|
||||
dcomplex *a, int *lda, dcomplex *b, int *ldb, dcomplex *beta,
|
||||
dcomplex *c, int *ldc);
|
||||
|
||||
int zsyr2k_(char *uplo, char *trans, int *n, int *k, dcomplex *alpha,
|
||||
dcomplex *a, int *lda, dcomplex *b, int *ldb, dcomplex *beta,
|
||||
dcomplex *c, int *ldc);
|
||||
|
||||
int zsyrk_(char *uplo, char *trans, int *n, int *k, dcomplex *alpha,
|
||||
dcomplex *a, int *lda, dcomplex *beta, dcomplex *c, int *ldc);
|
||||
|
||||
int ztbmv_(char *uplo, char *trans, char *diag, int *n, int *k,
|
||||
dcomplex *a, int *lda, dcomplex *x, int *incx);
|
||||
|
||||
int ztbsv_(char *uplo, char *trans, char *diag, int *n, int *k,
|
||||
dcomplex *a, int *lda, dcomplex *x, int *incx);
|
||||
|
||||
int ztpmv_(char *uplo, char *trans, char *diag, int *n, dcomplex *ap,
|
||||
dcomplex *x, int *incx);
|
||||
|
||||
int ztpsv_(char *uplo, char *trans, char *diag, int *n, dcomplex *ap,
|
||||
dcomplex *x, int *incx);
|
||||
|
||||
int ztrmm_(char *side, char *uplo, char *transa, char *diag, int *m,
|
||||
int *n, dcomplex *alpha, dcomplex *a, int *lda, dcomplex *b,
|
||||
int *ldb);
|
||||
|
||||
int ztrmv_(char *uplo, char *trans, char *diag, int *n, dcomplex *a,
|
||||
int *lda, dcomplex *x, int *incx);
|
||||
|
||||
int ztrsm_(char *side, char *uplo, char *transa, char *diag, int *m,
|
||||
int *n, dcomplex *alpha, dcomplex *a, int *lda, dcomplex *b,
|
||||
int *ldb);
|
||||
|
||||
int ztrsv_(char *uplo, char *trans, char *diag, int *n, dcomplex *a,
|
||||
int *lda, dcomplex *x, int *incx);
|
||||
49
liblinear/blas/daxpy.c
Normal file
49
liblinear/blas/daxpy.c
Normal file
@@ -0,0 +1,49 @@
|
||||
#include "blas.h"
|
||||
|
||||
int daxpy_(int *n, double *sa, double *sx, int *incx, double *sy,
|
||||
int *incy)
|
||||
{
|
||||
long int i, m, ix, iy, nn, iincx, iincy;
|
||||
register double ssa;
|
||||
|
||||
/* constant times a vector plus a vector.
|
||||
uses unrolled loop for increments equal to one.
|
||||
jack dongarra, linpack, 3/11/78.
|
||||
modified 12/3/93, array(1) declarations changed to array(*) */
|
||||
|
||||
/* Dereference inputs */
|
||||
nn = *n;
|
||||
ssa = *sa;
|
||||
iincx = *incx;
|
||||
iincy = *incy;
|
||||
|
||||
if( nn > 0 && ssa != 0.0 )
|
||||
{
|
||||
if (iincx == 1 && iincy == 1) /* code for both increments equal to 1 */
|
||||
{
|
||||
m = nn-3;
|
||||
for (i = 0; i < m; i += 4)
|
||||
{
|
||||
sy[i] += ssa * sx[i];
|
||||
sy[i+1] += ssa * sx[i+1];
|
||||
sy[i+2] += ssa * sx[i+2];
|
||||
sy[i+3] += ssa * sx[i+3];
|
||||
}
|
||||
for ( ; i < nn; ++i) /* clean-up loop */
|
||||
sy[i] += ssa * sx[i];
|
||||
}
|
||||
else /* code for unequal increments or equal increments not equal to 1 */
|
||||
{
|
||||
ix = iincx >= 0 ? 0 : (1 - nn) * iincx;
|
||||
iy = iincy >= 0 ? 0 : (1 - nn) * iincy;
|
||||
for (i = 0; i < nn; i++)
|
||||
{
|
||||
sy[iy] += ssa * sx[ix];
|
||||
ix += iincx;
|
||||
iy += iincy;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
} /* daxpy_ */
|
||||
50
liblinear/blas/ddot.c
Normal file
50
liblinear/blas/ddot.c
Normal file
@@ -0,0 +1,50 @@
|
||||
#include "blas.h"
|
||||
|
||||
double ddot_(int *n, double *sx, int *incx, double *sy, int *incy)
|
||||
{
|
||||
long int i, m, nn, iincx, iincy;
|
||||
double stemp;
|
||||
long int ix, iy;
|
||||
|
||||
/* forms the dot product of two vectors.
|
||||
uses unrolled loops for increments equal to one.
|
||||
jack dongarra, linpack, 3/11/78.
|
||||
modified 12/3/93, array(1) declarations changed to array(*) */
|
||||
|
||||
/* Dereference inputs */
|
||||
nn = *n;
|
||||
iincx = *incx;
|
||||
iincy = *incy;
|
||||
|
||||
stemp = 0.0;
|
||||
if (nn > 0)
|
||||
{
|
||||
if (iincx == 1 && iincy == 1) /* code for both increments equal to 1 */
|
||||
{
|
||||
m = nn-4;
|
||||
for (i = 0; i < m; i += 5)
|
||||
stemp += sx[i] * sy[i] + sx[i+1] * sy[i+1] + sx[i+2] * sy[i+2] +
|
||||
sx[i+3] * sy[i+3] + sx[i+4] * sy[i+4];
|
||||
|
||||
for ( ; i < nn; i++) /* clean-up loop */
|
||||
stemp += sx[i] * sy[i];
|
||||
}
|
||||
else /* code for unequal increments or equal increments not equal to 1 */
|
||||
{
|
||||
ix = 0;
|
||||
iy = 0;
|
||||
if (iincx < 0)
|
||||
ix = (1 - nn) * iincx;
|
||||
if (iincy < 0)
|
||||
iy = (1 - nn) * iincy;
|
||||
for (i = 0; i < nn; i++)
|
||||
{
|
||||
stemp += sx[ix] * sy[iy];
|
||||
ix += iincx;
|
||||
iy += iincy;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return stemp;
|
||||
} /* ddot_ */
|
||||
62
liblinear/blas/dnrm2.c
Normal file
62
liblinear/blas/dnrm2.c
Normal file
@@ -0,0 +1,62 @@
|
||||
#include <math.h> /* Needed for fabs() and sqrt() */
|
||||
#include "blas.h"
|
||||
|
||||
double dnrm2_(int *n, double *x, int *incx)
|
||||
{
|
||||
long int ix, nn, iincx;
|
||||
double norm, scale, absxi, ssq, temp;
|
||||
|
||||
/* DNRM2 returns the euclidean norm of a vector via the function
|
||||
name, so that
|
||||
|
||||
DNRM2 := sqrt( x'*x )
|
||||
|
||||
-- This version written on 25-October-1982.
|
||||
Modified on 14-October-1993 to inline the call to SLASSQ.
|
||||
Sven Hammarling, Nag Ltd. */
|
||||
|
||||
/* Dereference inputs */
|
||||
nn = *n;
|
||||
iincx = *incx;
|
||||
|
||||
if( nn > 0 && iincx > 0 )
|
||||
{
|
||||
if (nn == 1)
|
||||
{
|
||||
norm = fabs(x[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
scale = 0.0;
|
||||
ssq = 1.0;
|
||||
|
||||
/* The following loop is equivalent to this call to the LAPACK
|
||||
auxiliary routine: CALL SLASSQ( N, X, INCX, SCALE, SSQ ) */
|
||||
|
||||
for (ix=(nn-1)*iincx; ix>=0; ix-=iincx)
|
||||
{
|
||||
if (x[ix] != 0.0)
|
||||
{
|
||||
absxi = fabs(x[ix]);
|
||||
if (scale < absxi)
|
||||
{
|
||||
temp = scale / absxi;
|
||||
ssq = ssq * (temp * temp) + 1.0;
|
||||
scale = absxi;
|
||||
}
|
||||
else
|
||||
{
|
||||
temp = absxi / scale;
|
||||
ssq += temp * temp;
|
||||
}
|
||||
}
|
||||
}
|
||||
norm = scale * sqrt(ssq);
|
||||
}
|
||||
}
|
||||
else
|
||||
norm = 0.0;
|
||||
|
||||
return norm;
|
||||
|
||||
} /* dnrm2_ */
|
||||
44
liblinear/blas/dscal.c
Normal file
44
liblinear/blas/dscal.c
Normal file
@@ -0,0 +1,44 @@
|
||||
#include "blas.h"
|
||||
|
||||
int dscal_(int *n, double *sa, double *sx, int *incx)
|
||||
{
|
||||
long int i, m, nincx, nn, iincx;
|
||||
double ssa;
|
||||
|
||||
/* scales a vector by a constant.
|
||||
uses unrolled loops for increment equal to 1.
|
||||
jack dongarra, linpack, 3/11/78.
|
||||
modified 3/93 to return if incx .le. 0.
|
||||
modified 12/3/93, array(1) declarations changed to array(*) */
|
||||
|
||||
/* Dereference inputs */
|
||||
nn = *n;
|
||||
iincx = *incx;
|
||||
ssa = *sa;
|
||||
|
||||
if (nn > 0 && iincx > 0)
|
||||
{
|
||||
if (iincx == 1) /* code for increment equal to 1 */
|
||||
{
|
||||
m = nn-4;
|
||||
for (i = 0; i < m; i += 5)
|
||||
{
|
||||
sx[i] = ssa * sx[i];
|
||||
sx[i+1] = ssa * sx[i+1];
|
||||
sx[i+2] = ssa * sx[i+2];
|
||||
sx[i+3] = ssa * sx[i+3];
|
||||
sx[i+4] = ssa * sx[i+4];
|
||||
}
|
||||
for ( ; i < nn; ++i) /* clean-up loop */
|
||||
sx[i] = ssa * sx[i];
|
||||
}
|
||||
else /* code for increment not equal to 1 */
|
||||
{
|
||||
nincx = nn * iincx;
|
||||
for (i = 0; i < nincx; i += iincx)
|
||||
sx[i] = ssa * sx[i];
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
} /* dscal_ */
|
||||
95
liblinear/liblinear.vcxproj
Executable file
95
liblinear/liblinear.vcxproj
Executable file
@@ -0,0 +1,95 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="blas\daxpy.c" />
|
||||
<ClCompile Include="blas\ddot.c" />
|
||||
<ClCompile Include="blas\dnrm2.c" />
|
||||
<ClCompile Include="blas\dscal.c" />
|
||||
<ClCompile Include="linear.cpp" />
|
||||
<ClCompile Include="tron.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="blas\blas.h" />
|
||||
<ClInclude Include="blas\blasp.h" />
|
||||
<ClInclude Include="linear.h" />
|
||||
<ClInclude Include="tron.h" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{A7BE3D76-F20C-40C5-8986-DE4028B3B57D}</ProjectGuid>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<RootNamespace>liblinear</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<OutDir>.</OutDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<OutDir>.</OutDir>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
2382
liblinear/linear.cpp
Normal file
2382
liblinear/linear.cpp
Normal file
File diff suppressed because it is too large
Load Diff
18
liblinear/linear.def
Normal file
18
liblinear/linear.def
Normal file
@@ -0,0 +1,18 @@
|
||||
LIBRARY liblinear
|
||||
EXPORTS
|
||||
train @1
|
||||
cross_validation @2
|
||||
save_model @3
|
||||
load_model @4
|
||||
get_nr_feature @5
|
||||
get_nr_class @6
|
||||
get_labels @7
|
||||
predict_values @8
|
||||
predict @9
|
||||
predict_probability @10
|
||||
free_and_destroy_model @11
|
||||
free_model_content @12
|
||||
destroy_param @13
|
||||
check_parameter @14
|
||||
check_probability_model @15
|
||||
set_print_string_function @16
|
||||
73
liblinear/linear.h
Normal file
73
liblinear/linear.h
Normal file
@@ -0,0 +1,73 @@
|
||||
#ifndef _LIBLINEAR_H
|
||||
#define _LIBLINEAR_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct feature_node
|
||||
{
|
||||
int index;
|
||||
double value;
|
||||
};
|
||||
|
||||
struct problem
|
||||
{
|
||||
int l, n;
|
||||
int *y;
|
||||
struct feature_node **x;
|
||||
double bias; /* < 0 if no bias term */
|
||||
};
|
||||
|
||||
enum { L2R_LR, L2R_L2LOSS_SVC_DUAL, L2R_L2LOSS_SVC, L2R_L1LOSS_SVC_DUAL, MCSVM_CS, L1R_L2LOSS_SVC, L1R_LR, L2R_LR_DUAL }; /* solver_type */
|
||||
|
||||
struct parameter
|
||||
{
|
||||
int solver_type;
|
||||
|
||||
/* these are for training only */
|
||||
double eps; /* stopping criteria */
|
||||
double C;
|
||||
int nr_weight;
|
||||
int *weight_label;
|
||||
double* weight;
|
||||
};
|
||||
|
||||
struct model
|
||||
{
|
||||
struct parameter param;
|
||||
int nr_class; /* number of classes */
|
||||
int nr_feature;
|
||||
double *w;
|
||||
int *label; /* label of each class */
|
||||
double bias;
|
||||
};
|
||||
|
||||
struct model* train(const struct problem *prob, const struct parameter *param);
|
||||
void cross_validation(const struct problem *prob, const struct parameter *param, int nr_fold, int *target);
|
||||
|
||||
int predict_values(const struct model *model_, const struct feature_node *x, double* dec_values);
|
||||
int predict(const struct model *model_, const struct feature_node *x);
|
||||
int predict_probability(const struct model *model_, const struct feature_node *x, double* prob_estimates);
|
||||
|
||||
int save_model(const char *model_file_name, const struct model *model_);
|
||||
struct model *load_model(const char *model_file_name);
|
||||
|
||||
int get_nr_feature(const struct model *model_);
|
||||
int get_nr_class(const struct model *model_);
|
||||
void get_labels(const struct model *model_, int* label);
|
||||
|
||||
void free_model_content(struct model *model_ptr);
|
||||
void free_and_destroy_model(struct model **model_ptr_ptr);
|
||||
void destroy_param(struct parameter *param);
|
||||
|
||||
const char *check_parameter(const struct problem *prob, const struct parameter *param);
|
||||
int check_probability_model(const struct model *model);
|
||||
void set_print_string_function(void (*print_func) (const char*));
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _LIBLINEAR_H */
|
||||
|
||||
218
liblinear/predict.c
Normal file
218
liblinear/predict.c
Normal file
@@ -0,0 +1,218 @@
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include "linear.h"
|
||||
|
||||
struct feature_node *x;
|
||||
int max_nr_attr = 64;
|
||||
|
||||
struct model* model_;
|
||||
int flag_predict_probability=0;
|
||||
|
||||
void exit_input_error(int line_num)
|
||||
{
|
||||
fprintf(stderr,"Wrong input format at line %d\n", line_num);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static char *line = NULL;
|
||||
static int max_line_len;
|
||||
|
||||
static char* readline(FILE *input)
|
||||
{
|
||||
int len;
|
||||
|
||||
if(fgets(line,max_line_len,input) == NULL)
|
||||
return NULL;
|
||||
|
||||
while(strrchr(line,'\n') == NULL)
|
||||
{
|
||||
max_line_len *= 2;
|
||||
line = (char *) realloc(line,max_line_len);
|
||||
len = (int) strlen(line);
|
||||
if(fgets(line+len,max_line_len-len,input) == NULL)
|
||||
break;
|
||||
}
|
||||
return line;
|
||||
}
|
||||
|
||||
void do_predict(FILE *input, FILE *output, struct model* model_)
|
||||
{
|
||||
int correct = 0;
|
||||
int total = 0;
|
||||
|
||||
int nr_class=get_nr_class(model_);
|
||||
double *prob_estimates=NULL;
|
||||
int j, n;
|
||||
int nr_feature=get_nr_feature(model_);
|
||||
if(model_->bias>=0)
|
||||
n=nr_feature+1;
|
||||
else
|
||||
n=nr_feature;
|
||||
|
||||
if(flag_predict_probability)
|
||||
{
|
||||
int *labels;
|
||||
|
||||
if(!check_probability_model(model_))
|
||||
{
|
||||
fprintf(stderr, "probability output is only supported for logistic regression\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
labels=(int *) malloc(nr_class*sizeof(int));
|
||||
get_labels(model_,labels);
|
||||
prob_estimates = (double *) malloc(nr_class*sizeof(double));
|
||||
fprintf(output,"labels");
|
||||
for(j=0;j<nr_class;j++)
|
||||
fprintf(output," %d",labels[j]);
|
||||
fprintf(output,"\n");
|
||||
free(labels);
|
||||
}
|
||||
|
||||
max_line_len = 1024;
|
||||
line = (char *)malloc(max_line_len*sizeof(char));
|
||||
while(readline(input) != NULL)
|
||||
{
|
||||
int i = 0;
|
||||
int target_label, predict_label;
|
||||
char *idx, *val, *label, *endptr;
|
||||
int inst_max_index = 0; // strtol gives 0 if wrong format
|
||||
|
||||
label = strtok(line," \t\n");
|
||||
if(label == NULL) // empty line
|
||||
exit_input_error(total+1);
|
||||
|
||||
target_label = (int) strtol(label,&endptr,10);
|
||||
if(endptr == label || *endptr != '\0')
|
||||
exit_input_error(total+1);
|
||||
|
||||
while(1)
|
||||
{
|
||||
if(i>=max_nr_attr-2) // need one more for index = -1
|
||||
{
|
||||
max_nr_attr *= 2;
|
||||
x = (struct feature_node *) realloc(x,max_nr_attr*sizeof(struct feature_node));
|
||||
}
|
||||
|
||||
idx = strtok(NULL,":");
|
||||
val = strtok(NULL," \t");
|
||||
|
||||
if(val == NULL)
|
||||
break;
|
||||
errno = 0;
|
||||
x[i].index = (int) strtol(idx,&endptr,10);
|
||||
if(endptr == idx || errno != 0 || *endptr != '\0' || x[i].index <= inst_max_index)
|
||||
exit_input_error(total+1);
|
||||
else
|
||||
inst_max_index = x[i].index;
|
||||
|
||||
errno = 0;
|
||||
x[i].value = strtod(val,&endptr);
|
||||
if(endptr == val || errno != 0 || (*endptr != '\0' && !isspace(*endptr)))
|
||||
exit_input_error(total+1);
|
||||
|
||||
// feature indices larger than those in training are not used
|
||||
if(x[i].index <= nr_feature)
|
||||
++i;
|
||||
}
|
||||
|
||||
if(model_->bias>=0)
|
||||
{
|
||||
x[i].index = n;
|
||||
x[i].value = model_->bias;
|
||||
i++;
|
||||
}
|
||||
x[i].index = -1;
|
||||
|
||||
if(flag_predict_probability)
|
||||
{
|
||||
int j;
|
||||
predict_label = predict_probability(model_,x,prob_estimates);
|
||||
fprintf(output,"%d",predict_label);
|
||||
for(j=0;j<model_->nr_class;j++)
|
||||
fprintf(output," %g",prob_estimates[j]);
|
||||
fprintf(output,"\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
predict_label = predict(model_,x);
|
||||
fprintf(output,"%d\n",predict_label);
|
||||
}
|
||||
|
||||
if(predict_label == target_label)
|
||||
++correct;
|
||||
++total;
|
||||
}
|
||||
printf("Accuracy = %g%% (%d/%d)\n",(double) correct/total*100,correct,total);
|
||||
if(flag_predict_probability)
|
||||
free(prob_estimates);
|
||||
}
|
||||
|
||||
void exit_with_help()
|
||||
{
|
||||
printf(
|
||||
"Usage: predict [options] test_file model_file output_file\n"
|
||||
"options:\n"
|
||||
"-b probability_estimates: whether to output probability estimates, 0 or 1 (default 0)\n"
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
FILE *input, *output;
|
||||
int i;
|
||||
|
||||
// parse options
|
||||
for(i=1;i<argc;i++)
|
||||
{
|
||||
if(argv[i][0] != '-') break;
|
||||
++i;
|
||||
switch(argv[i-1][1])
|
||||
{
|
||||
case 'b':
|
||||
flag_predict_probability = atoi(argv[i]);
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf(stderr,"unknown option: -%c\n", argv[i-1][1]);
|
||||
exit_with_help();
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(i>=argc)
|
||||
exit_with_help();
|
||||
|
||||
input = fopen(argv[i],"r");
|
||||
if(input == NULL)
|
||||
{
|
||||
fprintf(stderr,"can't open input file %s\n",argv[i]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
output = fopen(argv[i+2],"w");
|
||||
if(output == NULL)
|
||||
{
|
||||
fprintf(stderr,"can't open output file %s\n",argv[i+2]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if((model_=load_model(argv[i+1]))==0)
|
||||
{
|
||||
fprintf(stderr,"can't open model file %s\n",argv[i+1]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
x = (struct feature_node *) malloc(max_nr_attr*sizeof(struct feature_node));
|
||||
do_predict(input, output, model_);
|
||||
free_and_destroy_model(&model_);
|
||||
free(line);
|
||||
free(x);
|
||||
fclose(input);
|
||||
fclose(output);
|
||||
return 0;
|
||||
}
|
||||
|
||||
340
liblinear/train.c
Normal file
340
liblinear/train.c
Normal file
@@ -0,0 +1,340 @@
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include "linear.h"
|
||||
#define Malloc(type,n) (type *)malloc((n)*sizeof(type))
|
||||
#define INF HUGE_VAL
|
||||
|
||||
void print_null(const char *s) {}
|
||||
|
||||
void exit_with_help()
|
||||
{
|
||||
printf(
|
||||
"Usage: train [options] training_set_file [model_file]\n"
|
||||
"options:\n"
|
||||
"-s type : set type of solver (default 1)\n"
|
||||
" 0 -- L2-regularized logistic regression (primal)\n"
|
||||
" 1 -- L2-regularized L2-loss support vector classification (dual)\n"
|
||||
" 2 -- L2-regularized L2-loss support vector classification (primal)\n"
|
||||
" 3 -- L2-regularized L1-loss support vector classification (dual)\n"
|
||||
" 4 -- multi-class support vector classification by Crammer and Singer\n"
|
||||
" 5 -- L1-regularized L2-loss support vector classification\n"
|
||||
" 6 -- L1-regularized logistic regression\n"
|
||||
" 7 -- L2-regularized logistic regression (dual)\n"
|
||||
"-c cost : set the parameter C (default 1)\n"
|
||||
"-e epsilon : set tolerance of termination criterion\n"
|
||||
" -s 0 and 2\n"
|
||||
" |f'(w)|_2 <= eps*min(pos,neg)/l*|f'(w0)|_2,\n"
|
||||
" where f is the primal function and pos/neg are # of\n"
|
||||
" positive/negative data (default 0.01)\n"
|
||||
" -s 1, 3, 4 and 7\n"
|
||||
" Dual maximal violation <= eps; similar to libsvm (default 0.1)\n"
|
||||
" -s 5 and 6\n"
|
||||
" |f'(w)|_1 <= eps*min(pos,neg)/l*|f'(w0)|_1,\n"
|
||||
" where f is the primal function (default 0.01)\n"
|
||||
"-B bias : if bias >= 0, instance x becomes [x; bias]; if < 0, no bias term added (default -1)\n"
|
||||
"-wi weight: weights adjust the parameter C of different classes (see README for details)\n"
|
||||
"-v n: n-fold cross validation mode\n"
|
||||
"-q : quiet mode (no outputs)\n"
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void exit_input_error(int line_num)
|
||||
{
|
||||
fprintf(stderr,"Wrong input format at line %d\n", line_num);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static char *line = NULL;
|
||||
static int max_line_len;
|
||||
|
||||
static char* readline(FILE *input)
|
||||
{
|
||||
int len;
|
||||
|
||||
if(fgets(line,max_line_len,input) == NULL)
|
||||
return NULL;
|
||||
|
||||
while(strrchr(line,'\n') == NULL)
|
||||
{
|
||||
max_line_len *= 2;
|
||||
line = (char *) realloc(line,max_line_len);
|
||||
len = (int) strlen(line);
|
||||
if(fgets(line+len,max_line_len-len,input) == NULL)
|
||||
break;
|
||||
}
|
||||
return line;
|
||||
}
|
||||
|
||||
void parse_command_line(int argc, char **argv, char *input_file_name, char *model_file_name);
|
||||
void read_problem(const char *filename);
|
||||
void do_cross_validation();
|
||||
|
||||
struct feature_node *x_space;
|
||||
struct parameter param;
|
||||
struct problem prob;
|
||||
struct model* model_;
|
||||
int flag_cross_validation;
|
||||
int nr_fold;
|
||||
double bias;
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
char input_file_name[1024];
|
||||
char model_file_name[1024];
|
||||
const char *error_msg;
|
||||
|
||||
parse_command_line(argc, argv, input_file_name, model_file_name);
|
||||
read_problem(input_file_name);
|
||||
error_msg = check_parameter(&prob,¶m);
|
||||
|
||||
if(error_msg)
|
||||
{
|
||||
fprintf(stderr,"Error: %s\n",error_msg);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if(flag_cross_validation)
|
||||
{
|
||||
do_cross_validation();
|
||||
}
|
||||
else
|
||||
{
|
||||
model_=train(&prob, ¶m);
|
||||
if(save_model(model_file_name, model_))
|
||||
{
|
||||
fprintf(stderr,"can't save model to file %s\n",model_file_name);
|
||||
exit(1);
|
||||
}
|
||||
free_and_destroy_model(&model_);
|
||||
}
|
||||
destroy_param(¶m);
|
||||
free(prob.y);
|
||||
free(prob.x);
|
||||
free(x_space);
|
||||
free(line);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void do_cross_validation()
|
||||
{
|
||||
int i;
|
||||
int total_correct = 0;
|
||||
int *target = Malloc(int, prob.l);
|
||||
|
||||
cross_validation(&prob,¶m,nr_fold,target);
|
||||
|
||||
for(i=0;i<prob.l;i++)
|
||||
if(target[i] == prob.y[i])
|
||||
++total_correct;
|
||||
printf("Cross Validation Accuracy = %g%%\n",100.0*total_correct/prob.l);
|
||||
|
||||
free(target);
|
||||
}
|
||||
|
||||
void parse_command_line(int argc, char **argv, char *input_file_name, char *model_file_name)
|
||||
{
|
||||
int i;
|
||||
void (*print_func)(const char*) = NULL; // default printing to stdout
|
||||
|
||||
// default values
|
||||
param.solver_type = L2R_L2LOSS_SVC_DUAL;
|
||||
param.C = 1;
|
||||
param.eps = INF; // see setting below
|
||||
param.nr_weight = 0;
|
||||
param.weight_label = NULL;
|
||||
param.weight = NULL;
|
||||
flag_cross_validation = 0;
|
||||
bias = -1;
|
||||
|
||||
// parse options
|
||||
for(i=1;i<argc;i++)
|
||||
{
|
||||
if(argv[i][0] != '-') break;
|
||||
if(++i>=argc)
|
||||
exit_with_help();
|
||||
switch(argv[i-1][1])
|
||||
{
|
||||
case 's':
|
||||
param.solver_type = atoi(argv[i]);
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
param.C = atof(argv[i]);
|
||||
break;
|
||||
|
||||
case 'e':
|
||||
param.eps = atof(argv[i]);
|
||||
break;
|
||||
|
||||
case 'B':
|
||||
bias = atof(argv[i]);
|
||||
break;
|
||||
|
||||
case 'w':
|
||||
++param.nr_weight;
|
||||
param.weight_label = (int *) realloc(param.weight_label,sizeof(int)*param.nr_weight);
|
||||
param.weight = (double *) realloc(param.weight,sizeof(double)*param.nr_weight);
|
||||
param.weight_label[param.nr_weight-1] = atoi(&argv[i-1][2]);
|
||||
param.weight[param.nr_weight-1] = atof(argv[i]);
|
||||
break;
|
||||
|
||||
case 'v':
|
||||
flag_cross_validation = 1;
|
||||
nr_fold = atoi(argv[i]);
|
||||
if(nr_fold < 2)
|
||||
{
|
||||
fprintf(stderr,"n-fold cross validation: n must >= 2\n");
|
||||
exit_with_help();
|
||||
}
|
||||
break;
|
||||
|
||||
case 'q':
|
||||
print_func = &print_null;
|
||||
i--;
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf(stderr,"unknown option: -%c\n", argv[i-1][1]);
|
||||
exit_with_help();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
set_print_string_function(print_func);
|
||||
|
||||
// determine filenames
|
||||
if(i>=argc)
|
||||
exit_with_help();
|
||||
|
||||
strcpy(input_file_name, argv[i]);
|
||||
|
||||
if(i<argc-1)
|
||||
strcpy(model_file_name,argv[i+1]);
|
||||
else
|
||||
{
|
||||
char *p = strrchr(argv[i],'/');
|
||||
if(p==NULL)
|
||||
p = argv[i];
|
||||
else
|
||||
++p;
|
||||
sprintf(model_file_name,"%s.model",p);
|
||||
}
|
||||
|
||||
if(param.eps == INF)
|
||||
{
|
||||
if(param.solver_type == L2R_LR || param.solver_type == L2R_L2LOSS_SVC)
|
||||
param.eps = 0.01;
|
||||
else if(param.solver_type == L2R_L2LOSS_SVC_DUAL || param.solver_type == L2R_L1LOSS_SVC_DUAL || param.solver_type == MCSVM_CS || param.solver_type == L2R_LR_DUAL)
|
||||
param.eps = 0.1;
|
||||
else if(param.solver_type == L1R_L2LOSS_SVC || param.solver_type == L1R_LR)
|
||||
param.eps = 0.01;
|
||||
}
|
||||
}
|
||||
|
||||
// read in a problem (in libsvm format)
|
||||
void read_problem(const char *filename)
|
||||
{
|
||||
int max_index, inst_max_index, i;
|
||||
long int elements, j;
|
||||
FILE *fp = fopen(filename,"r");
|
||||
char *endptr;
|
||||
char *idx, *val, *label;
|
||||
|
||||
if(fp == NULL)
|
||||
{
|
||||
fprintf(stderr,"can't open input file %s\n",filename);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
prob.l = 0;
|
||||
elements = 0;
|
||||
max_line_len = 1024;
|
||||
line = Malloc(char,max_line_len);
|
||||
while(readline(fp)!=NULL)
|
||||
{
|
||||
char *p = strtok(line," \t"); // label
|
||||
|
||||
// features
|
||||
while(1)
|
||||
{
|
||||
p = strtok(NULL," \t");
|
||||
if(p == NULL || *p == '\n') // check '\n' as ' ' may be after the last feature
|
||||
break;
|
||||
elements++;
|
||||
}
|
||||
elements++; // for bias term
|
||||
prob.l++;
|
||||
}
|
||||
rewind(fp);
|
||||
|
||||
prob.bias=bias;
|
||||
|
||||
prob.y = Malloc(int,prob.l);
|
||||
prob.x = Malloc(struct feature_node *,prob.l);
|
||||
x_space = Malloc(struct feature_node,elements+prob.l);
|
||||
|
||||
max_index = 0;
|
||||
j=0;
|
||||
for(i=0;i<prob.l;i++)
|
||||
{
|
||||
inst_max_index = 0; // strtol gives 0 if wrong format
|
||||
readline(fp);
|
||||
prob.x[i] = &x_space[j];
|
||||
label = strtok(line," \t\n");
|
||||
if(label == NULL) // empty line
|
||||
exit_input_error(i+1);
|
||||
|
||||
prob.y[i] = (int) strtol(label,&endptr,10);
|
||||
if(endptr == label || *endptr != '\0')
|
||||
exit_input_error(i+1);
|
||||
|
||||
while(1)
|
||||
{
|
||||
idx = strtok(NULL,":");
|
||||
val = strtok(NULL," \t");
|
||||
|
||||
if(val == NULL)
|
||||
break;
|
||||
|
||||
errno = 0;
|
||||
x_space[j].index = (int) strtol(idx,&endptr,10);
|
||||
if(endptr == idx || errno != 0 || *endptr != '\0' || x_space[j].index <= inst_max_index)
|
||||
exit_input_error(i+1);
|
||||
else
|
||||
inst_max_index = x_space[j].index;
|
||||
|
||||
errno = 0;
|
||||
x_space[j].value = strtod(val,&endptr);
|
||||
if(endptr == val || errno != 0 || (*endptr != '\0' && !isspace(*endptr)))
|
||||
exit_input_error(i+1);
|
||||
|
||||
++j;
|
||||
}
|
||||
|
||||
if(inst_max_index > max_index)
|
||||
max_index = inst_max_index;
|
||||
|
||||
if(prob.bias >= 0)
|
||||
x_space[j++].value = prob.bias;
|
||||
|
||||
x_space[j++].index = -1;
|
||||
}
|
||||
|
||||
if(prob.bias >= 0)
|
||||
{
|
||||
prob.n=max_index+1;
|
||||
for(i=1;i<prob.l;i++)
|
||||
(prob.x[i]-2)->index = prob.n;
|
||||
x_space[j-2].index = prob.n;
|
||||
}
|
||||
else
|
||||
prob.n=max_index;
|
||||
|
||||
fclose(fp);
|
||||
}
|
||||
235
liblinear/tron.cpp
Normal file
235
liblinear/tron.cpp
Normal file
@@ -0,0 +1,235 @@
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include "tron.h"
|
||||
|
||||
#ifndef min
|
||||
template <class T> static inline T min(T x,T y) { return (x<y)?x:y; }
|
||||
#endif
|
||||
|
||||
#ifndef max
|
||||
template <class T> static inline T max(T x,T y) { return (x>y)?x:y; }
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern double dnrm2_(int *, double *, int *);
|
||||
extern double ddot_(int *, double *, int *, double *, int *);
|
||||
extern int daxpy_(int *, double *, double *, int *, double *, int *);
|
||||
extern int dscal_(int *, double *, double *, int *);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
static void default_print(const char *buf)
|
||||
{
|
||||
fputs(buf,stdout);
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
void TRON::info(const char *fmt,...)
|
||||
{
|
||||
char buf[BUFSIZ];
|
||||
va_list ap;
|
||||
va_start(ap,fmt);
|
||||
vsprintf(buf,fmt,ap);
|
||||
va_end(ap);
|
||||
(*tron_print_string)(buf);
|
||||
}
|
||||
|
||||
TRON::TRON(const function *fun_obj, double eps, int max_iter)
|
||||
{
|
||||
this->fun_obj=const_cast<function *>(fun_obj);
|
||||
this->eps=eps;
|
||||
this->max_iter=max_iter;
|
||||
tron_print_string = default_print;
|
||||
}
|
||||
|
||||
TRON::~TRON()
|
||||
{
|
||||
}
|
||||
|
||||
void TRON::tron(double *w)
|
||||
{
|
||||
// Parameters for updating the iterates.
|
||||
double eta0 = 1e-4, eta1 = 0.25, eta2 = 0.75;
|
||||
|
||||
// Parameters for updating the trust region size delta.
|
||||
double sigma1 = 0.25, sigma2 = 0.5, sigma3 = 4;
|
||||
|
||||
int n = fun_obj->get_nr_variable();
|
||||
int i, cg_iter;
|
||||
double delta, snorm, one=1.0;
|
||||
double alpha, f, fnew, prered, actred, gs;
|
||||
int search = 1, iter = 1, inc = 1;
|
||||
double *s = new double[n];
|
||||
double *r = new double[n];
|
||||
double *w_new = new double[n];
|
||||
double *g = new double[n];
|
||||
|
||||
for (i=0; i<n; i++)
|
||||
w[i] = 0;
|
||||
|
||||
f = fun_obj->fun(w);
|
||||
fun_obj->grad(w, g);
|
||||
delta = dnrm2_(&n, g, &inc);
|
||||
double gnorm1 = delta;
|
||||
double gnorm = gnorm1;
|
||||
|
||||
if (gnorm <= eps*gnorm1)
|
||||
search = 0;
|
||||
|
||||
iter = 1;
|
||||
|
||||
while (iter <= max_iter && search)
|
||||
{
|
||||
cg_iter = trcg(delta, g, s, r);
|
||||
|
||||
memcpy(w_new, w, sizeof(double)*n);
|
||||
daxpy_(&n, &one, s, &inc, w_new, &inc);
|
||||
|
||||
gs = ddot_(&n, g, &inc, s, &inc);
|
||||
prered = -0.5*(gs-ddot_(&n, s, &inc, r, &inc));
|
||||
fnew = fun_obj->fun(w_new);
|
||||
|
||||
// Compute the actual reduction.
|
||||
actred = f - fnew;
|
||||
|
||||
// On the first iteration, adjust the initial step bound.
|
||||
snorm = dnrm2_(&n, s, &inc);
|
||||
if (iter == 1)
|
||||
delta = min(delta, snorm);
|
||||
|
||||
// Compute prediction alpha*snorm of the step.
|
||||
if (fnew - f - gs <= 0)
|
||||
alpha = sigma3;
|
||||
else
|
||||
alpha = max(sigma1, -0.5*(gs/(fnew - f - gs)));
|
||||
|
||||
// Update the trust region bound according to the ratio of actual to predicted reduction.
|
||||
if (actred < eta0*prered)
|
||||
delta = min(max(alpha, sigma1)*snorm, sigma2*delta);
|
||||
else if (actred < eta1*prered)
|
||||
delta = max(sigma1*delta, min(alpha*snorm, sigma2*delta));
|
||||
else if (actred < eta2*prered)
|
||||
delta = max(sigma1*delta, min(alpha*snorm, sigma3*delta));
|
||||
else
|
||||
delta = max(delta, min(alpha*snorm, sigma3*delta));
|
||||
|
||||
info("iter %2d act %5.3e pre %5.3e delta %5.3e f %5.3e |g| %5.3e CG %3d\n", iter, actred, prered, delta, f, gnorm, cg_iter);
|
||||
|
||||
if (actred > eta0*prered)
|
||||
{
|
||||
iter++;
|
||||
memcpy(w, w_new, sizeof(double)*n);
|
||||
f = fnew;
|
||||
fun_obj->grad(w, g);
|
||||
|
||||
gnorm = dnrm2_(&n, g, &inc);
|
||||
if (gnorm <= eps*gnorm1)
|
||||
break;
|
||||
}
|
||||
if (f < -1.0e+32)
|
||||
{
|
||||
info("warning: f < -1.0e+32\n");
|
||||
break;
|
||||
}
|
||||
if (fabs(actred) <= 0 && prered <= 0)
|
||||
{
|
||||
info("warning: actred and prered <= 0\n");
|
||||
break;
|
||||
}
|
||||
if (fabs(actred) <= 1.0e-12*fabs(f) &&
|
||||
fabs(prered) <= 1.0e-12*fabs(f))
|
||||
{
|
||||
info("warning: actred and prered too small\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
delete[] g;
|
||||
delete[] r;
|
||||
delete[] w_new;
|
||||
delete[] s;
|
||||
}
|
||||
|
||||
int TRON::trcg(double delta, double *g, double *s, double *r)
|
||||
{
|
||||
int i, inc = 1;
|
||||
int n = fun_obj->get_nr_variable();
|
||||
double one = 1;
|
||||
double *d = new double[n];
|
||||
double *Hd = new double[n];
|
||||
double rTr, rnewTrnew, alpha, beta, cgtol;
|
||||
|
||||
for (i=0; i<n; i++)
|
||||
{
|
||||
s[i] = 0;
|
||||
r[i] = -g[i];
|
||||
d[i] = r[i];
|
||||
}
|
||||
cgtol = 0.1*dnrm2_(&n, g, &inc);
|
||||
|
||||
int cg_iter = 0;
|
||||
rTr = ddot_(&n, r, &inc, r, &inc);
|
||||
while (1)
|
||||
{
|
||||
if (dnrm2_(&n, r, &inc) <= cgtol)
|
||||
break;
|
||||
cg_iter++;
|
||||
fun_obj->Hv(d, Hd);
|
||||
|
||||
alpha = rTr/ddot_(&n, d, &inc, Hd, &inc);
|
||||
daxpy_(&n, &alpha, d, &inc, s, &inc);
|
||||
if (dnrm2_(&n, s, &inc) > delta)
|
||||
{
|
||||
info("cg reaches trust region boundary\n");
|
||||
alpha = -alpha;
|
||||
daxpy_(&n, &alpha, d, &inc, s, &inc);
|
||||
|
||||
double std = ddot_(&n, s, &inc, d, &inc);
|
||||
double sts = ddot_(&n, s, &inc, s, &inc);
|
||||
double dtd = ddot_(&n, d, &inc, d, &inc);
|
||||
double dsq = delta*delta;
|
||||
double rad = sqrt(std*std + dtd*(dsq-sts));
|
||||
if (std >= 0)
|
||||
alpha = (dsq - sts)/(std + rad);
|
||||
else
|
||||
alpha = (rad - std)/dtd;
|
||||
daxpy_(&n, &alpha, d, &inc, s, &inc);
|
||||
alpha = -alpha;
|
||||
daxpy_(&n, &alpha, Hd, &inc, r, &inc);
|
||||
break;
|
||||
}
|
||||
alpha = -alpha;
|
||||
daxpy_(&n, &alpha, Hd, &inc, r, &inc);
|
||||
rnewTrnew = ddot_(&n, r, &inc, r, &inc);
|
||||
beta = rnewTrnew/rTr;
|
||||
dscal_(&n, &beta, d, &inc);
|
||||
daxpy_(&n, &one, r, &inc, d, &inc);
|
||||
rTr = rnewTrnew;
|
||||
}
|
||||
|
||||
delete[] d;
|
||||
delete[] Hd;
|
||||
|
||||
return(cg_iter);
|
||||
}
|
||||
|
||||
double TRON::norm_inf(int n, double *x)
|
||||
{
|
||||
double dmax = fabs(x[0]);
|
||||
for (int i=1; i<n; i++)
|
||||
if (fabs(x[i]) >= dmax)
|
||||
dmax = fabs(x[i]);
|
||||
return(dmax);
|
||||
}
|
||||
|
||||
void TRON::set_print_string(void (*print_string) (const char *buf))
|
||||
{
|
||||
tron_print_string = print_string;
|
||||
}
|
||||
34
liblinear/tron.h
Normal file
34
liblinear/tron.h
Normal file
@@ -0,0 +1,34 @@
|
||||
#ifndef _TRON_H
|
||||
#define _TRON_H
|
||||
|
||||
class function
|
||||
{
|
||||
public:
|
||||
virtual double fun(double *w) = 0 ;
|
||||
virtual void grad(double *w, double *g) = 0 ;
|
||||
virtual void Hv(double *s, double *Hs) = 0 ;
|
||||
|
||||
virtual int get_nr_variable(void) = 0 ;
|
||||
virtual ~function(void){}
|
||||
};
|
||||
|
||||
class TRON
|
||||
{
|
||||
public:
|
||||
TRON(const function *fun_obj, double eps = 0.1, int max_iter = 1000);
|
||||
~TRON();
|
||||
|
||||
void tron(double *w);
|
||||
void set_print_string(void (*i_print) (const char *buf));
|
||||
|
||||
private:
|
||||
int trcg(double delta, double *g, double *s, double *r);
|
||||
double norm_inf(int n, double *x);
|
||||
|
||||
double eps;
|
||||
int max_iter;
|
||||
function *fun_obj;
|
||||
void info(const char *fmt,...);
|
||||
void (*tron_print_string)(const char *buf);
|
||||
};
|
||||
#endif
|
||||
344
libnetutil/ARPHeader.cc
Normal file
344
libnetutil/ARPHeader.cc
Normal file
@@ -0,0 +1,344 @@
|
||||
|
||||
/***************************************************************************
|
||||
* ARPHeader.cc -- The ARPHeader Class represents an ARP packet. It *
|
||||
* contains methods to set any header field. In general, these methods do *
|
||||
* error checkings and byte order conversion. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#include "ARPHeader.h"
|
||||
|
||||
/******************************************************************************/
|
||||
/* CONTRUCTORS, DESTRUCTORS AND INITIALIZATION METHODS */
|
||||
/******************************************************************************/
|
||||
ARPHeader::ARPHeader() {
|
||||
this->reset();
|
||||
} /* End of ARPHeader constructor */
|
||||
|
||||
|
||||
ARPHeader::~ARPHeader() {
|
||||
|
||||
} /* End of ARPHeader destructor */
|
||||
|
||||
|
||||
/** Sets every attribute to its default value */
|
||||
void ARPHeader::reset(){
|
||||
memset (&this->h, 0, sizeof(nping_arp_hdr_t));
|
||||
this->length=ARP_HEADER_LEN;
|
||||
} /* End of reset() */
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* PacketElement:: OVERWRITTEN METHODS */
|
||||
/******************************************************************************/
|
||||
|
||||
/** @warning This method is essential for the superclass getBinaryBuffer()
|
||||
* method to work. Do NOT change a thing unless you know what you're doing */
|
||||
u8 *ARPHeader::getBufferPointer(){
|
||||
return (u8*)(&h);
|
||||
} /* End of getBufferPointer() */
|
||||
|
||||
|
||||
/** Stores supplied packet in the internal buffer so the information
|
||||
* can be accessed using the standard get & set methods.
|
||||
* @warning The ARPHeader class is able to hold a maximum of 28 bytes.
|
||||
* If the supplied buffer is longer than that, only the first 28 bytes will be
|
||||
* stored in the internal buffer.
|
||||
* @warning Supplied len MUST be at least 28 bytes (ARP header length).
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error */
|
||||
int ARPHeader::storeRecvData(const u8 *buf, size_t len){
|
||||
if(buf==NULL || len<ARP_HEADER_LEN){
|
||||
return OP_FAILURE;
|
||||
}else{
|
||||
this->reset(); /* Re-init the object, just in case the caller had used it already */
|
||||
this->length=ARP_HEADER_LEN;
|
||||
memcpy(&(this->h), buf, ARP_HEADER_LEN);
|
||||
}
|
||||
return OP_SUCCESS;
|
||||
} /* End of storeRecvData() */
|
||||
|
||||
|
||||
/* Returns a protocol identifier. This is used by packet parsing funtions
|
||||
* that return linked lists of PacketElement objects, to determine the protocol
|
||||
* the object represents. */
|
||||
int ARPHeader::protocol_id() const {
|
||||
return HEADER_TYPE_ARP;
|
||||
} /* End of protocol_id() */
|
||||
|
||||
|
||||
/** Determines if the data stored in the object after an storeRecvData() call
|
||||
* is valid and safe to use. This mainly checks the length of the data but may
|
||||
* also test the value of certain protocol fields to ensure their correctness.
|
||||
* @return the length, in bytes, of the header, if its found to be valid or
|
||||
* OP_FAILURE (-1) otherwise. */
|
||||
int ARPHeader::validate(){
|
||||
if( this->length!=ARP_HEADER_LEN)
|
||||
return OP_FAILURE;
|
||||
else
|
||||
return ARP_HEADER_LEN;
|
||||
} /* End of validate() */
|
||||
|
||||
|
||||
/** Prints the contents of the header and calls print() on the next protocol
|
||||
* header in the chain (if there is any).
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int ARPHeader::print(FILE *output, int detail) const {
|
||||
fprintf(output, "ARP[]");
|
||||
if(this->next!=NULL){
|
||||
print_separator(output, detail);
|
||||
next->print(output, detail);
|
||||
}
|
||||
return OP_SUCCESS;
|
||||
} /* End of print() */
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* PROTOCOL-SPECIFIC METHODS */
|
||||
/******************************************************************************/
|
||||
|
||||
/** Sets HardwareType.
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int ARPHeader::setHardwareType(u16 val){
|
||||
this->h.ar_hrd=htons(val);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setHardwareType() */
|
||||
|
||||
|
||||
/** Sets HardwareType to ETHERNET.
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int ARPHeader::setHardwareType(){
|
||||
this->h.ar_hrd=htons(HDR_ETH10MB);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setHardwareType() */
|
||||
|
||||
|
||||
/** Returns value of attribute h.ar_hrd */
|
||||
u16 ARPHeader::getHardwareType(){
|
||||
return ntohs(this->h.ar_hrd);
|
||||
} /* End of getHardwareType() */
|
||||
|
||||
|
||||
/** Sets ProtocolType.
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int ARPHeader::setProtocolType(u16 val){
|
||||
this->h.ar_pro=htons(val);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setProtocolType() */
|
||||
|
||||
|
||||
/** Sets ProtocolType.
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int ARPHeader::setProtocolType(){
|
||||
this->h.ar_pro=htons(0x0800); /* DEFAULT: IPv4 */
|
||||
return OP_SUCCESS;
|
||||
} /* End of setProtocolType() */
|
||||
|
||||
|
||||
/** Returns value of attribute h.ar_pro */
|
||||
u16 ARPHeader::getProtocolType(){
|
||||
return ntohs(this->h.ar_pro);
|
||||
} /* End of getProtocolType() */
|
||||
|
||||
|
||||
/** Sets HwAddrLen.
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int ARPHeader::setHwAddrLen(u8 val){
|
||||
this->h.ar_hln=val;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setHwAddrLen() */
|
||||
|
||||
|
||||
/** Sets HwAddrLen.
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int ARPHeader::setHwAddrLen(){
|
||||
this->h.ar_hln=ETH_ADDRESS_LEN;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setHwAddrLen() */
|
||||
|
||||
|
||||
/** Returns value of attribute h.ar_hln */
|
||||
u8 ARPHeader::getHwAddrLen(){
|
||||
return this->h.ar_hln;
|
||||
} /* End of getHwAddrLen() */
|
||||
|
||||
|
||||
/** Sets ProtoAddrLen.
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int ARPHeader::setProtoAddrLen(u8 val){
|
||||
this->h.ar_pln=val;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setProtoAddrLen() */
|
||||
|
||||
|
||||
/** Sets ProtoAddrLen.
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int ARPHeader::setProtoAddrLen(){
|
||||
this->h.ar_pln=IPv4_ADDRESS_LEN; /* DEFAULT: IPv4 */
|
||||
return OP_SUCCESS;
|
||||
} /* End of setProtoAddrLen() */
|
||||
|
||||
|
||||
/** Returns value of attribute h.ar_pln */
|
||||
u8 ARPHeader::getProtoAddrLen(){
|
||||
return this->h.ar_pln;
|
||||
} /* End of getProtoAddrLen() */
|
||||
|
||||
|
||||
/** Sets OpCode.
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int ARPHeader::setOpCode(u16 val){
|
||||
this->h.ar_op=htons(val);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setOpCode() */
|
||||
|
||||
|
||||
/** Returns value of attribute h.ar_op */
|
||||
u16 ARPHeader::getOpCode(){
|
||||
return ntohs(this->h.ar_op);
|
||||
} /* End of getOpCode() */
|
||||
|
||||
|
||||
/** Sets SenderMAC.
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int ARPHeader::setSenderMAC(const u8 * val){
|
||||
if(val==NULL)
|
||||
return OP_FAILURE;
|
||||
memcpy(this->h.data, val, ETH_ADDRESS_LEN);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSenderMAC() */
|
||||
|
||||
|
||||
/** Returns value of attribute h.ar_sha */
|
||||
u8 * ARPHeader::getSenderMAC(){
|
||||
return this->h.data;
|
||||
} /* End of getSenderMAC() */
|
||||
|
||||
|
||||
/** Sets SenderIP.
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int ARPHeader::setSenderIP(struct in_addr val){
|
||||
memcpy(this->h.data+6, &val.s_addr, 4);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSenderIP() */
|
||||
|
||||
|
||||
/** Returns value of attribute h.ar_sip */
|
||||
u32 ARPHeader::getSenderIP(){
|
||||
u32 *p = (u32 *)(this->h.data+6);
|
||||
return *p;
|
||||
} /* End of getSenderIP() */
|
||||
|
||||
|
||||
/** Sets TargetMAC.
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int ARPHeader::setTargetMAC(u8 * val){
|
||||
if(val==NULL)
|
||||
return OP_FAILURE;
|
||||
memcpy(this->h.data+10, val, ETH_ADDRESS_LEN);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setTargetMAC() */
|
||||
|
||||
|
||||
/** Returns value of attribute h.ar_tha */
|
||||
u8 * ARPHeader::getTargetMAC(){
|
||||
return this->h.data+10;
|
||||
} /* End of getTargetMAC() */
|
||||
|
||||
|
||||
/** Sets TargetIP.
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int ARPHeader::setTargetIP(struct in_addr val){
|
||||
memcpy(this->h.data+16, &val.s_addr, 4);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setTargetIP() */
|
||||
|
||||
|
||||
/** Returns value of attribute h.ar_tip */
|
||||
u32 ARPHeader::getTargetIP(){
|
||||
u32 *p = (u32 *)(this->h.data+16);
|
||||
return *p;
|
||||
} /* End of getTargetIP() */
|
||||
251
libnetutil/ARPHeader.h
Normal file
251
libnetutil/ARPHeader.h
Normal file
@@ -0,0 +1,251 @@
|
||||
|
||||
/***************************************************************************
|
||||
* ARPHeader.h -- The ARPHeader Class represents an ARP packet. It *
|
||||
* contains methods to set any header field. In general, these methods do *
|
||||
* error checkings and byte order conversion. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#ifndef __ARPHEADER_H__
|
||||
#define __ARPHEADER_H__ 1
|
||||
|
||||
#include "NetworkLayerElement.h"
|
||||
|
||||
/* Lengths */
|
||||
#define ARP_HEADER_LEN 28
|
||||
#define IPv4_ADDRESS_LEN 4
|
||||
#define ETH_ADDRESS_LEN 6
|
||||
|
||||
/* Hardware Types */
|
||||
#define HDR_RESERVED 0 /* [RFC5494] */
|
||||
#define HDR_ETH10MB 1 /* Ethernet (10Mb) */
|
||||
#define HDR_ETH3MB 2 /* Experimental Ethernet (3Mb) */
|
||||
#define HDR_AX25 3 /* Amateur Radio AX.25 */
|
||||
#define HDR_PRONET_TR 4 /* Proteon ProNET Token Ring */
|
||||
#define HDR_CHAOS 5 /* Chaos */
|
||||
#define HDR_IEEE802 6 /* IEEE 802 Networks */
|
||||
#define HDR_ARCNET 7 /* ARCNET [RFC1201] */
|
||||
#define HDR_HYPERCHANNEL 8 /* Hyperchannel */
|
||||
#define HDR_LANSTAR 9 /* Lanstar */
|
||||
#define HDR_AUTONET 10 /* Autonet Short Address */
|
||||
#define HDR_LOCALTALK 11 /* LocalTalk */
|
||||
#define HDR_LOCALNET 12 /* LocalNet (IBM PCNet or SYTEK LocalNET) */
|
||||
#define HDR_ULTRALINK 13 /* Ultra link */
|
||||
#define HDR_SMDS 14 /* SMDS */
|
||||
#define HDR_FRAMERELAY 15 /* Frame Relay */
|
||||
#define HDR_ATM 16 /* Asynchronous Transmission Mode (ATM) */
|
||||
#define HDR_HDLC 17 /* HDLC */
|
||||
#define HDR_FIBRE 18 /* Fibre Channel [RFC4338] */
|
||||
#define HDR_ATMb 19 /* Asynchronous Transmission Mode (ATM) */
|
||||
#define HDR_SERIAL 20 /* Serial Line */
|
||||
#define HDR_ATMc 21 /* Asynchronous Transmission Mode [RFC2225] */
|
||||
#define HDR_MILSTD 22 /* MIL-STD-188-220 */
|
||||
#define HDR_METRICOM 23 /* Metricom */
|
||||
#define HDR_IEEE1394 24 /* IEEE 1394.199 */
|
||||
#define HDR_MAPOS 25 /* MAPOS [RFC2176] */
|
||||
#define HDR_TWINAXIAL 26 /* Twinaxial */
|
||||
#define HDR_EUI64 27 /* EUI-64 */
|
||||
#define HDR_HIPARP 28 /* HIPARP */
|
||||
#define HDR_ISO7816 29 /* IP and ARP over ISO 7816-3 */
|
||||
#define HDR_ARPSEC 30 /* ARPSec */
|
||||
#define HDR_IPSEC 31 /* IPsec tunnel */
|
||||
#define HDR_INFINIBAND 32 /* InfiniBand (TM) */
|
||||
#define HDR_TIA102 33 /* TIA-102 Project 25 Common Air Interface */
|
||||
#define HDR_WIEGAND 34 /* Wiegand Interface */
|
||||
#define HDR_PUREIP 35 /* Pure IP */
|
||||
#define HDR_HW_EXP1 36 /* HW_EXP1 [RFC5494] */
|
||||
#define HDR_HW_EXP2 37 /* HW_EXP2 [RFC5494] */
|
||||
|
||||
/* Operation Codes */
|
||||
#define OP_ARP_REQUEST 1 /* ARP Request */
|
||||
#define OP_ARP_REPLY 2 /* ARP Reply */
|
||||
#define OP_RARP_REQUEST 3 /* Reverse ARP Request */
|
||||
#define OP_RARP_REPLY 4 /* Reverse ARP Reply */
|
||||
#define OP_DRARP_REQUEST 5 /* DRARP-Request */
|
||||
#define OP_DRARP_REPLY 6 /* DRARP-Reply */
|
||||
#define OP_DRARP_ERROR 7 /* DRARP-Error */
|
||||
#define OP_INARP_REQUEST 8 /* InARP-Request */
|
||||
#define OP_INARP_REPLY 9 /* InARP-Reply */
|
||||
#define OP_ARPNAK 10 /* ARP-NAK */
|
||||
#define OP_MARS_REQUEST 11 /* MARS-Request */
|
||||
#define OP_MARS_MULTI 12 /* MARS-Multi */
|
||||
#define OP_MARS_MSERV 13 /* MARS-MServ */
|
||||
#define OP_MARS_JOIN 14 /* MARS-Join */
|
||||
#define OP_MARS_LEAVE 15 /* MARS-Leave */
|
||||
#define OP_MARS_NAK 16 /* MARS-NAK */
|
||||
#define OP_MARS_UNSERV 17 /* MARS-Unserv */
|
||||
#define OP_MARS_SJOIN 18 /* MARS-SJoin */
|
||||
#define OP_MARS_SLEAVE 19 /* MARS-SLeave */
|
||||
#define OP_MARS_GL_REQ 20 /* MARS-Grouplist-Request */
|
||||
#define OP_MARS_GL_REP 21 /* MARS-Grouplist-Reply */
|
||||
#define OP_MARS_REDIR_MAP 22 /* MARS-Redirect-Map */
|
||||
#define OP_MAPOS_UNARP 23 /* MAPOS-UNARP [RFC2176] */
|
||||
#define OP_EXP1 24 /* OP_EXP1 [RFC5494] */
|
||||
#define OP_EXP2 25 /* OP_EXP2 [RFC5494] */
|
||||
#define OP_RESERVED 65535 /* Reserved [RFC5494] */
|
||||
|
||||
|
||||
class ARPHeader : public NetworkLayerElement {
|
||||
|
||||
private:
|
||||
|
||||
struct nping_arp_hdr{
|
||||
|
||||
u16 ar_hrd; /* Hardware Type. */
|
||||
u16 ar_pro; /* Protocol Type. */
|
||||
u8 ar_hln; /* Hardware Address Length. */
|
||||
u8 ar_pln; /* Protocol Address Length. */
|
||||
u16 ar_op; /* Operation Code. */
|
||||
u8 data[20];
|
||||
// Cannot use these because the fucking alignment screws up
|
||||
// everything. I miss ANSI C.
|
||||
//u8 ar_sha[6]; /* Sender Hardware Address. */
|
||||
//u32 ar_sip; /* Sender Protocol Address (IPv4 address). */
|
||||
//u8 ar_tha[6]; /* Target Hardware Address. */
|
||||
//u32 ar_tip; /* Target Protocol Address (IPv4 address). */
|
||||
}__attribute__((__packed__));
|
||||
|
||||
typedef struct nping_arp_hdr nping_arp_hdr_t;
|
||||
|
||||
nping_arp_hdr_t h;
|
||||
|
||||
public:
|
||||
|
||||
/* Misc */
|
||||
ARPHeader();
|
||||
~ARPHeader();
|
||||
void reset();
|
||||
u8 *getBufferPointer();
|
||||
int storeRecvData(const u8 *buf, size_t len);
|
||||
int protocol_id() const;
|
||||
int validate();
|
||||
int print(FILE *output, int detail) const;
|
||||
|
||||
/* Hardware Type */
|
||||
int setHardwareType(u16 t);
|
||||
int setHardwareType();
|
||||
u16 getHardwareType();
|
||||
|
||||
/* Protocol Type */
|
||||
int setProtocolType(u16 t);
|
||||
int setProtocolType();
|
||||
u16 getProtocolType();
|
||||
|
||||
/* Hardware Address Length */
|
||||
int setHwAddrLen(u8 v);
|
||||
int setHwAddrLen();
|
||||
u8 getHwAddrLen();
|
||||
|
||||
/* Hardware Address Length */
|
||||
int setProtoAddrLen(u8 v);
|
||||
int setProtoAddrLen();
|
||||
u8 getProtoAddrLen();
|
||||
|
||||
/* Operation Code */
|
||||
int setOpCode(u16 c);
|
||||
u16 getOpCode();
|
||||
|
||||
/* Sender Hardware Address */
|
||||
int setSenderMAC(const u8 *m);
|
||||
u8 *getSenderMAC();
|
||||
|
||||
/* Sender Protocol address */
|
||||
int setSenderIP(struct in_addr i);
|
||||
u32 getSenderIP();
|
||||
|
||||
/* Target Hardware Address */
|
||||
int setTargetMAC(u8 *m);
|
||||
u8 *getTargetMAC();
|
||||
|
||||
/* Target Protocol Address */
|
||||
int setTargetIP(struct in_addr i);
|
||||
u32 getTargetIP();
|
||||
|
||||
}; /* End of class ARPHeader */
|
||||
|
||||
#endif /* __ARPHEADER_H__ */
|
||||
|
||||
102
libnetutil/ApplicationLayerElement.h
Normal file
102
libnetutil/ApplicationLayerElement.h
Normal file
@@ -0,0 +1,102 @@
|
||||
|
||||
/***************************************************************************
|
||||
* ApplicationLayerElement.h -- Class ApplicationLayerElement is a *
|
||||
* generic class that represents an application layer protocol header or *
|
||||
* any kind of payload or buffer. Classes like RawData inherit from it. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#ifndef APPLICATIONLAYERELEMENT_H
|
||||
#define APPLICATIONLAYERELEMENT_H 1
|
||||
|
||||
#include "PacketElement.h"
|
||||
|
||||
|
||||
class ApplicationLayerElement : public PacketElement {
|
||||
};
|
||||
|
||||
#endif
|
||||
101
libnetutil/DataLinkLayerElement.h
Executable file
101
libnetutil/DataLinkLayerElement.h
Executable file
@@ -0,0 +1,101 @@
|
||||
|
||||
/***************************************************************************
|
||||
* DataLinkLayerElement.h -- Class DataLinkLayerElement is a generic *
|
||||
* class that represents a data link layer protocol header (and maybe a *
|
||||
* footer) Classes like EthernetHeader inherit from it. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#ifndef DATALINKLAYERELEMENT_H
|
||||
#define DATALINKLAYERELEMENT_H 1
|
||||
|
||||
#include "PacketElement.h"
|
||||
|
||||
class DataLinkLayerElement : public PacketElement {
|
||||
};
|
||||
|
||||
#endif
|
||||
126
libnetutil/DestOptsHeader.cc
Normal file
126
libnetutil/DestOptsHeader.cc
Normal file
@@ -0,0 +1,126 @@
|
||||
|
||||
/***************************************************************************
|
||||
* DestOptsHeader.cc -- The DestOptsHeader Class represents an IPv6 *
|
||||
* Destination Options extension header. *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#include "DestOptsHeader.h"
|
||||
#include <assert.h>
|
||||
|
||||
/******************************************************************************/
|
||||
/* CONTRUCTORS, DESTRUCTORS AND INITIALIZATION METHODS */
|
||||
/******************************************************************************/
|
||||
DestOptsHeader::DestOptsHeader() {
|
||||
this->reset();
|
||||
} /* End of DestOptsHeader constructor */
|
||||
|
||||
|
||||
DestOptsHeader::~DestOptsHeader() {
|
||||
|
||||
} /* End of DestOptsHeader destructor */
|
||||
|
||||
|
||||
/** Prints the contents of the header and calls print() on the next protocol
|
||||
* header in the chain (if there is any).
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int DestOptsHeader::print(FILE *output, int detail) const {
|
||||
fprintf(output, "DestOpts[%d,%d]", this->h.nh, this->h.len);
|
||||
// TODO: @todo : Implement this
|
||||
if(this->next!=NULL){
|
||||
print_separator(output, detail);
|
||||
next->print(output, detail);
|
||||
}
|
||||
return OP_SUCCESS;
|
||||
} /* End of print() */
|
||||
|
||||
|
||||
/* Returns a protocol identifier. This is used by packet parsing funtions
|
||||
* that return linked lists of PacketElement objects, to determine the protocol
|
||||
* the object represents. */
|
||||
int DestOptsHeader::protocol_id() const {
|
||||
return HEADER_TYPE_IPv6_OPTS;
|
||||
} /* End of protocol_id() */
|
||||
117
libnetutil/DestOptsHeader.h
Normal file
117
libnetutil/DestOptsHeader.h
Normal file
@@ -0,0 +1,117 @@
|
||||
|
||||
/***************************************************************************
|
||||
* DestOptsHeader.h -- The DestOptsHeader Class represents an IPv6 *
|
||||
* Destination Options extension header. *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#ifndef __DESTOPTS_HEADER_H__
|
||||
#define __DESTOPTS_HEADER_H__ 1
|
||||
|
||||
#include "HopByHopHeader.h"
|
||||
|
||||
class DestOptsHeader : public HopByHopHeader {
|
||||
|
||||
private:
|
||||
/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Next Header | Hdr Ext Len | |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
|
||||
| |
|
||||
. .
|
||||
. Options .
|
||||
. .
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
// Implemented in HopByHopHeader.h
|
||||
public:
|
||||
DestOptsHeader();
|
||||
~DestOptsHeader();
|
||||
int print(FILE *output, int detail) const;
|
||||
int protocol_id() const;
|
||||
|
||||
}; /* End of class DestOptsHeader */
|
||||
|
||||
#endif
|
||||
250
libnetutil/EthernetHeader.cc
Executable file
250
libnetutil/EthernetHeader.cc
Executable file
@@ -0,0 +1,250 @@
|
||||
|
||||
/***************************************************************************
|
||||
* EthernetHeader.cc -- The EthernetHeader Class represents an Ethernet *
|
||||
* header and footer. It contains methods to set the different header *
|
||||
* fields. These methods tipically perform the necessary error checks and *
|
||||
* byte order conversions. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#include "EthernetHeader.h"
|
||||
|
||||
/******************************************************************************/
|
||||
/* CONTRUCTORS, DESTRUCTORS AND INITIALIZATION METHODS */
|
||||
/******************************************************************************/
|
||||
EthernetHeader::EthernetHeader(){
|
||||
this->reset();
|
||||
} /* End of EthernetHeader constructor */
|
||||
|
||||
|
||||
EthernetHeader::~EthernetHeader(){
|
||||
|
||||
} /* End of EthernetHeader destructor */
|
||||
|
||||
|
||||
/** Sets every attribute to its default value */
|
||||
void EthernetHeader::reset(){
|
||||
memset(&this->h, 0, sizeof(nping_eth_hdr_t));
|
||||
this->length=ETH_HEADER_LEN;
|
||||
} /* End of reset() */
|
||||
|
||||
|
||||
/** @warning This method is essential for the superclass getBinaryBuffer()
|
||||
* method to work. Do NOT change a thing unless you know what you're doing */
|
||||
u8 * EthernetHeader::getBufferPointer(){
|
||||
return (u8*)(&h);
|
||||
} /* End of getBufferPointer() */
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* PacketElement:: OVERWRITTEN METHODS */
|
||||
/******************************************************************************/
|
||||
|
||||
/** Stores supplied packet in the internal buffer so the information
|
||||
* can be accessed using the standard get & set methods.
|
||||
* @warning The EthernetHeader class is able to hold a maximum of 14 bytes.
|
||||
* If the supplied buffer is longer than that, only the first 14 bytes will be
|
||||
* stored in the internal buffer.
|
||||
* @warning Supplied len MUST be at least 14 bytes (Ethernet header length).
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error */
|
||||
int EthernetHeader::storeRecvData(const u8 *buf, size_t len){
|
||||
if(buf==NULL || len<ETH_HEADER_LEN){
|
||||
return OP_FAILURE;
|
||||
}else{
|
||||
this->reset(); /* Re-init the object, just in case the caller had used it already */
|
||||
this->length=ETH_HEADER_LEN;
|
||||
memcpy(&(this->h), buf, ETH_HEADER_LEN);
|
||||
}
|
||||
return OP_SUCCESS;
|
||||
} /* End of storeRecvData() */
|
||||
|
||||
|
||||
/* Returns a protocol identifier. This is used by packet parsing funtions
|
||||
* that return linked lists of PacketElement objects, to determine the protocol
|
||||
* the object represents. */
|
||||
int EthernetHeader::protocol_id() const {
|
||||
return HEADER_TYPE_ETHERNET;
|
||||
} /* End of protocol_id() */
|
||||
|
||||
|
||||
/** Determines if the data stored in the object after an storeRecvData() call
|
||||
* is valid and safe to use. This mainly checks the length of the data but may
|
||||
* also test the value of certain protocol fields to ensure their correctness.
|
||||
* @return the length, in bytes, of the header, if its found to be valid or
|
||||
* OP_FAILURE (-1) otherwise. */
|
||||
int EthernetHeader::validate(){
|
||||
if( this->length!=ETH_HEADER_LEN)
|
||||
return OP_FAILURE;
|
||||
else
|
||||
return ETH_HEADER_LEN;
|
||||
} /* End of validate() */
|
||||
|
||||
|
||||
/** Prints the contents of the header and calls print() on the next protocol
|
||||
* header in the chain (if there is any).
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int EthernetHeader::print(FILE *output, int detail) const {
|
||||
|
||||
fprintf(output, "Eth[");
|
||||
|
||||
for(int i=0; i<6; i++){
|
||||
fprintf(output, "%02x", this->h.eth_smac[i]);
|
||||
if(i<5)
|
||||
fprintf(output, ":");
|
||||
}
|
||||
|
||||
fprintf(output, " > ");
|
||||
|
||||
for(int i=0; i<6; i++){
|
||||
fprintf(output, "%02x", this->h.eth_dmac[i]);
|
||||
if(i<5)
|
||||
fprintf(output, ":");
|
||||
}
|
||||
|
||||
if(detail>=PRINT_DETAIL_MED)
|
||||
fprintf(output, " Type=%04x", this->getEtherType());
|
||||
|
||||
fprintf(output, "]");
|
||||
|
||||
if(this->next!=NULL){
|
||||
print_separator(output, detail);
|
||||
next->print(output, detail);
|
||||
}
|
||||
return OP_SUCCESS;
|
||||
} /* End of print() */
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* PROTOCOL-SPECIFIC METHODS */
|
||||
/******************************************************************************/
|
||||
|
||||
/** Sets Source MAC address
|
||||
* @warning Supplied buffer must contain at least 6 bytes */
|
||||
int EthernetHeader::setSrcMAC(const u8 *m){
|
||||
if(m==NULL)
|
||||
netutil_fatal("EthernetHeader::setSrcMAC(u8*): NULL value supplied ");
|
||||
memcpy(h.eth_smac, m, 6);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSrcMAC() */
|
||||
|
||||
|
||||
/** Returns source port in HOST byte order
|
||||
* @warning Returned pointer points directly to a Class internal buffer. If
|
||||
* contents are changed, the instance of the class will be affected. */
|
||||
const u8* EthernetHeader::getSrcMAC() const {
|
||||
return this->h.eth_smac;
|
||||
} /* End of getSrcMAC() */
|
||||
|
||||
|
||||
/** Sets Destination MAC address
|
||||
* @warning Supplied buffer must contain at least 6 bytes */
|
||||
int EthernetHeader::setDstMAC(u8 *m){
|
||||
if(m==NULL)
|
||||
netutil_fatal("EthernetHeader::setDstMAC(u8 *): NULL value supplied ");
|
||||
memcpy(h.eth_dmac, m, 6);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setDstMAC() */
|
||||
|
||||
|
||||
|
||||
/** Returns destination port in HOST byte order */
|
||||
const u8 *EthernetHeader::getDstMAC() const {
|
||||
return this->h.eth_dmac;
|
||||
} /* End of getDstMAC() */
|
||||
|
||||
|
||||
int EthernetHeader::setEtherType(u16 val){
|
||||
h.eth_type=htons(val);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setEtherType() */
|
||||
|
||||
|
||||
/** Returns destination port in HOST byte order */
|
||||
const u16 EthernetHeader::getEtherType() const {
|
||||
return ntohs(this->h.eth_type);
|
||||
} /* End of getEtherType() */
|
||||
|
||||
164
libnetutil/EthernetHeader.h
Executable file
164
libnetutil/EthernetHeader.h
Executable file
@@ -0,0 +1,164 @@
|
||||
|
||||
/***************************************************************************
|
||||
* EthernetHeader.h -- The EthernetHeader Class represents an Ethernet *
|
||||
* header and footer. It contains methods to set the different header *
|
||||
* fields. These methods tipically perform the necessary error checks and *
|
||||
* byte order conversions. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#ifndef ETHERNETHEADER_H
|
||||
#define ETHERNETHEADER_H 1
|
||||
|
||||
#include "DataLinkLayerElement.h"
|
||||
|
||||
/* Ether Types. (From RFC 5342 http://www.rfc-editor.org/rfc/rfc5342.txt) */
|
||||
#define ETHTYPE_IPV4 0x0800 /* Internet Protocol Version 4 */
|
||||
#define ETHTYPE_ARP 0x0806 /* Address Resolution Protocol */
|
||||
#define ETHTYPE_FRAMERELAY 0x0808 /* Frame Relay ARP */
|
||||
#define ETHTYPE_PPTP 0x880B /* Point-to-Point Tunneling Protocol */
|
||||
#define ETHTYPE_GSMP 0x880C /* General Switch Management Protocol */
|
||||
#define ETHTYPE_RARP 0x8035 /* Reverse Address Resolution Protocol */
|
||||
#define ETHTYPE_IPV6 0x86DD /* Internet Protocol Version 6 */
|
||||
#define ETHTYPE_MPLS 0x8847 /* MPLS */
|
||||
#define ETHTYPE_MPS_UAL 0x8848 /* MPLS with upstream-assigned label */
|
||||
#define ETHTYPE_MCAP 0x8861 /* Multicast Channel Allocation Protocol */
|
||||
#define ETHTYPE_PPPOE_D 0x8863 /* PPP over Ethernet Discovery Stage */
|
||||
#define ETHTYPE_PPOE_S 0x8864 /* PPP over Ethernet Session Stage */
|
||||
#define ETHTYPE_CTAG 0x8100 /* Customer VLAN Tag Type */
|
||||
#define ETHTYPE_EPON 0x8808 /* Ethernet Passive Optical Network */
|
||||
#define ETHTYPE_PBNAC 0x888E /* Port-based network access control */
|
||||
#define ETHTYPE_STAG 0x88A8 /* Service VLAN tag identifier */
|
||||
#define ETHTYPE_ETHEXP1 0x88B5 /* Local Experimental Ethertype */
|
||||
#define ETHTYPE_ETHEXP2 0x88B6 /* Local Experimental Ethertype */
|
||||
#define ETHTYPE_ETHOUI 0x88B7 /* OUI Extended Ethertype */
|
||||
#define ETHTYPE_PREAUTH 0x88C7 /* Pre-Authentication */
|
||||
#define ETHTYPE_LLDP 0x88CC /* Link Layer Discovery Protocol (LLDP) */
|
||||
#define ETHTYPE_MACSEC 0x88E5 /* Media Access Control Security */
|
||||
#define ETHTYPE_MVRP 0x88F5 /* Multiple VLAN Registration Protocol */
|
||||
#define ETHTYPE_MMRP 0x88F6 /* Multiple Multicast Registration Protocol */
|
||||
#define ETHTYPE_FRRR 0x890D /* Fast Roaming Remote Request */
|
||||
|
||||
#define ETH_HEADER_LEN 14
|
||||
|
||||
class EthernetHeader : public DataLinkLayerElement {
|
||||
|
||||
private:
|
||||
|
||||
struct nping_eth_hdr{
|
||||
u8 eth_dmac[6];
|
||||
u8 eth_smac[6];
|
||||
u16 eth_type;
|
||||
}__attribute__((__packed__));
|
||||
|
||||
typedef struct nping_eth_hdr nping_eth_hdr_t;
|
||||
|
||||
nping_eth_hdr_t h;
|
||||
|
||||
public:
|
||||
|
||||
EthernetHeader();
|
||||
~EthernetHeader();
|
||||
void reset();
|
||||
u8 *getBufferPointer();
|
||||
int storeRecvData(const u8 *buf, size_t len);
|
||||
int protocol_id() const;
|
||||
int validate();
|
||||
int print(FILE *output, int detail) const;
|
||||
|
||||
int setSrcMAC(const u8 *m);
|
||||
const u8 *getSrcMAC() const;
|
||||
|
||||
int setDstMAC(u8 *m);
|
||||
const u8 *getDstMAC() const;
|
||||
|
||||
int setEtherType(u16 val);
|
||||
const u16 getEtherType() const;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
243
libnetutil/FragmentHeader.cc
Normal file
243
libnetutil/FragmentHeader.cc
Normal file
@@ -0,0 +1,243 @@
|
||||
|
||||
/***************************************************************************
|
||||
* FragmentHeader.cc -- The FragmentHeader Class represents an IPv6 *
|
||||
* Hop-by-Hop extension header. *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#include "FragmentHeader.h"
|
||||
#include <assert.h>
|
||||
|
||||
/******************************************************************************/
|
||||
/* CONTRUCTORS, DESTRUCTORS AND INITIALIZATION METHODS */
|
||||
/******************************************************************************/
|
||||
FragmentHeader::FragmentHeader() {
|
||||
this->reset();
|
||||
} /* End of FragmentHeader constructor */
|
||||
|
||||
|
||||
FragmentHeader::~FragmentHeader() {
|
||||
|
||||
} /* End of FragmentHeader destructor */
|
||||
|
||||
|
||||
/** Sets every attribute to its default value */
|
||||
void FragmentHeader::reset(){
|
||||
memset(&this->h, 0, sizeof(nping_ipv6_ext_fragment_hdr_t));
|
||||
this->length=8;
|
||||
} /* End of reset() */
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* PacketElement:: OVERWRITTEN METHODS */
|
||||
/******************************************************************************/
|
||||
|
||||
/** @warning This method is essential for the superclass getBinaryBuffer()
|
||||
* method to work. Do NOT change a thing unless you know what you're doing */
|
||||
u8 *FragmentHeader::getBufferPointer(){
|
||||
return (u8*)(&this->h);
|
||||
} /* End of getBufferPointer() */
|
||||
|
||||
|
||||
/** Stores supplied packet in the internal buffer so the information
|
||||
* can be accessed using the standard get & set methods.
|
||||
* @warning The FragmentHeader class is able to hold a maximum of
|
||||
* sizeof(nping_icmpv6_hdr_t) bytes. If the supplied buffer is longer than
|
||||
* that, only the first 1508 bytes will be stored in the internal buffer.
|
||||
* @warning Supplied len MUST be at least 8 bytes (min ICMPv6 header length).
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error */
|
||||
int FragmentHeader::storeRecvData(const u8 *buf, size_t len){
|
||||
if(buf==NULL || len<FRAGMENT_HEADER_LEN){
|
||||
this->length=0;
|
||||
return OP_FAILURE;
|
||||
}else{
|
||||
int stored_len = MIN(FRAGMENT_HEADER_LEN, len);
|
||||
this->reset(); /* Re-init the object, just in case the caller had used it already */
|
||||
this->length=stored_len;
|
||||
memcpy(&(this->h), buf, stored_len);
|
||||
}
|
||||
return OP_SUCCESS;
|
||||
} /* End of storeRecvData() */
|
||||
|
||||
|
||||
/* Returns a protocol identifier. This is used by packet parsing funtions
|
||||
* that return linked lists of PacketElement objects, to determine the protocol
|
||||
* the object represents. */
|
||||
int FragmentHeader::protocol_id() const {
|
||||
return HEADER_TYPE_IPv6_FRAG;
|
||||
} /* End of protocol_id() */
|
||||
|
||||
|
||||
|
||||
/** Determines if the data stored in the object after an storeRecvData() call
|
||||
* is valid and safe to use. This mainly checks the length of the data but may
|
||||
* also test the value of certain protocol fields to ensure their correctness.
|
||||
* @return the length, in bytes, of the header, if its found to be valid or
|
||||
* OP_FAILURE (-1) otherwise. */
|
||||
int FragmentHeader::validate(){
|
||||
/* Check the object's length makes sense*/
|
||||
if(this->length != FRAGMENT_HEADER_LEN){
|
||||
return OP_FAILURE;
|
||||
}
|
||||
/* There is not much to check for here, since header fields may take any
|
||||
* value. We could certainly check the NextHeader value, but let's leave
|
||||
* that for the class user. */
|
||||
return this->length;
|
||||
} /* End of validate() */
|
||||
|
||||
|
||||
/** Prints the contents of the header and calls print() on the next protocol
|
||||
* header in the chain (if there is any).
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int FragmentHeader::print(FILE *output, int detail) const {
|
||||
fprintf(output, "Fragment[%d, %d]", this->h.nh, this->h.id);
|
||||
// TODO: @todo : Implement this
|
||||
if(this->next!=NULL){
|
||||
print_separator(output, detail);
|
||||
next->print(output, detail);
|
||||
}
|
||||
return OP_SUCCESS;
|
||||
} /* End of print() */
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* PROTOCOL-SPECIFIC METHODS */
|
||||
/******************************************************************************/
|
||||
|
||||
/** Set Next Header field */
|
||||
int FragmentHeader::setNextHeader(u8 val){
|
||||
this->h.nh = val;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setNextHeader() */
|
||||
|
||||
|
||||
/** Returns next header id */
|
||||
u8 FragmentHeader::getNextHeader(){
|
||||
return this->h.nh;
|
||||
} /* End of getNextHeader() */
|
||||
|
||||
|
||||
/** Set Offset field */
|
||||
int FragmentHeader::setOffset(u16 val){
|
||||
this->h.off_res_flag[0]=(u8)(val >> 8);
|
||||
this->h.off_res_flag[1]=(u8)((this->h.off_res_flag[1] & 0x7) | (val & ~0x7));
|
||||
return OP_SUCCESS;
|
||||
} /* End of setOffset() */
|
||||
|
||||
|
||||
/** Returns fragment offset */
|
||||
u16 FragmentHeader::getOffset(){
|
||||
return ((this->h.off_res_flag[0] << 8) + this->h.off_res_flag[1]) & 0xfff8;
|
||||
} /* End of getOffset() */
|
||||
|
||||
|
||||
/* Sets the "More Fragments" flag. */
|
||||
int FragmentHeader::setM(bool m_flag){
|
||||
if(m_flag)
|
||||
this->h.off_res_flag[1]= (u8)((this->h.off_res_flag[1] & ~0x01) | 0x01);
|
||||
else
|
||||
this->h.off_res_flag[1]= (u8)((this->h.off_res_flag[1] & ~0x1));
|
||||
return OP_SUCCESS;
|
||||
} /* End of setM() */
|
||||
|
||||
|
||||
/* Returns true if the "More Fragments" flag is set; false otherwise. */
|
||||
bool FragmentHeader::getM(){
|
||||
return (this->h.off_res_flag[1] & 0x01);
|
||||
} /* End of getM() */
|
||||
|
||||
|
||||
/** Set the fragment identifier */
|
||||
int FragmentHeader::setIdentification(u32 val){
|
||||
this->h.id=htonl(val);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setIdentification() */
|
||||
|
||||
|
||||
/** Returns the fragment identifier*/
|
||||
u32 FragmentHeader::getIdentification(){
|
||||
return ntohl(this->h.id);
|
||||
} /* End of getIdentification.() */
|
||||
144
libnetutil/FragmentHeader.h
Normal file
144
libnetutil/FragmentHeader.h
Normal file
@@ -0,0 +1,144 @@
|
||||
|
||||
/***************************************************************************
|
||||
* FragmentHeader.h -- The FragmentHeader Class represents an IPv6 *
|
||||
* Hop-by-Hop extension header. *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#ifndef __FRAGMENT_HEADER_H__
|
||||
#define __FRAGMENT_HEADER_H__ 1
|
||||
|
||||
#include "IPv6ExtensionHeader.h"
|
||||
|
||||
#define FRAGMENT_HEADER_LEN 8
|
||||
|
||||
|
||||
class FragmentHeader : public IPv6ExtensionHeader {
|
||||
|
||||
private:
|
||||
|
||||
/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Next Header | Reserved | Fragment Offset |Res|M|
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Identification |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
struct nping_ipv6_ext_fragment_hdr{
|
||||
u8 nh;
|
||||
u8 res1;
|
||||
u8 off_res_flag[2];
|
||||
u32 id;
|
||||
}__attribute__((__packed__));
|
||||
typedef struct nping_ipv6_ext_fragment_hdr nping_ipv6_ext_fragment_hdr_t;
|
||||
|
||||
nping_ipv6_ext_fragment_hdr_t h;
|
||||
|
||||
public:
|
||||
FragmentHeader();
|
||||
~FragmentHeader();
|
||||
void reset();
|
||||
u8 *getBufferPointer();
|
||||
int storeRecvData(const u8 *buf, size_t len);
|
||||
int protocol_id() const;
|
||||
int validate();
|
||||
int print(FILE *output, int detail) const;
|
||||
|
||||
/* Protocol specific methods */
|
||||
int setNextHeader(u8 val);
|
||||
u8 getNextHeader();
|
||||
|
||||
int setOffset(u16 val);
|
||||
u16 getOffset();
|
||||
|
||||
int setM(bool m_flag);
|
||||
bool getM();
|
||||
|
||||
int setIdentification(u32 val);
|
||||
u32 getIdentification();
|
||||
|
||||
|
||||
}; /* End of class FragmentHeader */
|
||||
|
||||
#endif
|
||||
418
libnetutil/HopByHopHeader.cc
Normal file
418
libnetutil/HopByHopHeader.cc
Normal file
@@ -0,0 +1,418 @@
|
||||
|
||||
/***************************************************************************
|
||||
* HopByHopHeader.cc -- The HopByHopHeader Class represents an IPv6 *
|
||||
* Hop-by-Hop extension header. *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#include "HopByHopHeader.h"
|
||||
#include <assert.h>
|
||||
|
||||
/******************************************************************************/
|
||||
/* CONTRUCTORS, DESTRUCTORS AND INITIALIZATION METHODS */
|
||||
/******************************************************************************/
|
||||
HopByHopHeader::HopByHopHeader() {
|
||||
this->reset();
|
||||
} /* End of HopByHopHeader constructor */
|
||||
|
||||
|
||||
HopByHopHeader::~HopByHopHeader() {
|
||||
|
||||
} /* End of HopByHopHeader destructor */
|
||||
|
||||
|
||||
/** Sets every attribute to its default value */
|
||||
void HopByHopHeader::reset(){
|
||||
memset(&this->h, 0, sizeof(nping_ipv6_ext_hopbyhop_hdr_t));
|
||||
curr_option=(u8*)this->h.options;
|
||||
this->length=2;
|
||||
this->addOption(EXTOPT_PADN, 4, (const u8*)"\x00\x00\x00\x00");
|
||||
} /* End of reset() */
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* PacketElement:: OVERWRITTEN METHODS */
|
||||
/******************************************************************************/
|
||||
|
||||
/** @warning This method is essential for the superclass getBinaryBuffer()
|
||||
* method to work. Do NOT change a thing unless you know what you're doing */
|
||||
u8 *HopByHopHeader::getBufferPointer(){
|
||||
return (u8*)(&this->h);
|
||||
} /* End of getBufferPointer() */
|
||||
|
||||
|
||||
/** Stores supplied packet in the internal buffer so the information
|
||||
* can be accessed using the standard get & set methods.
|
||||
* @warning The HopByHopHeader class is able to hold a maximum of
|
||||
* sizeof(nping_icmpv6_hdr_t) bytes. If the supplied buffer is longer than
|
||||
* that, only the first 1508 bytes will be stored in the internal buffer.
|
||||
* @warning Supplied len MUST be at least 8 bytes (min ICMPv6 header length).
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error */
|
||||
int HopByHopHeader::storeRecvData(const u8 *buf, size_t len){
|
||||
if(buf==NULL || len<HOPBYHOP_MIN_HEADER_LEN){
|
||||
this->length=0;
|
||||
return OP_FAILURE;
|
||||
}else{
|
||||
/* Store the first 4 bytes, so we can access the HdrExtLen field. */
|
||||
memcpy(&(this->h), buf, 4);
|
||||
|
||||
/* Check that the HdrExtLen field makes sense:
|
||||
* 1) Check that it carries as many octets as it claims
|
||||
* 2) Check that we don't exceed our internal storage space. */
|
||||
if( ((unsigned int)(this->h.len+1))*8 > len || (this->h.len+1)*8 > HOPBYHOP_MAX_HEADER_LEN){
|
||||
this->length=0;
|
||||
return OP_FAILURE;
|
||||
}else{
|
||||
int mylen=(this->h.len+1)*8;
|
||||
this->reset();
|
||||
this->length=mylen;
|
||||
memcpy(&(this->h), buf, this->length);
|
||||
return OP_SUCCESS;
|
||||
}
|
||||
}
|
||||
return OP_FAILURE;
|
||||
} /* End of storeRecvData() */
|
||||
|
||||
|
||||
/* Returns a protocol identifier. This is used by packet parsing funtions
|
||||
* that return linked lists of PacketElement objects, to determine the protocol
|
||||
* the object represents. */
|
||||
int HopByHopHeader::protocol_id() const {
|
||||
return HEADER_TYPE_IPv6_HOPOPT;
|
||||
} /* End of protocol_id() */
|
||||
|
||||
|
||||
/** Determines if the data stored in the object after an storeRecvData() call
|
||||
* is valid and safe to use. This mainly checks the length of the data but may
|
||||
* also test the value of certain protocol fields to ensure their correctness.
|
||||
* @return the length, in bytes, of the header, if its found to be valid or
|
||||
* OP_FAILURE (-1) otherwise. */
|
||||
int HopByHopHeader::validate(){
|
||||
nping_ipv6_ext_hopbyhop_opt_t *curr_opt=NULL;
|
||||
u8 *curr_pnt=(u8 *)this->h.options;
|
||||
int bytes_left=this->length-2;
|
||||
|
||||
/* Check the object's length makes sense*/
|
||||
if(this->length%8!=0 || this->length < HOPBYHOP_MIN_HEADER_LEN || this->length > HOPBYHOP_MAX_HEADER_LEN){
|
||||
return OP_FAILURE;
|
||||
}
|
||||
/* Check the header's length field. It should match the object's length */
|
||||
if( (this->h.len+1)*8 != this->length){
|
||||
return OP_FAILURE;
|
||||
}
|
||||
|
||||
/* Now validate the TLV-encoded options. */
|
||||
while(bytes_left>0){
|
||||
/* Use the opts structure as a template to access current option */
|
||||
curr_opt=(nping_ipv6_ext_hopbyhop_opt_t *)curr_pnt;
|
||||
|
||||
/* Let's see what we have. */
|
||||
switch(curr_opt->type){
|
||||
|
||||
/* Pad1
|
||||
+-+-+-+-+-+-+-+-+
|
||||
| 0 |
|
||||
+-+-+-+-+-+-+-+-+ */
|
||||
case EXTOPT_PAD1:
|
||||
curr_pnt++; /* Skip one octet */
|
||||
bytes_left++;
|
||||
break;
|
||||
|
||||
/* PadN
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - -
|
||||
| 1 | Padding Len | Padding
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - - */
|
||||
case EXTOPT_PADN:
|
||||
/* Check we have as many octets as the option advertises */
|
||||
if(bytes_left<2+curr_opt->len)
|
||||
return OP_FAILURE;
|
||||
curr_pnt+=2+curr_opt->len;
|
||||
bytes_left-=2+curr_opt->len;
|
||||
break;
|
||||
|
||||
/* Jumbo Payload Option (RFC 2675).
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Option Type | Opt Data Len |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Jumbo Payload Length |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
case EXTOPT_JUMBO:
|
||||
/* Jumbo has a fixed length of 4 octets (plus 2). */
|
||||
if(curr_opt->len!=4)
|
||||
return OP_FAILURE;
|
||||
/* Check if we actually have all the octets */
|
||||
if(bytes_left<2+4)
|
||||
return OP_FAILURE;
|
||||
curr_pnt+=6;
|
||||
bytes_left-=6;
|
||||
break;
|
||||
|
||||
/* Tunnel Encapsulation limit (RFC 2473).
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Option Type | 1 | Tun Encap Lim |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
case EXTOPT_TUNENCAPLIM:
|
||||
/* This one also has a fixed length. */
|
||||
if(curr_opt->len!=1)
|
||||
return OP_FAILURE;
|
||||
/* Check if we actually have all the octets */
|
||||
if(bytes_left<2+1)
|
||||
return OP_FAILURE;
|
||||
curr_pnt+=3;
|
||||
bytes_left-=3;
|
||||
break;
|
||||
|
||||
/* Router Alert (RFC 2711).
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Option Type | 2 | Value (2 octets) |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
case EXTOPT_ROUTERALERT:
|
||||
/* Fixed length (two octets)*/
|
||||
if(curr_opt->len!=2)
|
||||
return OP_FAILURE;
|
||||
/* Check that we actually have all the octets */
|
||||
if(bytes_left<2+2)
|
||||
return OP_FAILURE;
|
||||
curr_pnt+=4;
|
||||
bytes_left-=4;
|
||||
break;
|
||||
|
||||
/* Quick-Start (RFC 4782).
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Option | Length=6 | Func. | Rate | Not Used |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| QS Nonce | R |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
case EXTOPT_QUICKSTART:
|
||||
/* Fixed length (two octets)*/
|
||||
if(curr_opt->len!=6)
|
||||
return OP_FAILURE;
|
||||
/* Check that we actually have all the octets */
|
||||
if(bytes_left<2+6)
|
||||
return OP_FAILURE;
|
||||
curr_pnt+=8;
|
||||
bytes_left-=8;
|
||||
break;
|
||||
|
||||
/* CALIPSO (RFC 5570).
|
||||
+----------------------------+
|
||||
| Option Type | Option Length|
|
||||
+-------------+---------------+-------------+--------------+
|
||||
| CALIPSO Domain of Interpretation |
|
||||
+-------------+---------------+-------------+--------------+
|
||||
| Cmpt Length | Sens Level | Checksum (CRC-16) |
|
||||
+-------------+---------------+-------------+--------------+
|
||||
| Compartment Bitmap (Optional; variable length) |
|
||||
+-------------+---------------+-------------+--------------+ */
|
||||
case EXTOPT_CALIPSO:
|
||||
/* The length of the CALIPSO option is variable because the
|
||||
* Compartment Bitmap is not mandatory. However, the length
|
||||
* must be at least 8. */
|
||||
if(curr_opt->len<8)
|
||||
return OP_FAILURE;
|
||||
/* Check that we actually have all the octets */
|
||||
if(bytes_left<2+curr_opt->len)
|
||||
return OP_FAILURE;
|
||||
curr_pnt+=2+curr_opt->len;
|
||||
bytes_left-=2+curr_opt->len;
|
||||
break;
|
||||
|
||||
|
||||
/* Home Address (RFC 6275).
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Option Type | Option Length |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+ Home Address +
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
|
||||
case EXTOPT_HOMEADDR:
|
||||
/* Fixed length of 16 */
|
||||
if(curr_opt->len!=16)
|
||||
return OP_FAILURE;
|
||||
/* Check if we actually have all the octets */
|
||||
if(bytes_left<2+16)
|
||||
return OP_FAILURE;
|
||||
curr_pnt+=18;
|
||||
bytes_left-=18;
|
||||
break;
|
||||
|
||||
/* Option Type Unknown */
|
||||
default:
|
||||
/* If we don't know the option, we can still try to validate it,
|
||||
* checking if the OptionLength contains something reasonable. */
|
||||
/* Fixed length of 16 */
|
||||
if(bytes_left<2+curr_opt->len)
|
||||
return OP_FAILURE;
|
||||
curr_pnt+=2+curr_opt->len;
|
||||
bytes_left-=2+curr_opt->len;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return this->length;
|
||||
} /* End of validate() */
|
||||
|
||||
|
||||
/** Prints the contents of the header and calls print() on the next protocol
|
||||
* header in the chain (if there is any).
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int HopByHopHeader::print(FILE *output, int detail) const {
|
||||
fprintf(output, "HopByHop[%d,%d]", this->h.nh, this->h.len);
|
||||
// TODO: @todo : Implement this
|
||||
if(this->next!=NULL){
|
||||
print_separator(output, detail);
|
||||
next->print(output, detail);
|
||||
}
|
||||
return OP_SUCCESS;
|
||||
} /* End of print() */
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* PROTOCOL-SPECIFIC METHODS */
|
||||
/******************************************************************************/
|
||||
|
||||
/** Set Next Header field */
|
||||
int HopByHopHeader::setNextHeader(u8 val){
|
||||
this->h.nh = val;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setNextHeader() */
|
||||
|
||||
|
||||
/** Returns next header id */
|
||||
u8 HopByHopHeader::getNextHeader(){
|
||||
return this->h.nh;
|
||||
} /* End of getNextHeader() */
|
||||
|
||||
|
||||
/* Add TLV encoded option */
|
||||
int HopByHopHeader::addOption(u8 type, u8 len, const u8 *data){
|
||||
/* Make sure we don't screw up due to buffer length issues */
|
||||
if(data==NULL)
|
||||
return OP_FAILURE;
|
||||
if ( (this->length+len+2) > HOPBYHOP_MAX_HEADER_LEN ) /* No space for more */
|
||||
return OP_FAILURE;
|
||||
|
||||
/* Store the option */
|
||||
curr_option[0]=type;
|
||||
curr_option[1]=len;
|
||||
memcpy(curr_option+2, data, len);
|
||||
/* Update internal option offset and object's length */
|
||||
curr_option+=(len+2);
|
||||
this->length+=(len+2);
|
||||
this->addPadding();
|
||||
return OP_SUCCESS;
|
||||
|
||||
} /* End of addOption() */
|
||||
|
||||
|
||||
/* If the current length of the extension header is not a multiple of 8 octets,
|
||||
* this method adds the neccessary padding (either PadN or Pad1 options)*/
|
||||
int HopByHopHeader::addPadding(){
|
||||
u8 zeroes[8]={0,0,0,0,0,0,0,0};
|
||||
int required_octets=8-(this->length%8);
|
||||
|
||||
/* Make sure we have enough space for the padding. */
|
||||
if ( (this->length+required_octets) > HOPBYHOP_MAX_HEADER_LEN )
|
||||
return OP_FAILURE;
|
||||
|
||||
/* Insert Pad1 or PadN to fill the necessary octets */
|
||||
if(required_octets>0 && required_octets<8){
|
||||
if(required_octets==1){
|
||||
curr_option[0]=EXTOPT_PAD1;
|
||||
curr_option++;
|
||||
this->length++;
|
||||
}else{
|
||||
this->addOption(EXTOPT_PADN, required_octets-2, zeroes );
|
||||
}
|
||||
}
|
||||
assert(this->length%8==0);
|
||||
this->h.len=(this->length/8)-1;
|
||||
return OP_SUCCESS;
|
||||
} /* End of addPadding() */
|
||||
153
libnetutil/HopByHopHeader.h
Normal file
153
libnetutil/HopByHopHeader.h
Normal file
@@ -0,0 +1,153 @@
|
||||
|
||||
/***************************************************************************
|
||||
* HopByHopHeader.h -- The HopByHopHeader Class represents an IPv6 *
|
||||
* Hop-by-Hop extension header. *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#ifndef __HOP_BY_HOP_HEADER_H__
|
||||
#define __HOP_BY_HOP_HEADER_H__ 1
|
||||
|
||||
#include "IPv6ExtensionHeader.h"
|
||||
|
||||
#define HOP_BY_HOP_MAX_OPTIONS_LEN 256*8
|
||||
#define HOPBYHOP_MIN_HEADER_LEN 8
|
||||
#define HOPBYHOP_MAX_HEADER_LEN (HOPBYHOP_MIN_HEADER_LEN + HOP_BY_HOP_MAX_OPTIONS_LEN)
|
||||
#define HOPBYHOP_MAX_OPTION_LEN 256
|
||||
|
||||
class HopByHopHeader : public IPv6ExtensionHeader {
|
||||
|
||||
protected:
|
||||
/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Next Header | Hdr Ext Len | |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
|
||||
| |
|
||||
. .
|
||||
. Options .
|
||||
. .
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
struct nping_ipv6_ext_hopbyhop_hdr{
|
||||
u8 nh;
|
||||
u8 len;
|
||||
u8 options[HOP_BY_HOP_MAX_OPTIONS_LEN];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct nping_ipv6_ext_hopbyhop_hdr nping_ipv6_ext_hopbyhop_hdr_t;
|
||||
|
||||
|
||||
/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - -
|
||||
| Option Type | Opt Data Len | Option Data
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - - */
|
||||
struct nping_ipv6_ext_hopbyhop_opt{
|
||||
u8 type;
|
||||
u8 len;
|
||||
u8 data[HOPBYHOP_MAX_OPTION_LEN];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct nping_ipv6_ext_hopbyhop_opt nping_ipv6_ext_hopbyhop_opt_t;
|
||||
|
||||
nping_ipv6_ext_hopbyhop_hdr_t h;
|
||||
u8 *curr_option;
|
||||
|
||||
public:
|
||||
HopByHopHeader();
|
||||
~HopByHopHeader();
|
||||
void reset();
|
||||
u8 *getBufferPointer();
|
||||
int storeRecvData(const u8 *buf, size_t len);
|
||||
int protocol_id() const;
|
||||
int validate();
|
||||
int print(FILE *output, int detail) const;
|
||||
|
||||
/* Protocol specific methods */
|
||||
int setNextHeader(u8 val);
|
||||
u8 getNextHeader();
|
||||
|
||||
int addOption(u8 type, u8 len, const u8 *data);
|
||||
int addPadding();
|
||||
|
||||
}; /* End of class HopByHopHeader */
|
||||
|
||||
#endif
|
||||
114
libnetutil/ICMPHeader.h
Normal file
114
libnetutil/ICMPHeader.h
Normal file
@@ -0,0 +1,114 @@
|
||||
|
||||
/***************************************************************************
|
||||
* ICMPHeader.h -- Class ICMPHeader is a generic class for the ICMP *
|
||||
* protocol. Its aim is to provide a little bit of abstraction from the *
|
||||
* underlying ICMP version. Classes like ICMPv4Header or ICMPv6Header *
|
||||
* inherit from it. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2010 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#ifndef __ICMPHEADER_H__
|
||||
#define __ICMPHEADER_H__ 1
|
||||
|
||||
#include "PacketElement.h"
|
||||
|
||||
class ICMPHeader : public PacketElement {
|
||||
|
||||
public:
|
||||
|
||||
virtual u8 getType() const = 0;
|
||||
|
||||
virtual int setType(u8 val) = 0;
|
||||
|
||||
virtual u8 getCode() const = 0;
|
||||
|
||||
virtual int setCode(u8 val) = 0;
|
||||
|
||||
virtual bool isError() const = 0;
|
||||
};
|
||||
|
||||
#endif /* __ICMPHEADER_H__ */
|
||||
1209
libnetutil/ICMPv4Header.cc
Executable file
1209
libnetutil/ICMPv4Header.cc
Executable file
File diff suppressed because it is too large
Load Diff
561
libnetutil/ICMPv4Header.h
Executable file
561
libnetutil/ICMPv4Header.h
Executable file
@@ -0,0 +1,561 @@
|
||||
|
||||
/***************************************************************************
|
||||
* ICMPv4Header.h -- The ICMPv4Header Class represents an ICMP version 4 *
|
||||
* packet. It contains methods to set any header field. In general, these *
|
||||
* methods do error checkings and byte order conversion. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#ifndef ICMPv4HEADER_H
|
||||
#define ICMPv4HEADER_H 1
|
||||
|
||||
#include "ICMPHeader.h"
|
||||
|
||||
/* ICMP types and codes. These defines were originally taken from Slirp 1.0
|
||||
* source file ip_icmp.h http://slirp.sourceforge.net/ (BSD licensed) and
|
||||
* then, partially modified for Nping */
|
||||
#define ICMP_ECHOREPLY 0 /* Echo reply */
|
||||
#define ICMP_UNREACH 3 /* Destination unreachable: */
|
||||
#define ICMP_UNREACH_NET 0 /* --> Bad network */
|
||||
#define ICMP_UNREACH_HOST 1 /* --> Bad host */
|
||||
#define ICMP_UNREACH_PROTOCOL 2 /* --> Bad protocol */
|
||||
#define ICMP_UNREACH_PORT 3 /* --> Bad port */
|
||||
#define ICMP_UNREACH_NEEDFRAG 4 /* --> DF flag caused pkt drop */
|
||||
#define ICMP_UNREACH_SRCFAIL 5 /* --> Source route failed */
|
||||
#define ICMP_UNREACH_NET_UNKNOWN 6 /* --> Unknown network */
|
||||
#define ICMP_UNREACH_HOST_UNKNOWN 7 /* --> Unknown host */
|
||||
#define ICMP_UNREACH_ISOLATED 8 /* --> Source host isolated */
|
||||
#define ICMP_UNREACH_NET_PROHIB 9 /* --> Prohibited access */
|
||||
#define ICMP_UNREACH_HOST_PROHIB 10 /* --> Prohibited access */
|
||||
#define ICMP_UNREACH_TOSNET 11 /* --> Bad TOS for network */
|
||||
#define ICMP_UNREACH_TOSHOST 12 /* --> Bad TOS for host */
|
||||
#define ICMP_UNREACH_COMM_PROHIB 13 /* --> Prohibited communication */
|
||||
#define ICMP_UNREACH_HOSTPRECEDENCE 14 /* --> Host precedence violation */
|
||||
#define ICMP_UNREACH_PRECCUTOFF 15 /* --> Precedence cutoff */
|
||||
#define ICMP_SOURCEQUENCH 4 /* Source Quench. */
|
||||
#define ICMP_REDIRECT 5 /* Redirect: */
|
||||
#define ICMP_REDIRECT_NET 0 /* --> For the network */
|
||||
#define ICMP_REDIRECT_HOST 1 /* --> For the host */
|
||||
#define ICMP_REDIRECT_TOSNET 2 /* --> For the TOS and network */
|
||||
#define ICMP_REDIRECT_TOSHOST 3 /* --> For the TOS and host */
|
||||
#define ICMP_ECHO 8 /* Echo request */
|
||||
#define ICMP_ROUTERADVERT 9 /* Router advertisement */
|
||||
#define ICMP_ROUTERADVERT_MOBILE 16 /* Used by mobile IP agents */
|
||||
#define ICMP_ROUTERSOLICIT 10 /* Router solicitation */
|
||||
#define ICMP_TIMXCEED 11 /* Time exceeded: */
|
||||
#define ICMP_TIMXCEED_INTRANS 0 /* --> TTL==0 in transit */
|
||||
#define ICMP_TIMXCEED_REASS 1 /* --> TTL==0 in reassembly */
|
||||
#define ICMP_PARAMPROB 12 /* Parameter problem */
|
||||
#define ICMM_PARAMPROB_POINTER 0 /* --> Pointer shows the problem */
|
||||
#define ICMP_PARAMPROB_OPTABSENT 1 /* --> Option missing */
|
||||
#define ICMP_PARAMPROB_BADLEN 2 /* --> Bad datagram length */
|
||||
#define ICMP_TSTAMP 13 /* Timestamp request */
|
||||
#define ICMP_TSTAMPREPLY 14 /* Timestamp reply */
|
||||
#define ICMP_INFO 15 /* Information request */
|
||||
#define ICMP_INFOREPLY 16 /* Information reply */
|
||||
#define ICMP_MASK 17 /* Address mask request */
|
||||
#define ICMP_MASKREPLY 18 /* Address mask reply */
|
||||
#define ICMP_TRACEROUTE 30 /* Traceroute */
|
||||
#define ICMP_TRACEROUTE_SUCCESS 0 /* --> Dgram sent to next router */
|
||||
#define ICMP_TRACEROUTE_DROPPED 1 /* --> Dgram was dropped */
|
||||
#define ICMP_DOMAINNAME 37 /* Domain name request */
|
||||
#define ICMP_DOMAINNAMEREPLY 38 /* Domain name reply */
|
||||
#define ICMP_SECURITYFAILURES 40 /* Security failures */
|
||||
|
||||
|
||||
#define ICMP_STD_HEADER_LEN 8
|
||||
#define ICMP_MAX_PAYLOAD_LEN 1500
|
||||
#define MAX_ROUTER_ADVERT_ENTRIES (((ICMP_MAX_PAYLOAD_LEN-4)/8)-1)
|
||||
|
||||
|
||||
class ICMPv4Header : public ICMPHeader {
|
||||
|
||||
private:
|
||||
|
||||
/**********************************************************************/
|
||||
/* COMMON ICMPv4 packet HEADER */
|
||||
/**********************************************************************/
|
||||
/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
+ Message Body +
|
||||
| | */
|
||||
struct nping_icmpv4_hdr {
|
||||
u8 type; /* ICMP Message Type */
|
||||
u8 code; /* ICMP Message Code */
|
||||
u16 checksum; /* Checksum */
|
||||
u8 data[ICMP_MAX_PAYLOAD_LEN];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct nping_icmpv4_hdr nping_icmpv4_hdr_t;
|
||||
|
||||
|
||||
/**********************************************************************/
|
||||
/* ICMPv4 MESSAGE SPECIFIC HEADERS */
|
||||
/**********************************************************************/
|
||||
|
||||
/* Destination Unreachable Message
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| unused |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Internet Header + 64 bits of Original Data Datagram |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
struct icmp4_dest_unreach_msg{
|
||||
u32 unused;
|
||||
//u8 original_dgram[?];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct icmp4_dest_unreach_msg icmp4_dest_unreach_msg_t;
|
||||
|
||||
|
||||
/* Time Exceeded Message
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| unused |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Internet Header + 64 bits of Original Data Datagram |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
struct icmp4_time_exceeded_msg{
|
||||
u32 unused;
|
||||
//u8 original_dgram[?];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct icmp4_time_exceeded_msg icmp4_time_exceeded_msg_t;
|
||||
|
||||
|
||||
/* Parameter Problem Message
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Pointer | unused |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Internet Header + 64 bits of Original Data Datagram |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
|
||||
struct icmp4_parameter_problem_msg{
|
||||
u8 pointer;
|
||||
u8 unused[3];
|
||||
//u8 original_dgram[?];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct icmp4_parameter_problem_msg icmp4_parameter_problem_msg_t;
|
||||
|
||||
|
||||
/* Source Quench Message
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| unused |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Internet Header + 64 bits of Original Data Datagram |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
struct icmp4_source_quench_msg{
|
||||
u32 unused;
|
||||
//u8 original_dgram[?];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct icmp4_source_quench_msg icmp4_source_quench_msg_t;
|
||||
|
||||
|
||||
/* Redirect Message
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Gateway Internet Address |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Internet Header + 64 bits of Original Data Datagram |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
struct icmp4_redirect_msg{
|
||||
struct in_addr gateway_address;
|
||||
//u8 original_dgram[?];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct icmp4_redirect_msg icmp4_redirect_msg_t;
|
||||
|
||||
|
||||
/* Echo Request/Reply Message
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Identifier | Sequence Number |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Data ...
|
||||
+-+-+-+-+- */
|
||||
struct icmp4_echo_msg{
|
||||
u16 identifier;
|
||||
u16 sequence;
|
||||
//u8 data[?];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct icmp4_echo_msg icmp4_echo_msg_t;
|
||||
|
||||
|
||||
/* Timestamp Request/Reply Message
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Identifier | Sequence Number |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Originate Timestamp |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Receive Timestamp |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Transmit Timestamp |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
struct icmp4_timestamp_msg{
|
||||
u16 identifier;
|
||||
u16 sequence;
|
||||
u32 originate_ts;
|
||||
u32 receive_ts;
|
||||
u32 transmit_ts;
|
||||
}__attribute__((__packed__));
|
||||
typedef struct icmp4_timestamp_msg icmp4_timestamp_msg_t;
|
||||
|
||||
|
||||
/* Information Request/Reply Message
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Identifier | Sequence Number |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
struct icmp4_information_msg{
|
||||
u16 identifier;
|
||||
u16 sequence;
|
||||
}__attribute__((__packed__));
|
||||
typedef struct icmp4_information_msg icmp4_information_msg_t;
|
||||
|
||||
|
||||
/* ICMP Router Advertisement Message
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Num Addrs |Addr Entry Size| Lifetime |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Router Address[1] |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Preference Level[1] |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Router Address[2] |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Preference Level[2] |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| . |
|
||||
| . |
|
||||
| . | */
|
||||
struct icmp4_router_advert_entry{
|
||||
struct in_addr router_addr;
|
||||
u32 preference_level;
|
||||
}__attribute__((__packed__));
|
||||
typedef struct icmp4_router_advert_entry icmp4_router_advert_entry_t;
|
||||
|
||||
struct icmp4_router_advert_msg{
|
||||
u8 num_addrs;
|
||||
u8 addr_entry_size;
|
||||
u16 lifetime;
|
||||
icmp4_router_advert_entry_t adverts[MAX_ROUTER_ADVERT_ENTRIES];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct icmp4_router_advert_msg icmp4_router_advert_msg_t;
|
||||
|
||||
|
||||
/* ICMP Router Solicitation Message
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Reserved |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
struct icmp4_router_solicit_msg{
|
||||
u32 reserved;
|
||||
}__attribute__((__packed__));
|
||||
typedef struct icmp4_router_solicit_msg icmp4_router_solicit_msg_t;
|
||||
|
||||
|
||||
/* ICMP Security Failures Message
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Reserved | Pointer |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
~ Original Internet Headers + 64 bits of Payload ~
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
struct icmp4_security_failures_msg{
|
||||
u16 reserved;
|
||||
u16 pointer;
|
||||
//u8 original_headers[?];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct icmp4_security_failures_msg icmp4_security_failures_msg_t;
|
||||
|
||||
|
||||
/* ICMP Address Mask Request/Reply Message
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Identifier | Sequence Number |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Address Mask |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
struct icmp4_address_mask_msg{
|
||||
u16 identifier;
|
||||
u16 sequence;
|
||||
struct in_addr address_mask;
|
||||
}__attribute__((__packed__));
|
||||
typedef struct icmp4_address_mask_msg icmp4_address_mask_msg_t;
|
||||
|
||||
|
||||
/* ICMP Traceroute Message
|
||||
+---------------+---------------+---------------+---------------+
|
||||
| Type | Code | Checksum |
|
||||
+---------------+---------------+---------------+---------------+
|
||||
| ID Number | unused |
|
||||
+---------------+---------------+---------------+---------------+
|
||||
| Outbound Hop Count | Return Hop Count |
|
||||
+---------------+---------------+---------------+---------------+
|
||||
| Output Link Speed |
|
||||
+---------------+---------------+---------------+---------------+
|
||||
| Output Link MTU |
|
||||
+---------------+---------------+---------------+---------------+ */
|
||||
struct icmp4_traceroute_msg{
|
||||
u16 id_number;
|
||||
u16 unused;
|
||||
u16 outbound_hop_count;
|
||||
u16 return_hop_count;
|
||||
u32 output_link_speed;
|
||||
u32 output_link_mtu;
|
||||
}__attribute__((__packed__));
|
||||
typedef struct icmp4_traceroute_msg icmp4_traceroute_msg_t;
|
||||
|
||||
|
||||
/* ICMP Domain Name Request Message
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Identifier | Sequence Number |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
struct icmp4_domain_name_request_msg{
|
||||
u16 identifier;
|
||||
u16 sequence;
|
||||
}__attribute__((__packed__));
|
||||
typedef struct icmp4_domain_name_request_msg icmp4_domain_name_request_msg_t;
|
||||
|
||||
|
||||
/* ICMP Domain Name Reply Message
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Identifier | Sequence Number |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Time-To-Live |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Names ...
|
||||
+-+-+-+-+-+-+-+- */
|
||||
struct icmp4_domain_name_reply_msg{
|
||||
u16 identifier;
|
||||
u16 sequence;
|
||||
s16 ttl; /* Signed! */
|
||||
u8 names[ICMP_MAX_PAYLOAD_LEN-8];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct icmp4_domain_name_reply_msg icmp4_domain_name_reply_msg_t;
|
||||
|
||||
|
||||
/* Main data structure */
|
||||
nping_icmpv4_hdr_t h;
|
||||
|
||||
/* Helper pointers */
|
||||
icmp4_dest_unreach_msg_t *h_du;
|
||||
icmp4_time_exceeded_msg_t *h_te;
|
||||
icmp4_parameter_problem_msg_t *h_pp;
|
||||
icmp4_source_quench_msg_t *h_sq;
|
||||
icmp4_redirect_msg_t *h_r;
|
||||
icmp4_echo_msg_t *h_e;
|
||||
icmp4_timestamp_msg_t *h_t;
|
||||
icmp4_information_msg_t *h_i;
|
||||
icmp4_router_advert_msg_t *h_ra;
|
||||
icmp4_router_solicit_msg_t *h_rs;
|
||||
icmp4_security_failures_msg_t *h_sf;
|
||||
icmp4_address_mask_msg_t *h_am;
|
||||
icmp4_traceroute_msg_t *h_trc;
|
||||
icmp4_domain_name_request_msg_t *h_dn;
|
||||
icmp4_domain_name_reply_msg_t *h_dnr;
|
||||
|
||||
/* Internal counts */
|
||||
int routeradventries;
|
||||
int domainnameentries;
|
||||
|
||||
public:
|
||||
/* PacketElement:: Mandatory methods */
|
||||
ICMPv4Header();
|
||||
~ICMPv4Header();
|
||||
void reset();
|
||||
u8 *getBufferPointer();
|
||||
int storeRecvData(const u8 *buf, size_t len);
|
||||
int protocol_id() const;
|
||||
int validate();
|
||||
int print(FILE *output, int detail) const;
|
||||
|
||||
/* ICMP Type */
|
||||
int setType(u8 val);
|
||||
u8 getType() const;
|
||||
bool validateType();
|
||||
bool validateType(u8 val);
|
||||
|
||||
/* ICMP Code */
|
||||
int setCode(u8 c);
|
||||
u8 getCode() const;
|
||||
bool validateCode();
|
||||
bool validateCode(u8 type, u8 code);
|
||||
|
||||
/* Checksum */
|
||||
int setSum();
|
||||
int setSum(u16 s);
|
||||
u16 getSum() const;
|
||||
|
||||
/* Unused and reserved fields */
|
||||
int setUnused(u32 val);
|
||||
u32 getUnused() const;
|
||||
int setReserved( u32 val );
|
||||
u32 getReserved() const;
|
||||
|
||||
/* Redirect */
|
||||
int setGatewayAddress(struct in_addr ipaddr);
|
||||
struct in_addr getGatewayAddress() const;
|
||||
|
||||
/* Parameter problem */
|
||||
int setParameterPointer(u8 val);
|
||||
u8 getParameterPointer() const;
|
||||
|
||||
/* Router advertisement */
|
||||
int setNumAddresses(u8 val);
|
||||
u8 getNumAddresses() const;
|
||||
int setAddrEntrySize(u8 val);
|
||||
u8 getAddrEntrySize() const;
|
||||
int setLifetime(u16 val);
|
||||
u16 getLifetime() const;
|
||||
int addRouterAdvEntry(struct in_addr raddr, u32 pref);
|
||||
u8 *getRouterAdvEntries(int *num) const;
|
||||
int clearRouterAdvEntries();
|
||||
|
||||
/* Echo/Timestamp/Mask */
|
||||
int setIdentifier(u16 val);
|
||||
u16 getIdentifier() const;
|
||||
int setSequence(u16 val);
|
||||
u16 getSequence() const;
|
||||
|
||||
/* Timestamp only */
|
||||
int setOriginateTimestamp(u32 t);
|
||||
u32 getOriginateTimestamp() const;
|
||||
int setReceiveTimestamp(u32 t);
|
||||
u32 getReceiveTimestamp() const;
|
||||
int setTransmitTimestamp(u32 t);
|
||||
u32 getTransmitTimestamp() const;
|
||||
|
||||
/* Mask only */
|
||||
int setAddressMask(struct in_addr mask);
|
||||
struct in_addr getAddressMask() const;
|
||||
|
||||
/* Security Failures */
|
||||
int setSecurityPointer(u16 val);
|
||||
u16 getSecurityPointer() const;
|
||||
|
||||
/* Traceroute */
|
||||
int setIDNumber(u16 val);
|
||||
u16 getIDNumber() const;
|
||||
int setOutboundHopCount(u16 val);
|
||||
u16 getOutboundHopCount() const;
|
||||
int setReturnHopCount(u16 val);
|
||||
u16 getReturnHopCount() const;
|
||||
int setOutputLinkSpeed(u32 val);
|
||||
u32 getOutputLinkSpeed() const;
|
||||
int setOutputLinkMTU(u32 val);
|
||||
u32 getOutputLinkMTU() const;
|
||||
|
||||
/* Misc */
|
||||
int getICMPHeaderLengthFromType( u8 type ) const;
|
||||
const char *type2string(int type, int code) const;
|
||||
bool isError() const;
|
||||
|
||||
|
||||
}; /* End of class ICMPv4Header */
|
||||
|
||||
#endif
|
||||
1158
libnetutil/ICMPv6Header.cc
Executable file
1158
libnetutil/ICMPv6Header.cc
Executable file
File diff suppressed because it is too large
Load Diff
690
libnetutil/ICMPv6Header.h
Executable file
690
libnetutil/ICMPv6Header.h
Executable file
@@ -0,0 +1,690 @@
|
||||
|
||||
/***************************************************************************
|
||||
* ICMPv6Header.h -- The ICMPv6Header Class represents an ICMP version 6 *
|
||||
* packet. It contains methods to set any header field. In general, these *
|
||||
* methods do error checkings and byte order conversion. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#ifndef ICMPv6HEADER_H
|
||||
#define ICMPv6HEADER_H 1
|
||||
|
||||
#include "ICMPHeader.h"
|
||||
|
||||
/******************************************************************************/
|
||||
/* IMPORTANT INFORMATION ON HOW TO USE THIS CLASS. */
|
||||
/******************************************************************************/
|
||||
/* This class represents an ICMPv6 messages. ICMPv6 messages may be of
|
||||
* different types. Each type has its own header and possibly a variable
|
||||
* length data field. Information messages have an "invoking packet" field
|
||||
* which is the IP packet that triggered the emission of the ICMPv6 message.
|
||||
* Other messages may contain a "data" field, like echo requests an replies.
|
||||
* Some others may contain ICMPv6 Options.
|
||||
*
|
||||
* So the thing is, that this class only represents fixed-length ICMPv6
|
||||
* headers and does NOT offer storage for ANY variable-length field. This
|
||||
* fields may be added to the ICMPv6 header using instances of the RawData
|
||||
* class the ICMPv6Option class or even the IPv6Header class (in those cases
|
||||
* where a whole packet is appendend to the ICMPv6 message).
|
||||
*
|
||||
* So, how does this work? Let's look at some examples.
|
||||
*
|
||||
* 1. Imagine we need to build an ICMP echo request message that includes some
|
||||
* arbitrary data to be echoed. We could do the following:
|
||||
*
|
||||
* u8 final_packet[1024]; <-- Buffer to store the resulting packet
|
||||
* u32 final_packet_len=0; <-- Length of the resulting packet
|
||||
* ICMPv6Header header; <-- The ICMPv6 fixed-length part
|
||||
* RawData data; <-- The data to append to the echo message
|
||||
*
|
||||
* header.setType(ICMPv6_ECHO); <-- Set ICMPv6 type to "Echo request"
|
||||
* data.store("1234567890"); <-- Store data we need to send.
|
||||
* header.setNextElement(&data); <-- Tell ICMPv6Header what's after it
|
||||
* header.setSum(); <-- Compute the checksum
|
||||
*
|
||||
* final_packet_len=header.dumpToBinaryBuffer(fina_packet, 1024);
|
||||
* send_packet(final_packet, final_packet_len)
|
||||
*
|
||||
* 2. If we are sending a parameter problem message and we need to include the
|
||||
* invoking datagram, we can call setNextElement() passing an IPv6Header
|
||||
* pointer.
|
||||
*
|
||||
* u8 final_packet[1024]; <-- Buffer to store the resulting packet
|
||||
* u32 final_packet_len=0; <-- Length of the resulting packet
|
||||
* ICMPv6Header header; <-- The ICMPv6 fixed-length part
|
||||
* IPv6Header ipv6; <-- The IPv6 packet that triggered ICMPv6
|
||||
*
|
||||
* header.setType(ICMPv6_PARAMPROB); <-- Set ICMPv6 type to "Param Problem"
|
||||
* header.setNextElement(&ipv6); <-- Tell ICMPv6Header what's after it
|
||||
* header.setSum(); <-- Compute the checksum
|
||||
*
|
||||
* Note that here we don't show how the ipv6 object is set.
|
||||
*
|
||||
* 3. If we are sending a router solicitation message, we'll call
|
||||
* setNextElement() passing an IPv6Options Pointer.
|
||||
*
|
||||
* u8 final_packet[1024]; <-- Buffer to store the resulting packet
|
||||
* u32 final_packet_len=0; <-- Length of the resulting packet
|
||||
* ICMPv6Header header; <-- The ICMPv6 fixed-length part
|
||||
* IPv6Options opts1; <-- IPv6 options
|
||||
* IPv6Options opts2; <-- IPv6 options
|
||||
* IPv6Options opts3; <-- IPv6 options
|
||||
*
|
||||
* header.setType(ICMPv6_ROUTERSOLICIT); <-- Set ICMPv6 type
|
||||
*
|
||||
* opts1.setXXXX(); <-- Set up the options
|
||||
* .
|
||||
* .
|
||||
* .
|
||||
* opts3.setYYYY();
|
||||
*
|
||||
* opts2.setNextElement(&opts3); <-- Link the options
|
||||
* opts1.setNextElement(&opts2);
|
||||
* header.setNextElement(&opts1);
|
||||
* header.setNextElement(&ipv6); <-- Link the first option to the ICMPv6
|
||||
* header.setSum(); <-- Compute the checksum
|
||||
*
|
||||
* And so on...
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* Packet header diagrams included in this file have been taken from the
|
||||
* following IETF RFC documents: RFC 4443, RFC 2461, RFC 2894 */
|
||||
|
||||
/* ICMP types and codes.
|
||||
* The following types and codes have been defined by IANA. A complete list
|
||||
* may be found at http://www.iana.org/assignments/icmpv6-parameters
|
||||
*
|
||||
* Definitions on the first level of indentation are ICMPv6 Types.
|
||||
* Definitions on the second level of indentation (values enclosed in
|
||||
* parenthesis) are ICMPv6 Codes */
|
||||
#define ICMPv6_UNREACH 1 /* Destination unreachable [RFC 2463, 4443] */
|
||||
#define ICMPv6_UNREACH_NO_ROUTE (0) /* --> No route to destination */
|
||||
#define ICMPv6_UNREACH_PROHIBITED (1) /* --> Communication administratively prohibited */
|
||||
#define ICMPv6_UNREACH_BEYOND_SCOPE (2) /* --> Beyond scope of source address [RFC4443] */
|
||||
#define ICMPv6_UNREACH_ADDR_UNREACH (3) /* --> Address unreachable */
|
||||
#define ICMPv6_UNREACH_PORT_UNREACH (4) /* --> Port unreachable */
|
||||
#define ICMPv6_UNREACH_SRC_ADDR_FAILED (5) /* --> Source address failed ingress/egress policy [RFC4443] */
|
||||
#define ICMPv6_UNREACH_REJECT_ROUTE (6) /* --> Reject route to destination [RFC4443] */
|
||||
#define ICMPv6_PKTTOOBIG 2 /* Packet too big [RFC 2463, 4443] */
|
||||
#define ICMPv6_TIMXCEED 3 /* Time exceeded [RFC 2463, 4443] */
|
||||
#define ICMPv6_TIMXCEED_HOP_EXCEEDED (0) /* --> Hop limit exceeded in transit */
|
||||
#define ICMPv6_TIMXCEED_REASS_EXCEEDED (1) /* --> Fragment reassembly time exceeded */
|
||||
#define ICMPv6_PARAMPROB 4 /* Parameter problem [RFC 2463, 4443] */
|
||||
#define ICMPv6_PARAMPROB_FIELD (0) /* --> Erroneous header field encountered */
|
||||
#define ICMPv6_PARAMPROB_NEXT_HDR (1) /* --> Unrecognized Next Header type encountered */
|
||||
#define ICMPv6_PARAMPROB_OPTION (2) /* --> Unrecognized IPv6 option encountered */
|
||||
#define ICMPv6_ECHO 128 /* Echo request [RFC 2463, 4443] */
|
||||
#define ICMPv6_ECHOREPLY 129 /* Echo reply [RFC 2463, 4443] */
|
||||
#define ICMPv6_GRPMEMBQUERY 130 /* Group Membership Query [RFC 2710] */
|
||||
#define ICMPv6_GRPMEMBREP 131 /* Group Membership Report [RFC 2710] */
|
||||
#define ICMPv6_GRPMEMBRED 132 /* Group Membership Reduction [RFC 2710] */
|
||||
#define ICMPv6_ROUTERSOLICIT 133 /* Router Solicitation [RFC 2461] */
|
||||
#define ICMPv6_ROUTERADVERT 134 /* Router Advertisement [RFC 2461] */
|
||||
#define ICMPv6_NGHBRSOLICIT 135 /* Neighbor Solicitation [RFC 2461] */
|
||||
#define ICMPv6_NGHBRADVERT 136 /* Neighbor Advertisement [RFC 2461] */
|
||||
#define ICMPv6_REDIRECT 137 /* Redirect [RFC 2461] */
|
||||
#define ICMPv6_RTRRENUM 138 /* Router Renumbering [RFC 2894] */
|
||||
#define ICMPv6_RTRRENUM_COMMAND (0) /* --> Router Renumbering Command */
|
||||
#define ICMPv6_RTRRENUM_RESULT (1) /* --> Router Renumbering Result */
|
||||
#define ICMPv6_RTRRENUM_SEQ_RESET (255) /* Sequence Number Reset */
|
||||
#define ICMPv6_NODEINFOQUERY 139 /* ICMP Node Information Query [RFC 4620] */
|
||||
#define ICMPv6_NODEINFOQUERY_IPv6ADDR (0) /* --> The Data field contains an IPv6 address */
|
||||
#define ICMPv6_NODEINFOQUERY_NAME (1) /* --> The Data field contains a name */
|
||||
#define ICMPv6_NODEINFOQUERY_IPv4ADDR (2) /* --> The Data field contains an IPv4 address */
|
||||
#define ICMPv6_NODEINFORESP 140 /* ICMP Node Information Response [RFC 4620] */
|
||||
#define ICMPv6_NODEINFORESP_SUCCESS (0) /* --> A successful reply. */
|
||||
#define ICMPv6_NODEINFORESP_REFUSED (1) /* --> The Responder refuses to supply the answer */
|
||||
#define ICMPv6_NODEINFORESP_UNKNOWN (2) /* --> The Qtype of the Query is unknown */
|
||||
#define ICMPv6_INVNGHBRSOLICIT 141 /* Inverse Neighbor Discovery Solicitation Message [RFC 3122] */
|
||||
#define ICMPv6_INVNGHBRADVERT 142 /* Inverse Neighbor Discovery Advertisement Message [RFC 3122] */
|
||||
#define ICMPv6_MLDV2 143 /* MLDv2 Multicast Listener Report [RFC 3810] */
|
||||
#define ICMPv6_AGENTDISCOVREQ 144 /* Home Agent Address Discovery Request Message [RFC 3775] */
|
||||
#define ICMPv6_AGENTDISCOVREPLY 145 /* Home Agent Address Discovery Reply Message [RFC 3775] */
|
||||
#define ICMPv6_MOBPREFIXSOLICIT 146 /* Mobile Prefix Solicitation [RFC 3775] */
|
||||
#define ICMPv6_MOBPREFIXADVERT 147 /* Mobile Prefix Advertisement [RFC 3775] */
|
||||
#define ICMPv6_CERTPATHSOLICIT 148 /* Certification Path Solicitation [RFC 3971] */
|
||||
#define ICMPv6_CERTPATHADVERT 149 /* Certification Path Advertisement [RFC 3971] */
|
||||
#define ICMPv6_EXPMOBILITY 150 /* Experimental mobility protocols [RFC 4065] */
|
||||
#define ICMPv6_MRDADVERT 151 /* MRD, Multicast Router Advertisement [RFC 4286] */
|
||||
#define ICMPv6_MRDSOLICIT 152 /* MRD, Multicast Router Solicitation [RFC 4286] */
|
||||
#define ICMPv6_MRDTERMINATE 153 /* MRD, Multicast Router Termination [RFC 4286] */
|
||||
#define ICMPv6_FMIPV6 154 /* FMIPv6 messages [RFC 5568] */
|
||||
|
||||
/* Node Information parameters */
|
||||
/* -> Query types */
|
||||
#define NI_QTYPE_NOOP 0
|
||||
#define NI_QTYPE_UNUSED 1
|
||||
#define NI_QTYPE_NODENAME 2
|
||||
#define NI_QTYPE_NODEADDRS 3
|
||||
#define NI_QTYPE_IPv4ADDRS 4
|
||||
/* -> Misc */
|
||||
#define NI_NONCE_LEN 8
|
||||
|
||||
/* Nping ICMPv6Header Class internal definitions */
|
||||
#define ICMPv6_COMMON_HEADER_LEN 4
|
||||
#define ICMPv6_MIN_HEADER_LEN 8
|
||||
#define ICMPv6_UNREACH_LEN (ICMPv6_COMMON_HEADER_LEN+4)
|
||||
#define ICMPv6_PKTTOOBIG_LEN (ICMPv6_COMMON_HEADER_LEN+4)
|
||||
#define ICMPv6_TIMXCEED_LEN (ICMPv6_COMMON_HEADER_LEN+4)
|
||||
#define ICMPv6_PARAMPROB_LEN (ICMPv6_COMMON_HEADER_LEN+4)
|
||||
#define ICMPv6_ECHO_LEN (ICMPv6_COMMON_HEADER_LEN+4)
|
||||
#define ICMPv6_ECHOREPLY_LEN (ICMPv6_COMMON_HEADER_LEN+4)
|
||||
#define ICMPv6_ROUTERSOLICIT_LEN (ICMPv6_COMMON_HEADER_LEN+4)
|
||||
#define ICMPv6_ROUTERADVERT_LEN (ICMPv6_COMMON_HEADER_LEN+12)
|
||||
#define ICMPv6_NGHBRSOLICIT_LEN (ICMPv6_COMMON_HEADER_LEN+20)
|
||||
#define ICMPv6_NGHBRADVERT_LEN (ICMPv6_COMMON_HEADER_LEN+20)
|
||||
#define ICMPv6_REDIRECT_LEN (ICMPv6_COMMON_HEADER_LEN+36)
|
||||
#define ICMPv6_RTRRENUM_LEN (ICMPv6_COMMON_HEADER_LEN+12)
|
||||
#define ICMPv6_NODEINFO_LEN (ICMPv6_COMMON_HEADER_LEN+12)
|
||||
#define ICMPv6_MLD_LEN (ICMPv6_COMMON_HEADER_LEN+20)
|
||||
/* This must the MAX() of all values defined above*/
|
||||
#define ICMPv6_MAX_MESSAGE_BODY (ICMPv6_REDIRECT_LEN-ICMPv6_COMMON_HEADER_LEN)
|
||||
|
||||
|
||||
|
||||
class ICMPv6Header : public ICMPHeader {
|
||||
|
||||
/**********************************************************************/
|
||||
/* COMMON ICMPv6 packet HEADER */
|
||||
/**********************************************************************/
|
||||
/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
+ Message Body +
|
||||
| | */
|
||||
struct nping_icmpv6_hdr{
|
||||
u8 type;
|
||||
u8 code;
|
||||
u16 checksum;
|
||||
u8 data[ICMPv6_MAX_MESSAGE_BODY];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct nping_icmpv6_hdr nping_icmpv6_hdr_t;
|
||||
|
||||
|
||||
/**********************************************************************/
|
||||
/* ICMPv6 MESSAGE SPECIFIC HEADERS */
|
||||
/**********************************************************************/
|
||||
|
||||
/* Destination Unreachable Message
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Unused |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| As much of invoking packet |
|
||||
+ as possible without the ICMPv6 packet +
|
||||
| exceeding the minimum IPv6 MTU [IPv6] | */
|
||||
struct dest_unreach_msg{
|
||||
u32 unused;
|
||||
//u8 invoking_pkt[?];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct dest_unreach_msg dest_unreach_msg_t;
|
||||
|
||||
|
||||
/* Packet Too Big Message
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| MTU |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| As much of invoking packet |
|
||||
+ as possible without the ICMPv6 packet +
|
||||
| exceeding the minimum IPv6 MTU [IPv6] | */
|
||||
struct pkt_too_big_msg{
|
||||
u32 mtu;
|
||||
//u8 invoking_pkt[?];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct pkt_too_big_msg pkt_too_big_msg_t;
|
||||
|
||||
|
||||
/* Time Exceeded Message
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Unused |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| As much of invoking packet |
|
||||
+ as possible without the ICMPv6 packet +
|
||||
| exceeding the minimum IPv6 MTU [IPv6] | */
|
||||
struct time_exceeded_msg{
|
||||
u32 unused;
|
||||
//u8 invoking_pkt[?];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct time_exceeded_msg time_exceeded_msg_t;
|
||||
|
||||
|
||||
/* Parameter Problem Message
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Pointer |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| As much of invoking packet |
|
||||
+ as possible without the ICMPv6 packet +
|
||||
| exceeding the minimum IPv6 MTU [IPv6] | */
|
||||
struct parameter_problem_msg{
|
||||
u32 pointer;
|
||||
//u8 invoking_pkt[?];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct parameter_problem_msg parameter_problem_msg_t;
|
||||
|
||||
|
||||
/* Echo Request/Response Messages
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Identifier | Sequence Number |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Data ...
|
||||
+-+-+-+-+- */
|
||||
struct echo_msg{
|
||||
u16 id;
|
||||
u16 seq;
|
||||
//u8 data[?];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct echo_msg echo_msg_t;
|
||||
|
||||
/* Router Advertisement Message
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Cur Hop Limit |M|O|H|Prf|P|R|R| Router Lifetime |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Reachable Time |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Retrans Timer |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Options ...
|
||||
+-+-+-+-+-+-+-+-+-+-+-+- */
|
||||
struct router_advert_msg{
|
||||
u8 current_hop_limit;
|
||||
u8 autoconfig_flags; /* See RFC 5175 */
|
||||
u16 router_lifetime;
|
||||
u32 reachable_time;
|
||||
u32 retransmission_timer;
|
||||
//u8 icmpv6_options[?];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct router_advert_msg router_advert_msg_t;
|
||||
|
||||
|
||||
/* Router Solicitation Message
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Reserved |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Options ...
|
||||
+-+-+-+-+-+-+-+-+-+-+-+- */
|
||||
struct router_solicit_msg{
|
||||
u32 reserved;
|
||||
//u8 icmpv6_options[?];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct router_solicit_msg router_solicit_msg_t;
|
||||
|
||||
|
||||
/* Neighbor Advertisement Message
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|R|S|O| Reserved |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+ Target Address +
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Options ...
|
||||
+-+-+-+-+-+-+-+-+-+-+-+- */
|
||||
struct neighbor_advert_msg{
|
||||
u8 flags;
|
||||
u8 reserved[3];
|
||||
u8 target_address[16];
|
||||
//u8 icmpv6_options[?];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct neighbor_advert_msg neighbor_advert_msg_t;
|
||||
|
||||
|
||||
/* Neighbor Solicitation Message
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Reserved |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+ Target Address +
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Options ...
|
||||
+-+-+-+-+-+-+-+-+-+-+-+- */
|
||||
struct neighbor_solicit_msg{
|
||||
u32 reserved;
|
||||
u8 target_address[16];
|
||||
//u8 icmpv6_options[?];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct neighbor_solicit_msg neighbor_solicit_msg_t;
|
||||
|
||||
|
||||
/* Redirect Message
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Reserved |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+ Target Address +
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+ Destination Address +
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Options ...
|
||||
+-+-+-+-+-+-+-+-+-+-+-+- */
|
||||
struct redirect_msg{
|
||||
u32 reserved;
|
||||
u8 target_address[16];
|
||||
u8 destination_address[16];
|
||||
//u8 icmpv6_options[?];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct redirect_msg redirect_msg_t;
|
||||
|
||||
|
||||
/* Router Renumbering Header
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| SequenceNumber |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| SegmentNumber | Flags | MaxDelay |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| reserved |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
/ RR Message Body /
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
struct router_renumbering_msg{
|
||||
u32 seq;
|
||||
u8 segment_number;
|
||||
u8 flags;
|
||||
u16 max_delay;
|
||||
u32 reserved;
|
||||
//u8 rr_msg_body[?];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct router_renumbering_msg router_renumbering_msg_t;
|
||||
|
||||
|
||||
/* Node Information Queries
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Qtype | Flags |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
+ Nonce +
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
/ Data /
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
struct nodeinfo_msg{
|
||||
u16 qtype;
|
||||
u16 flags;
|
||||
u8 nonce[NI_NONCE_LEN];
|
||||
//u8 data[?];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct nodeinfo_msg nodeinfo_msg_t;
|
||||
|
||||
|
||||
/* Multicast Listener Discovery
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Maximum Response Delay | Reserved |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+ Multicast Address +
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
struct mld_msg{
|
||||
u16 max_response_delay;
|
||||
u16 reserved;
|
||||
u8 mcast_address[16];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct mld_msg mld_msg_t;
|
||||
|
||||
|
||||
nping_icmpv6_hdr_t h;
|
||||
|
||||
/* Helper pointers */
|
||||
dest_unreach_msg_t *h_du;
|
||||
pkt_too_big_msg_t *h_ptb;
|
||||
time_exceeded_msg_t *h_te;
|
||||
parameter_problem_msg_t *h_pp;
|
||||
echo_msg_t *h_e;
|
||||
router_advert_msg_t *h_ra;
|
||||
router_solicit_msg_t *h_rs;
|
||||
neighbor_advert_msg_t *h_na;
|
||||
neighbor_solicit_msg_t *h_ns;
|
||||
redirect_msg_t *h_r;
|
||||
router_renumbering_msg_t *h_rr;
|
||||
nodeinfo_msg_t *h_ni;
|
||||
mld_msg_t *h_mld;
|
||||
|
||||
public:
|
||||
ICMPv6Header();
|
||||
~ICMPv6Header();
|
||||
void reset();
|
||||
u8 *getBufferPointer();
|
||||
int storeRecvData(const u8 *buf, size_t len);
|
||||
int protocol_id() const;
|
||||
int validate();
|
||||
int print(FILE *output, int detail) const;
|
||||
|
||||
/* ICMP Type */
|
||||
int setType(u8 val);
|
||||
u8 getType() const;
|
||||
bool validateType();
|
||||
bool validateType(u8 val);
|
||||
|
||||
/* Code */
|
||||
int setCode(u8 c);
|
||||
u8 getCode() const;
|
||||
bool validateCode();
|
||||
bool validateCode(u8 type, u8 code);
|
||||
|
||||
/* Checksum */
|
||||
int setSum();
|
||||
int setSum(u16 s);
|
||||
int setSumRandom();
|
||||
u16 getSum();
|
||||
|
||||
int setReserved(u32 val);
|
||||
u32 getReserved();
|
||||
int setUnused(u32 val);
|
||||
u32 getUnused();
|
||||
|
||||
int setFlags(u8 val);
|
||||
u8 getFlags();
|
||||
|
||||
int setMTU(u32 mtu);
|
||||
u32 getMTU();
|
||||
|
||||
/* Parameter problem */
|
||||
int setPointer(u32 val);
|
||||
u32 getPointer();
|
||||
|
||||
/* Echo */
|
||||
int setIdentifier(u16 val);
|
||||
u16 getIdentifier();
|
||||
int setSequence(u16 val);
|
||||
int setSequence(u32 val);
|
||||
u32 getSequence();
|
||||
|
||||
/* Router Advertisement */
|
||||
int setCurrentHopLimit(u8 val);
|
||||
u8 getCurrentHopLimit();
|
||||
|
||||
int setRouterLifetime(u16 val);
|
||||
u16 getRouterLifetime();
|
||||
|
||||
int setReachableTime(u32 val);
|
||||
u32 getReachableTime();
|
||||
|
||||
int setRetransmissionTimer(u32 val);
|
||||
u32 getRetransmissionTimer();
|
||||
|
||||
int setTargetAddress(struct in6_addr addr);
|
||||
struct in6_addr getTargetAddress();
|
||||
|
||||
int setDestinationAddress(struct in6_addr addr);
|
||||
struct in6_addr getDestinationAddress();
|
||||
|
||||
int setSegmentNumber(u8 val);
|
||||
u8 getSegmentNumber();
|
||||
|
||||
int setMaxDelay(u16 val);
|
||||
u16 getMaxDelay();
|
||||
|
||||
/* Node Information Queries */
|
||||
int setQtype(u16 val);
|
||||
u16 getQtype();
|
||||
int setNodeInfoFlags(u16 val);
|
||||
u16 getNodeInfoFlags();
|
||||
int setG(bool flag_value=true);
|
||||
bool getG();
|
||||
int setS(bool flag_value=true);
|
||||
bool getS();
|
||||
int setL(bool flag_value=true);
|
||||
bool getL();
|
||||
int setC(bool flag_value=true);
|
||||
bool getC();
|
||||
int setA(bool flag_value=true);
|
||||
bool getA();
|
||||
int setT(bool flag_value=true);
|
||||
bool getT();
|
||||
int setNonce(const u8 *nonce);
|
||||
u8 *getNonce();
|
||||
|
||||
/* Multicast Listener Discovery */
|
||||
int setMulticastAddress(struct in6_addr addr);
|
||||
struct in6_addr getMulticastAddress();
|
||||
|
||||
/* Misc */
|
||||
int getHeaderLengthFromType(u8 type);
|
||||
bool isError() const;
|
||||
|
||||
}; /* End of class ICMPv6Header */
|
||||
|
||||
#endif
|
||||
357
libnetutil/ICMPv6Option.cc
Executable file
357
libnetutil/ICMPv6Option.cc
Executable file
@@ -0,0 +1,357 @@
|
||||
|
||||
/***************************************************************************
|
||||
* ICMPv6Option.cc -- The ICMPv6Option Class represents an ICMP version 6 *
|
||||
* option. It contains methods to set any header field. In general, these *
|
||||
* methods do error checkings and byte order conversion. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#include "ICMPv6Option.h"
|
||||
|
||||
|
||||
ICMPv6Option::ICMPv6Option() {
|
||||
this->reset();
|
||||
} /* End of ICMPv6Option constructor */
|
||||
|
||||
|
||||
ICMPv6Option::~ICMPv6Option() {
|
||||
|
||||
} /* End of ICMPv6Option destructor */
|
||||
|
||||
|
||||
/** Sets every class attribute to zero */
|
||||
void ICMPv6Option::reset(){
|
||||
memset(&this->h, 0, sizeof(nping_icmpv6_option_t));
|
||||
h_la = (link_addr_option_t *)this->h.data;
|
||||
h_pi = (prefix_info_option_t *)this->h.data;
|
||||
h_r = (redirect_option_t *)this->h.data;
|
||||
h_mtu = (mtu_option_t *)this->h.data;
|
||||
} /* End of reset() */
|
||||
|
||||
|
||||
/** @warning This method is essential for the superclass getBinaryBuffer()
|
||||
* method to work. Do NOT change a thing unless you know what you're doing */
|
||||
u8 *ICMPv6Option::getBufferPointer(){
|
||||
return (u8*)(&this->h);
|
||||
} /* End of getBufferPointer() */
|
||||
|
||||
|
||||
/** Stores supplied packet in the internal buffer so the information
|
||||
* can be accessed using the standard get & set methods.
|
||||
* @warning The ICMPv6Option class is able to hold a maximum of
|
||||
* sizeof(nping_icmpv6_option_t) bytes. If the supplied buffer is longer than
|
||||
* that, only the first sizeof(nping_icmpv6_option_t) bytes will be stored in
|
||||
* the internal buffer.
|
||||
* @warning Supplied len MUST be at least ICMPv6_OPTION_MIN_HEADER_LEN bytes
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error */
|
||||
int ICMPv6Option::storeRecvData(const u8 *buf, size_t len){
|
||||
if(buf==NULL || len<ICMPv6_OPTION_MIN_HEADER_LEN){
|
||||
return OP_FAILURE;
|
||||
}else{
|
||||
int stored_len = MIN( sizeof(nping_icmpv6_option_t), len);
|
||||
this->reset(); /* Re-init the object, just in case the caller had used it already */
|
||||
this->length=stored_len;
|
||||
memcpy(&(this->h), buf, stored_len);
|
||||
}
|
||||
return OP_SUCCESS;
|
||||
} /* End of storeRecvData() */
|
||||
|
||||
int ICMPv6Option::protocol_id() const {
|
||||
return HEADER_TYPE_ICMPv6_OPTION;
|
||||
}
|
||||
|
||||
|
||||
int ICMPv6Option::setType(u8 val){
|
||||
this->h.type=val;
|
||||
this->length = getHeaderLengthFromType(val);
|
||||
this->h.length = this->length / 8;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setType() */
|
||||
|
||||
u8 ICMPv6Option::getType(){
|
||||
return this->h.type;
|
||||
} /* End of getType() */
|
||||
|
||||
|
||||
bool ICMPv6Option::validateType(u8 val){
|
||||
switch( val ){
|
||||
case ICMPv6_OPTION_SRC_LINK_ADDR:
|
||||
case ICMPv6_OPTION_TGT_LINK_ADDR:
|
||||
case ICMPv6_OPTION_PREFIX_INFO:
|
||||
case ICMPv6_OPTION_REDIR_HDR:
|
||||
case ICMPv6_OPTION_MTU:
|
||||
return true;
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
} /* End of validateType() */
|
||||
|
||||
|
||||
|
||||
int ICMPv6Option::setLength(u8 val){
|
||||
this->h.length=val;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setLength() */
|
||||
|
||||
u8 ICMPv6Option::getLength(){
|
||||
return this->h.length;
|
||||
} /* End of getLength() */
|
||||
|
||||
|
||||
int ICMPv6Option::setLinkAddress(u8* val){
|
||||
if(val==NULL)
|
||||
return OP_FAILURE;
|
||||
switch(this->h.type){
|
||||
case ICMPv6_OPTION_SRC_LINK_ADDR:
|
||||
case ICMPv6_OPTION_TGT_LINK_ADDR:
|
||||
memcpy(this->h_la->link_addr, val, ICMPv6_OPTION_LINK_ADDRESS_LEN);
|
||||
return OP_SUCCESS;
|
||||
break;
|
||||
|
||||
default:
|
||||
return OP_FAILURE;
|
||||
break;
|
||||
}
|
||||
} /* End of setLinkAddress() */
|
||||
|
||||
|
||||
u8 *ICMPv6Option::getLinkAddress(){
|
||||
switch(this->h.type){
|
||||
case ICMPv6_OPTION_SRC_LINK_ADDR:
|
||||
case ICMPv6_OPTION_TGT_LINK_ADDR:
|
||||
return this->h_la->link_addr;
|
||||
break;
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
break;
|
||||
}
|
||||
} /* End of getLinkAddress() */
|
||||
|
||||
|
||||
int ICMPv6Option::setPrefixLength(u8 val){
|
||||
if(this->h.type!=ICMPv6_OPTION_PREFIX_INFO)
|
||||
return OP_FAILURE;
|
||||
this->h_pi->prefix_length=val;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setPrefixLength() */
|
||||
|
||||
|
||||
u8 ICMPv6Option::getPrefixLength(){
|
||||
if(this->h.type!=ICMPv6_OPTION_PREFIX_INFO)
|
||||
return 0;
|
||||
else
|
||||
return this->h_pi->prefix_length;
|
||||
} /* End of getPrefixLength() */
|
||||
|
||||
|
||||
int ICMPv6Option::setFlags(u8 val){
|
||||
if(this->h.type!=ICMPv6_OPTION_PREFIX_INFO)
|
||||
return OP_FAILURE;
|
||||
this->h_pi->flags=val;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setFlags() */
|
||||
|
||||
|
||||
u8 ICMPv6Option::getFlags(){
|
||||
if(this->h.type!=ICMPv6_OPTION_PREFIX_INFO)
|
||||
return 0;
|
||||
else
|
||||
return this->h_pi->flags;
|
||||
} /* End of getFlags() */
|
||||
|
||||
|
||||
int ICMPv6Option::setValidLifetime(u32 val){
|
||||
if(this->h.type!=ICMPv6_OPTION_PREFIX_INFO)
|
||||
return OP_FAILURE;
|
||||
this->h_pi->valid_lifetime=htonl(val);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setValidLifetime() */
|
||||
|
||||
|
||||
u32 ICMPv6Option::getValidLifetime(){
|
||||
if(this->h.type!=ICMPv6_OPTION_PREFIX_INFO)
|
||||
return 0;
|
||||
else
|
||||
return ntohl(this->h_pi->valid_lifetime);
|
||||
} /* End of getValidLifetime() */
|
||||
|
||||
|
||||
int ICMPv6Option::setPreferredLifetime(u32 val){
|
||||
if(this->h.type!=ICMPv6_OPTION_PREFIX_INFO)
|
||||
return OP_FAILURE;
|
||||
this->h_pi->preferred_lifetime=htonl(val);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setPreferredLifetime() */
|
||||
|
||||
|
||||
u32 ICMPv6Option::getPreferredLifetime(){
|
||||
if(this->h.type!=ICMPv6_OPTION_PREFIX_INFO)
|
||||
return 0;
|
||||
else
|
||||
return ntohl(this->h_pi->preferred_lifetime);
|
||||
} /* End of getPreferredLifetime() */
|
||||
|
||||
|
||||
int ICMPv6Option::setPrefix(u8 *val){
|
||||
if(val==NULL || this->h.type!=ICMPv6_OPTION_PREFIX_INFO)
|
||||
return OP_FAILURE;
|
||||
else
|
||||
memcpy(this->h_pi->prefix, val, 16);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setPrefix() */
|
||||
|
||||
|
||||
u8 *ICMPv6Option::getPrefix(){
|
||||
if(this->h.type!=ICMPv6_OPTION_PREFIX_INFO)
|
||||
return NULL;
|
||||
else
|
||||
return this->h_pi->prefix;
|
||||
} /* End of getPrefix() */
|
||||
|
||||
|
||||
int ICMPv6Option::setMTU(u32 val){
|
||||
if(this->h.type!=ICMPv6_OPTION_MTU)
|
||||
return OP_FAILURE;
|
||||
this->h_mtu->mtu=htonl(val);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setMTU() */
|
||||
|
||||
|
||||
u32 ICMPv6Option::getMTU(){
|
||||
if(this->h.type!=ICMPv6_OPTION_MTU)
|
||||
return 0;
|
||||
else
|
||||
return ntohl(this->h_mtu->mtu);
|
||||
} /* End of getMTU() */
|
||||
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* MISCELLANEOUS STUFF */
|
||||
/******************************************************************************/
|
||||
|
||||
/** Returns the standard ICMPv6 optiom length for the supplied option type.
|
||||
* @warning Return value corresponds strictly to the ICMPv7 option header, this
|
||||
* is, the minimum length of the OPTION, variable length payload is never
|
||||
* included. For example, an ICMPv6 Redirect option has a fixed header of 8
|
||||
* bytes but then it may contain an IPv6 header. We only return 8
|
||||
* because we don't know in advance the total number of bytes for the message.
|
||||
* Same applies to the rest of types. */
|
||||
int ICMPv6Option::getHeaderLengthFromType(u8 type){
|
||||
switch( type ){
|
||||
case ICMPv6_OPTION_SRC_LINK_ADDR:
|
||||
return ICMPv6_OPTION_SRC_LINK_ADDR_LEN;
|
||||
break;
|
||||
|
||||
case ICMPv6_OPTION_TGT_LINK_ADDR:
|
||||
return ICMPv6_OPTION_TGT_LINK_ADDR_LEN;
|
||||
break;
|
||||
|
||||
case ICMPv6_OPTION_PREFIX_INFO:
|
||||
return ICMPv6_OPTION_PREFIX_INFO_LEN;
|
||||
break;
|
||||
|
||||
case ICMPv6_OPTION_REDIR_HDR:
|
||||
return ICMPv6_OPTION_REDIR_HDR_LEN;
|
||||
break;
|
||||
|
||||
case ICMPv6_OPTION_MTU:
|
||||
return ICMPv6_OPTION_MTU_LEN;
|
||||
break;
|
||||
|
||||
/* Packets with non RFC-Compliant option types will be represented as an
|
||||
* 8-byte ICMPv6 option. */
|
||||
default:
|
||||
return ICMPv6_OPTION_MIN_HEADER_LEN;
|
||||
break;
|
||||
}
|
||||
} /* End of getHeaderLengthFromType() */
|
||||
266
libnetutil/ICMPv6Option.h
Executable file
266
libnetutil/ICMPv6Option.h
Executable file
@@ -0,0 +1,266 @@
|
||||
|
||||
/***************************************************************************
|
||||
* ICMPv6Option.h -- The ICMPv6Option Class represents an ICMP version 6 *
|
||||
* option. It contains methods to set any header field. In general, these *
|
||||
* methods do error checkings and byte order conversion. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#ifndef __ICMPv6OPTION_H__
|
||||
#define __ICMPv6OPTION_H__ 1
|
||||
|
||||
#include "NetworkLayerElement.h"
|
||||
|
||||
/* Packet header diagrams included in this file have been taken from the
|
||||
* following IETF RFC documents: RFC 2461, RFC 2894 */
|
||||
|
||||
/* The following codes have been defined by IANA. A complete list may be found
|
||||
* at http://www.iana.org/assignments/icmpv6-parameters */
|
||||
|
||||
/* ICMPv6 Option Types */
|
||||
#define ICMPv6_OPTION_SRC_LINK_ADDR 1
|
||||
#define ICMPv6_OPTION_TGT_LINK_ADDR 2
|
||||
#define ICMPv6_OPTION_PREFIX_INFO 3
|
||||
#define ICMPv6_OPTION_REDIR_HDR 4
|
||||
#define ICMPv6_OPTION_MTU 5
|
||||
|
||||
/* Nping ICMPv6Options Class internal definitions */
|
||||
#define ICMPv6_OPTION_COMMON_HEADER_LEN 2
|
||||
#define ICMPv6_OPTION_MIN_HEADER_LEN 8
|
||||
#define ICMPv6_OPTION_SRC_LINK_ADDR_LEN (ICMPv6_OPTION_COMMON_HEADER_LEN+6)
|
||||
#define ICMPv6_OPTION_TGT_LINK_ADDR_LEN (ICMPv6_OPTION_COMMON_HEADER_LEN+6)
|
||||
#define ICMPv6_OPTION_PREFIX_INFO_LEN (ICMPv6_OPTION_COMMON_HEADER_LEN+30)
|
||||
#define ICMPv6_OPTION_REDIR_HDR_LEN (ICMPv6_OPTION_COMMON_HEADER_LEN+6)
|
||||
#define ICMPv6_OPTION_MTU_LEN (ICMPv6_OPTION_COMMON_HEADER_LEN+6)
|
||||
/* This must the MAX() of all values defined above*/
|
||||
#define ICMPv6_OPTION_MAX_MESSAGE_BODY (ICMPv6_OPTION_PREFIX_INFO_LEN-ICMPv6_OPTION_COMMON_HEADER_LEN)
|
||||
|
||||
#define ICMPv6_OPTION_LINK_ADDRESS_LEN 6
|
||||
|
||||
class ICMPv6Option : public NetworkLayerElement {
|
||||
|
||||
private:
|
||||
|
||||
/**********************************************************************/
|
||||
/* COMMON ICMPv6 OPTION HEADER */
|
||||
/**********************************************************************/
|
||||
|
||||
struct nping_icmpv6_option{
|
||||
u8 type;
|
||||
u8 length;
|
||||
u8 data[ICMPv6_OPTION_MAX_MESSAGE_BODY];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct nping_icmpv6_option nping_icmpv6_option_t;
|
||||
|
||||
/**********************************************************************/
|
||||
/* ICMPv6 OPTION FORMATS */
|
||||
/**********************************************************************/
|
||||
/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Length | ... |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
~ ... ~
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
|
||||
|
||||
/* Source/Target Link-layer Address
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Length | Link-Layer Address ...
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
struct link_addr_option{
|
||||
u8 link_addr[6];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct link_addr_option link_addr_option_t;
|
||||
|
||||
|
||||
/* Prefix Information
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Length | Prefix Length |L|A| Reserved1 |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Valid Lifetime |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Preferred Lifetime |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Reserved2 |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+ Prefix +
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
struct prefix_info_option{
|
||||
u8 prefix_length;
|
||||
u8 flags;
|
||||
u32 valid_lifetime;
|
||||
u32 preferred_lifetime;
|
||||
u32 reserved;
|
||||
u8 prefix[16];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct prefix_info_option prefix_info_option_t;
|
||||
|
||||
|
||||
/* Redirect Header
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Length | Reserved |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Reserved |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
~ IP header + data ~
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
struct redirect_option{
|
||||
u16 reserved_1;
|
||||
u32 reserved_2;
|
||||
//u8 invoking_pkt[?];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct redirect_option redirect_option_t;
|
||||
|
||||
|
||||
/* MTU
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Length | Reserved |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| MTU |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
struct mtu_option{
|
||||
u16 reserved;
|
||||
u32 mtu;
|
||||
}__attribute__((__packed__));
|
||||
typedef struct mtu_option mtu_option_t;
|
||||
|
||||
|
||||
nping_icmpv6_option_t h;
|
||||
|
||||
link_addr_option_t *h_la;
|
||||
prefix_info_option_t *h_pi;
|
||||
redirect_option_t *h_r;
|
||||
mtu_option_t *h_mtu;
|
||||
|
||||
public:
|
||||
ICMPv6Option();
|
||||
~ICMPv6Option();
|
||||
void reset();
|
||||
u8 *getBufferPointer();
|
||||
int storeRecvData(const u8 *buf, size_t len);
|
||||
int protocol_id() const;
|
||||
|
||||
int setType(u8 val);
|
||||
u8 getType();
|
||||
bool validateType(u8 val);
|
||||
|
||||
int setLength(u8 val);
|
||||
u8 getLength();
|
||||
|
||||
int setLinkAddress(u8* val);
|
||||
u8 *getLinkAddress();
|
||||
|
||||
int setPrefixLength(u8 val);
|
||||
u8 getPrefixLength();
|
||||
|
||||
int setFlags(u8 val);
|
||||
u8 getFlags();
|
||||
|
||||
int setValidLifetime(u32 val);
|
||||
u32 getValidLifetime();
|
||||
|
||||
int setPreferredLifetime(u32 val);
|
||||
u32 getPreferredLifetime();
|
||||
|
||||
int setPrefix(u8 *val);
|
||||
u8 *getPrefix();
|
||||
|
||||
int setMTU(u32 val);
|
||||
u32 getMTU();
|
||||
|
||||
int getHeaderLengthFromType(u8 type);
|
||||
|
||||
}; /* End of class ICMPv6Option */
|
||||
|
||||
#endif
|
||||
142
libnetutil/ICMPv6RRBody.cc
Executable file
142
libnetutil/ICMPv6RRBody.cc
Executable file
@@ -0,0 +1,142 @@
|
||||
|
||||
/***************************************************************************
|
||||
* ICMPv6RRBody.h -- The ICMPv6RRBody Class represents an ICMP version 6 *
|
||||
* Router Renumbering message body. It contains methods to set any header *
|
||||
* field. In general, these methods do error checkings and byte order *
|
||||
* conversions. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#include "ICMPv6RRBody.h"
|
||||
|
||||
|
||||
ICMPv6RRBody::ICMPv6RRBody() {
|
||||
this->reset();
|
||||
} /* End of ICMPv6RRBody constructor */
|
||||
|
||||
|
||||
ICMPv6RRBody::~ICMPv6RRBody() {
|
||||
|
||||
} /* End of ICMPv6RRBody destructor */
|
||||
|
||||
|
||||
/** Sets every class attribute to zero */
|
||||
void ICMPv6RRBody::reset(){
|
||||
memset(&this->h, 0, sizeof(nping_icmpv6_rr_body_t));
|
||||
h_mp = (rr_match_prefix_t *)this->h.data;
|
||||
h_up = (rr_use_prefix_t *)this->h.data;
|
||||
h_r = (rr_result_msg_t *)this->h.data;
|
||||
} /* End of reset() */
|
||||
|
||||
|
||||
/** @warning This method is essential for the superclass getBinaryBuffer()
|
||||
* method to work. Do NOT change a thing unless you know what you're doing */
|
||||
u8 *ICMPv6RRBody::getBufferPointer(){
|
||||
return (u8*)(&this->h);
|
||||
} /* End of getBufferPointer() */
|
||||
|
||||
|
||||
/** Stores supplied packet in the internal buffer so the information
|
||||
* can be accessed using the standard get & set methods.
|
||||
* @warning The ICMPv6RRBody class is able to hold a maximum of
|
||||
* sizeof(nping_icmpv6_rr_body_t) bytes. If the supplied buffer is longer than
|
||||
* that, only the first sizeof(nping_icmpv6_rr_body_t) bytes will be stored in
|
||||
* the internal buffer.
|
||||
* @warning Supplied len MUST be at least ICMPv6_RR_MIN_LENGTH bytes
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error */
|
||||
int ICMPv6RRBody::storeRecvData(const u8 *buf, size_t len){
|
||||
if(buf==NULL || len<ICMPv6_RR_MIN_LENGTH){
|
||||
return OP_FAILURE;
|
||||
}else{
|
||||
int stored_len = MIN( sizeof(nping_icmpv6_rr_body_t), len);
|
||||
this->reset(); /* Re-init the object, just in case the caller had used it already */
|
||||
this->length=stored_len;
|
||||
memcpy(&(this->h), buf, stored_len);
|
||||
}
|
||||
return OP_SUCCESS;
|
||||
} /* End of storeRecvData() */
|
||||
|
||||
231
libnetutil/ICMPv6RRBody.h
Executable file
231
libnetutil/ICMPv6RRBody.h
Executable file
@@ -0,0 +1,231 @@
|
||||
|
||||
/***************************************************************************
|
||||
* ICMPv6RRBody.cc -- The ICMPv6RRBody Class represents an ICMP version 6 *
|
||||
* Router Renumbering message body. It contains methods to set any header *
|
||||
* field. In general, these methods do error checkings and byte order *
|
||||
* conversions. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#ifndef ICMPv6HEADER_H
|
||||
#define ICMPv6HEADER_H 1
|
||||
|
||||
#include "NetworkLayerElement.h"
|
||||
|
||||
/* Packet header diagrams included in this file have been taken from the
|
||||
* following IETF RFC documents: RFC 2894 */
|
||||
|
||||
/* Nping ICMPv6RRBody Class internal definitions */
|
||||
#define ICMPv6_RR_MATCH_PREFIX_LEN 24
|
||||
#define ICMPv6_RR_USE_PREFIX_LEN 32
|
||||
#define ICMPv6_RR_RESULT_MSG_LEN 24
|
||||
/* This must the MAX() of all values defined above*/
|
||||
#define ICMPv6_RR_MAX_LENGTH (ICMPv6_RR_USE_PREFIX_LEN)
|
||||
#define ICMPv6_RR_MIN_LENGTH (ICMPv6_RR_MATCH_PREFIX_LEN)
|
||||
|
||||
|
||||
class ICMPv6RRBody : public NetworkLayerElement {
|
||||
|
||||
private:
|
||||
|
||||
/**********************************************************************/
|
||||
/* COMMON ICMPv6 OPTION HEADER */
|
||||
/**********************************************************************/
|
||||
|
||||
struct nping_icmpv6_rr_body{
|
||||
u8 data[ICMPv6_RR_MAX_LENGTH];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct nping_icmpv6_rr_body nping_icmpv6_rr_body_t;
|
||||
|
||||
/**********************************************************************/
|
||||
/* ICMPv6 OPTION FORMATS */
|
||||
/**********************************************************************/
|
||||
|
||||
|
||||
/* Match-Prefix Part
|
||||
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| OpCode | OpLength | Ordinal | MatchLen |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| MinLen | MaxLen | reserved |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
+- -+
|
||||
| |
|
||||
+- MatchPrefix -+
|
||||
| |
|
||||
+- -+
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
*/
|
||||
struct rr_match_prefix{
|
||||
u8 op_code;
|
||||
u8 op_length;
|
||||
u8 ordinal;
|
||||
u8 match_length;
|
||||
u8 min_length;
|
||||
u8 max_length;
|
||||
u16 reserved;
|
||||
u8 match_prefix[16];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct rr_match_prefix rr_match_prefix_t;
|
||||
|
||||
|
||||
/* Use-Prefix Part
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| UseLen | KeepLen | FlagMask | RAFlags |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Valid Lifetime |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Preferred Lifetime |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|V|P| reserved |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
+- -+
|
||||
| |
|
||||
+- UsePrefix -+
|
||||
| |
|
||||
+- -+
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
*/
|
||||
struct rr_use_prefix{
|
||||
u8 use_len;
|
||||
u8 keep_len;
|
||||
u8 flag_mask;
|
||||
u8 ra_flags;
|
||||
u32 valid_lifetime;
|
||||
u32 preferred_lifetime;
|
||||
u8 flags;
|
||||
u8 reserved[3];
|
||||
u8 use_prefix[16];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct rr_use_prefix rr_use_prefix_t;
|
||||
|
||||
|
||||
/* Result Message
|
||||
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| reserved |B|F| Ordinal | MatchedLen |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| InterfaceIndex |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
+- -+
|
||||
| |
|
||||
+- MatchedPrefix -+
|
||||
| |
|
||||
+- -+
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
struct rr_result_msg{
|
||||
u8 reserved;
|
||||
u8 flags;
|
||||
u8 ordinal;
|
||||
u8 matched_length;
|
||||
u32 interface_index;
|
||||
u8 matched_prefix[16];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct rr_result_msg rr_result_msg_t;
|
||||
|
||||
nping_icmpv6_rr_body_t h;
|
||||
|
||||
rr_match_prefix_t *h_mp;
|
||||
rr_use_prefix_t *h_up;
|
||||
rr_result_msg_t *h_r;
|
||||
|
||||
public:
|
||||
ICMPv6RRBody();
|
||||
~ICMPv6RRBody();
|
||||
void reset();
|
||||
u8 *getBufferPointer();
|
||||
int storeRecvData(const u8 *buf, size_t len);
|
||||
|
||||
}; /* End of class ICMPv6RRBody */
|
||||
|
||||
#endif
|
||||
654
libnetutil/IPv4Header.cc
Normal file
654
libnetutil/IPv4Header.cc
Normal file
@@ -0,0 +1,654 @@
|
||||
|
||||
/***************************************************************************
|
||||
* IPv4Header.cc -- The IPv4Header Class represents an IPv4 datagram. It *
|
||||
* contains methods to set any header field. In general, these methods do *
|
||||
* error checkings and byte order conversion. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#include "IPv4Header.h"
|
||||
|
||||
/******************************************************************************/
|
||||
/* CONTRUCTORS, DESTRUCTORS AND INITIALIZATION METHODS */
|
||||
/******************************************************************************/
|
||||
IPv4Header::IPv4Header() {
|
||||
this->reset();
|
||||
} /* End of IPv4Header constructor */
|
||||
|
||||
|
||||
IPv4Header::~IPv4Header() {
|
||||
|
||||
} /* End of IPv4Header destructor */
|
||||
|
||||
|
||||
/** Sets every attribute to its default value */
|
||||
void IPv4Header::reset() {
|
||||
memset(&this->h, 0, sizeof(nping_ipv4_hdr_t));
|
||||
this->ipoptlen=0;
|
||||
this->length=20; /* Initial value 20. This will be incremented if options are used */
|
||||
this->setVersion();
|
||||
this->setHeaderLength();
|
||||
this->setTOS(IPv4_DEFAULT_TOS);
|
||||
this->setIdentification(IPv4_DEFAULT_ID);
|
||||
this->setTTL(IPv4_DEFAULT_TTL);
|
||||
this->setNextProto(IPv4_DEFAULT_PROTO);
|
||||
this->setTotalLength();
|
||||
} /* End of IPv4Header destructor */
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* PacketElement:: OVERWRITTEN METHODS */
|
||||
/******************************************************************************/
|
||||
|
||||
/** @warning This method is essential for the superclass getBinaryBuffer()
|
||||
* method to work. Do NOT change a thing unless you know what you're doing */
|
||||
u8 *IPv4Header::getBufferPointer(){
|
||||
return (u8*)(&h);
|
||||
} /* End of getBufferPointer() */
|
||||
|
||||
/** Stores supplied packet in the internal buffer so the information
|
||||
* can be accessed using the standard get & set methods.
|
||||
* @warning The IPv4Header class is able to hold a maximum of 60 bytes. If the
|
||||
* supplied buffer is longer than that, only the first 60 bytes will be stored
|
||||
* in the internal buffer.
|
||||
* @warning Supplied len MUST be at least 20 bytes (min IP header length).
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error */
|
||||
int IPv4Header::storeRecvData(const u8 *buf, size_t len){
|
||||
if(buf==NULL || len<IP_HEADER_LEN){
|
||||
return OP_FAILURE;
|
||||
}else{
|
||||
int stored_len = MIN((IP_HEADER_LEN + MAX_IP_OPTIONS_LEN), len);
|
||||
this->reset(); /* Re-init the object, just in case the caller had used it already */
|
||||
this->length=stored_len;
|
||||
memcpy(&(this->h), buf, stored_len);
|
||||
}
|
||||
return OP_SUCCESS;
|
||||
} /* End of storeRecvData() */
|
||||
|
||||
|
||||
/* Returns a protocol identifier. This is used by packet parsing funtions
|
||||
* that return linked lists of PacketElement objects, to determine the protocol
|
||||
* the object represents. */
|
||||
int IPv4Header::protocol_id() const {
|
||||
return HEADER_TYPE_IPv4;
|
||||
} /* End of protocol_id() */
|
||||
|
||||
|
||||
/** Performs some VERY BASIC checks that intend to validate the information
|
||||
* stored in the internal buffer, as a valid protocol header.
|
||||
* @warning If the information stored in the object has been set through a
|
||||
* call to storeRecvData(), the object's internal length count may be updated
|
||||
* if the validation is successful.
|
||||
* @return the length, in bytes, of the header, if its found to be valid or
|
||||
* OP_FAILURE (-1) otherwise. */
|
||||
int IPv4Header::validate(){
|
||||
if(this->getVersion()!=4)
|
||||
return OP_FAILURE;
|
||||
else if( this->getHeaderLength()<5)
|
||||
return OP_FAILURE;
|
||||
else if( this->getHeaderLength()*4 > this->length)
|
||||
return OP_FAILURE;
|
||||
this->length=this->getHeaderLength()*4;
|
||||
return this->length;
|
||||
} /* End of validate() */
|
||||
|
||||
|
||||
/** Prints the contents of the header and calls print() on the next protocol
|
||||
* header in the chain (if there is any).
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int IPv4Header::print(FILE *output, int detail) const {
|
||||
static char ipstring[256];
|
||||
memset(ipstring, 0, 256);
|
||||
struct in_addr addr;
|
||||
int frag_off = 8 * this->getFragOffset() & 8191; /* 2^13 - 1 */;
|
||||
char ipinfo[512] = ""; /* Temp info about IP. */
|
||||
char fragnfo[64] = ""; /* Temp info about fragmentation. */
|
||||
|
||||
fprintf(output, "IPv4[");
|
||||
|
||||
this->getSourceAddress(&addr);
|
||||
inet_ntop(AF_INET, &addr, ipstring, sizeof(ipstring));
|
||||
fprintf(output, "%s", ipstring);
|
||||
|
||||
fprintf(output, " >");
|
||||
|
||||
this->getDestinationAddress(&addr);
|
||||
inet_ntop(AF_INET, &addr, ipstring, sizeof(ipstring));
|
||||
fprintf(output, " %s", ipstring);
|
||||
|
||||
/* Is this a fragmented packet? is it the last fragment? */
|
||||
if (frag_off || this->getMF()) {
|
||||
Snprintf(fragnfo, sizeof(fragnfo), " frag offset=%d%s", frag_off, this->getMF() ? "+" : "");
|
||||
}
|
||||
|
||||
/* Create a string with information relevant to the specified level of detail */
|
||||
if( detail == PRINT_DETAIL_LOW ){
|
||||
Snprintf(ipinfo, sizeof(ipinfo), "ttl=%d id=%d iplen=%d%s%s%s%s",
|
||||
this->getTTL(), this->getIdentification(), this->getTotalLength(), fragnfo,
|
||||
this->getHeaderLength()==5?"":" ipopts={",
|
||||
this->getHeaderLength()?"":format_ip_options(this->h.options , MIN(this->getHeaderLength()*4, this->length-IP_HEADER_LEN)),
|
||||
this->getHeaderLength()?"":"}");
|
||||
}else if( detail == PRINT_DETAIL_MED ){
|
||||
Snprintf(ipinfo, sizeof(ipinfo), "ttl=%d id=%d proto=%d csum=0x%04X iplen=%d%s%s%s%s",
|
||||
this->getTTL(), this->getIdentification(),
|
||||
this->getNextProto(), this->getSum(),
|
||||
this->getTotalLength(), fragnfo,
|
||||
this->getHeaderLength()==5?"":" ipopts={",
|
||||
this->getHeaderLength()==5?"":format_ip_options(this->h.options , MIN(this->getHeaderLength()*4, this->length-IP_HEADER_LEN)),
|
||||
this->getHeaderLength()==5?"":"}");
|
||||
}else if( detail>=PRINT_DETAIL_HIGH ){
|
||||
Snprintf(ipinfo, sizeof(ipinfo), "ver=%d ihl=%d tos=0x%02x iplen=%d id=%d%s%s%s%s foff=%d%s ttl=%d proto=%d csum=0x%04X%s%s%s",
|
||||
this->getVersion(), this->getHeaderLength(),
|
||||
this->getTOS(), this->getTotalLength(),
|
||||
this->getIdentification(),
|
||||
(this->getRF() ||this->getDF()||this->getMF()) ? " flg=" : "",
|
||||
(this->getRF()) ? "x" : "",
|
||||
(this->getDF() )? "D" : "",
|
||||
(this->getMF() )? "M": "",
|
||||
frag_off, (this->getMF()) ? "+" : "",
|
||||
this->getTTL(), this->getNextProto(),
|
||||
this->getSum(),
|
||||
this->getHeaderLength()==5?"":" ipopts={",
|
||||
this->getHeaderLength()==5?"":format_ip_options(this->h.options , MIN(this->getHeaderLength()*4, this->length-IP_HEADER_LEN)),
|
||||
this->getHeaderLength()==5?"":"}");
|
||||
}
|
||||
|
||||
fprintf(output, " %s]", ipinfo);
|
||||
|
||||
if(this->next!=NULL){
|
||||
print_separator(output, detail);
|
||||
next->print(output, detail);
|
||||
}
|
||||
return OP_SUCCESS;
|
||||
} /* End of print() */
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* PROTOCOL-SPECIFIC METHODS */
|
||||
/******************************************************************************/
|
||||
|
||||
int IPv4Header::setVersion(){
|
||||
h.ip_v = 4;
|
||||
return 4;
|
||||
} /* End of setVersion() */
|
||||
|
||||
|
||||
u8 IPv4Header::getVersion() const {
|
||||
return (u8)h.ip_v;
|
||||
} /* End of getVersion() */
|
||||
|
||||
|
||||
int IPv4Header::setHeaderLength(){
|
||||
h.ip_hl = 5 + (ipoptlen/4);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setHeaderLength() */
|
||||
|
||||
|
||||
int IPv4Header::setHeaderLength(u8 l){
|
||||
h.ip_hl = l;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setHeaderLength() */
|
||||
|
||||
|
||||
u8 IPv4Header::getHeaderLength() const {
|
||||
return h.ip_hl;
|
||||
} /* End of getHeaderLength() */
|
||||
|
||||
|
||||
int IPv4Header::setTOS(u8 v){
|
||||
h.ip_tos = v;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setTOS() */
|
||||
|
||||
|
||||
u8 IPv4Header::getTOS() const {
|
||||
return h.ip_tos;
|
||||
} /* End of getTOS() */
|
||||
|
||||
|
||||
int IPv4Header::setTotalLength(){
|
||||
int mylen = 4*getHeaderLength();
|
||||
int otherslen=0;
|
||||
|
||||
if (next!=NULL)
|
||||
otherslen=next->getLen();
|
||||
h.ip_len=htons( mylen+otherslen );
|
||||
return OP_SUCCESS;
|
||||
} /* End of setTotalLength() */
|
||||
|
||||
|
||||
/** @warning Supplied value MUST be in host byte order because it will get
|
||||
* converted by this method using htons() */
|
||||
int IPv4Header::setTotalLength(u16 l){
|
||||
h.ip_len = htons(l);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setTotalLength() */
|
||||
|
||||
|
||||
/** @warning Returned value is already in host byte order. */
|
||||
u16 IPv4Header::getTotalLength() const {
|
||||
return ntohs(h.ip_len);
|
||||
} /* End of getTotalLength() */
|
||||
|
||||
|
||||
/** Sets identification field to a random value */
|
||||
int IPv4Header::setIdentification(){
|
||||
h.ip_id=get_random_u16();
|
||||
return OP_SUCCESS;
|
||||
} /* End of setIdentification() */
|
||||
|
||||
|
||||
/** @warning Supplied value MUST be in host byte order because it will get
|
||||
* converted by this method using htons() */
|
||||
int IPv4Header::setIdentification(u16 i){
|
||||
h.ip_id = htons(i);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setIdentification() */
|
||||
|
||||
|
||||
/** @warning Returned value is already in host byte order. */
|
||||
u16 IPv4Header::getIdentification() const {
|
||||
return ntohs(h.ip_id);
|
||||
} /* End of getIdentification() */
|
||||
|
||||
|
||||
/** Sets fragment offset field to a random value */
|
||||
int IPv4Header::setFragOffset(){
|
||||
/* TODO: Should we check here that i<8192 ? */
|
||||
h.ip_off=get_random_u16();
|
||||
return OP_SUCCESS;
|
||||
} /* End of setFragOffset() */
|
||||
|
||||
|
||||
/** @warning Supplied value MUST be in host byte order because it will get
|
||||
* converted by this method using htons() */
|
||||
int IPv4Header::setFragOffset(u16 i){
|
||||
/* TODO: Should we check here that i<8192 ? */
|
||||
h.ip_off = htons(i);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setFragOffset() */
|
||||
|
||||
|
||||
/** @warning Returned value is already in host byte order. */
|
||||
u16 IPv4Header::getFragOffset() const {
|
||||
return ntohs(h.ip_off);
|
||||
} /* End of getFragOffset() */
|
||||
|
||||
|
||||
/** Set RF flag */
|
||||
int IPv4Header::setRF(){
|
||||
h.ip_off |= htons(IP_RF);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setRF() */
|
||||
|
||||
/** Unset RF flag */
|
||||
int IPv4Header::unsetRF(){
|
||||
h.ip_off ^= htons(IP_RF);
|
||||
return OP_SUCCESS;
|
||||
} /* End of unsetRF() */
|
||||
|
||||
|
||||
/** Get RF flag */
|
||||
bool IPv4Header::getRF() const {
|
||||
return h.ip_off & htons(IP_RF);
|
||||
} /* End of getRF() */
|
||||
|
||||
|
||||
/** Set MF flag */
|
||||
int IPv4Header::setMF(){
|
||||
h.ip_off |= htons(IP_MF);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setMF() */
|
||||
|
||||
|
||||
/** Unset MF flag */
|
||||
int IPv4Header::unsetMF(){
|
||||
h.ip_off ^= htons(IP_MF);
|
||||
return OP_SUCCESS;
|
||||
} /* End of unsetMF() */
|
||||
|
||||
|
||||
/* Get MF flag */
|
||||
bool IPv4Header::getMF() const {
|
||||
return h.ip_off & htons(IP_MF);
|
||||
} /* End of getMF() */
|
||||
|
||||
|
||||
/** Set DF flag */
|
||||
int IPv4Header::setDF(){
|
||||
h.ip_off |= htons(IP_DF);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setDF() */
|
||||
|
||||
|
||||
/** Unset DF flag */
|
||||
int IPv4Header::unsetDF(){
|
||||
h.ip_off ^= htons(IP_DF);
|
||||
return OP_SUCCESS;
|
||||
} /* End of unsetDF() */
|
||||
|
||||
|
||||
/** Get DF flag */
|
||||
bool IPv4Header::getDF() const {
|
||||
return h.ip_off & htons(IP_DF);
|
||||
} /* End of getDF) */
|
||||
|
||||
|
||||
/** Sets TTL field to a random value */
|
||||
int IPv4Header::setTTL(){
|
||||
h.ip_ttl=get_random_u8();
|
||||
return OP_SUCCESS;
|
||||
} /* End of setTTL() */
|
||||
|
||||
|
||||
/** @warning Supplied value MUST be in host byte order because it will get
|
||||
* converted by this method using htons() */
|
||||
int IPv4Header::setTTL(u8 t){
|
||||
h.ip_ttl = t;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setTTL() */
|
||||
|
||||
|
||||
/** @warning Returned value is already in host byte order. */
|
||||
u8 IPv4Header::getTTL() const {
|
||||
return h.ip_ttl;
|
||||
} /* End of getTTL() */
|
||||
|
||||
|
||||
/** Sets field "next protocol" to the supplied value.
|
||||
* @warning: No error checks are made. Make sure the supplied value
|
||||
* corresponds to an actual IANA number. Check
|
||||
* http://www.iana.org/assignments/protocol-numbers/ for more details. */
|
||||
int IPv4Header::setNextProto(u8 p){
|
||||
h.ip_p = p;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setNextProto() */
|
||||
|
||||
|
||||
/** Sets field "next protocol" to the number that corresponds to the supplied
|
||||
* protocol name. Currently onyl TCP, UDP and ICMP are supported. Any
|
||||
* help to extend this functionality would be appreciated. For a list of all
|
||||
* proto names and numbers check:
|
||||
* http://www.iana.org/assignments/protocol-numbers/ */
|
||||
int IPv4Header::setNextProto(const char *p){
|
||||
if (p==NULL){
|
||||
printf("setNextProto(): NULL pointer supplied\n");
|
||||
return OP_FAILURE;
|
||||
}
|
||||
if( !strcasecmp(p, "TCP") )
|
||||
h.ip_p=6; /* 6=IANA number for proto TCP */
|
||||
|
||||
else if( !strcasecmp(p, "UDP") )
|
||||
h.ip_p=17; /* 17=IANA number for proto UDP */
|
||||
|
||||
else if( !strcasecmp(p, "ICMP") )
|
||||
h.ip_p=1; /* 1=IANA number for proto ICMP */
|
||||
else{
|
||||
printf("setNextProto(): Invalid protocol number\n");
|
||||
return OP_FAILURE;
|
||||
}
|
||||
return OP_SUCCESS;
|
||||
} /* End of setNextProto() */
|
||||
|
||||
|
||||
/** Returns next protocol number */
|
||||
u8 IPv4Header::getNextProto() const {
|
||||
return h.ip_p;
|
||||
} /* End of getNextProto() */
|
||||
|
||||
|
||||
u8 IPv4Header::getNextHeader() const {
|
||||
return this->getNextProto();
|
||||
} /* End of getNextHeader() */
|
||||
|
||||
|
||||
int IPv4Header::setNextHeader(u8 val){
|
||||
return this->setNextProto(val);
|
||||
} /* End of setNextHeader() */
|
||||
|
||||
|
||||
/** Computes the IPv4 header checksum and sets the ip_sum field to the right
|
||||
* value. */
|
||||
int IPv4Header::setSum(){
|
||||
h.ip_sum = 0;
|
||||
/* ip_checksum() comes from libdnet */
|
||||
ip_checksum((void*)&h, 20 + ipoptlen );
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSum() */
|
||||
|
||||
|
||||
/** @warning Sum is set to supplied value with NO byte ordering conversion
|
||||
* performed.
|
||||
* @warning If sum is supplied this way, no error checks are made. Caller is
|
||||
* responsible for the correctness of the value. */
|
||||
int IPv4Header::setSum(u16 s){
|
||||
h.ip_sum = s;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSum() */
|
||||
|
||||
|
||||
/** Set the checksum field to a random value */
|
||||
int IPv4Header::setSumRandom(){
|
||||
h.ip_sum=get_random_u16();
|
||||
return OP_SUCCESS;
|
||||
} /* End of setRandomSum() */
|
||||
|
||||
|
||||
/** Returns the value of the checksum field.
|
||||
* @warning The returned value is in NETWORK byte order, no conversion is
|
||||
* performed */
|
||||
u16 IPv4Header::getSum() const {
|
||||
return h.ip_sum;
|
||||
} /* End of getSum() */
|
||||
|
||||
|
||||
/** Sets destination IP address.
|
||||
* @warning Destination IP must be supplied in NETWORK byte order. Usually
|
||||
* all regular library functions return IPs in network byte order so there
|
||||
* should be no need to worry. */
|
||||
int IPv4Header::setDestinationAddress(u32 d){
|
||||
h.ip_dst.s_addr = d;
|
||||
return OP_SUCCESS;
|
||||
} /* End of getDestinationAddress() */
|
||||
|
||||
/** Sets destination IP address.
|
||||
* @warning Destination IP must be supplied in NETWORK byte order. Usually
|
||||
* all regular library functions return IPs in network byte order so there
|
||||
* should be no need to worry. */
|
||||
int IPv4Header::setDestinationAddress(struct in_addr d){
|
||||
h.ip_dst=d;
|
||||
return OP_SUCCESS;
|
||||
} /* End of getDestinationAddress() */
|
||||
|
||||
|
||||
/** Returns destination IP address.
|
||||
* @warning Returned value is in NETWORK byte order. */
|
||||
const u8 *IPv4Header::getDestinationAddress() const {
|
||||
return (u8 *)(&h.ip_dst.s_addr);
|
||||
} /* End of getDestinationAddress() */
|
||||
|
||||
|
||||
/** Returns destination IP address.
|
||||
* @warning Returned value is in NETWORK byte order. */
|
||||
struct in_addr IPv4Header::getDestinationAddress(struct in_addr *result) const {
|
||||
if(result!=NULL)
|
||||
*result=this->h.ip_dst;
|
||||
return h.ip_dst;
|
||||
} /* End of getDestinationAddress() */
|
||||
|
||||
|
||||
/** Sets source IP address.
|
||||
* @warning Destination IP must be supplied in NETWORK byte order. Usually
|
||||
* all regular library functions return IPs in network byte order so there
|
||||
* should be no need to worry. */
|
||||
int IPv4Header::setSourceAddress(u32 d){
|
||||
h.ip_src.s_addr = d;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSourceAddress() */
|
||||
|
||||
|
||||
/** Sets source IP address.
|
||||
* @warning Destination IP must be supplied in NETWORK byte order. Usually
|
||||
* all regular library functions return IPs in network byte order so there
|
||||
* should be no need to worry. */
|
||||
int IPv4Header::setSourceAddress(struct in_addr d){
|
||||
h.ip_src=d;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSourceAddress() */
|
||||
|
||||
|
||||
/** Returns source ip
|
||||
* @warning Returned value is in NETWORK byte order. */
|
||||
const u8 *IPv4Header::getSourceAddress() const {
|
||||
return (u8 *)(&h.ip_src.s_addr);
|
||||
} /* End of getSourceAddress() */
|
||||
|
||||
|
||||
/** Returns source ip
|
||||
* @warning Returned value is in NETWORK byte order. */
|
||||
struct in_addr IPv4Header::getSourceAddress(struct in_addr *result) const {
|
||||
if(result!=NULL)
|
||||
*result=this->h.ip_src;
|
||||
return h.ip_src;
|
||||
} /* End of getSourceAddress() */
|
||||
|
||||
|
||||
/** Returns the length of an IPv4 address. */
|
||||
u16 IPv4Header::getAddressLength() const {
|
||||
return 4;
|
||||
} /* End of getAddressLength()*/
|
||||
|
||||
|
||||
int IPv4Header::setOpts(const char *txt){
|
||||
int foo=0;
|
||||
int bar=0;
|
||||
int ret=0;
|
||||
u8 buffer[128];
|
||||
char errstr[256];
|
||||
|
||||
if(txt==NULL){
|
||||
printf("setOpts(): NULL pointer supplied.\n");
|
||||
return OP_FAILURE;
|
||||
}
|
||||
|
||||
/* Parse IP options */
|
||||
if((ret=parse_ip_options(txt, buffer, 128, &foo, &bar, errstr, sizeof(errstr)))==OP_FAILURE){
|
||||
printf("%s\n", errstr);
|
||||
return OP_FAILURE;
|
||||
}else{
|
||||
/* Copy options to our IP header */
|
||||
memcpy(h.options, buffer, ret);
|
||||
this->ipoptlen=ret;
|
||||
this->length += ret;
|
||||
this->setHeaderLength();
|
||||
}
|
||||
return OP_SUCCESS;
|
||||
} /* End of setOpts() */
|
||||
|
||||
|
||||
const u8 *IPv4Header::getOpts() const {
|
||||
return h.options;
|
||||
} /* End of getOpts() */
|
||||
|
||||
|
||||
const u8 *IPv4Header::getOpts(int *len) const {
|
||||
if(len==NULL)
|
||||
printf("getOpts(): NULL pointer supplied.\n");
|
||||
*len=ipoptlen;
|
||||
return h.options;
|
||||
} /* End of getOpts() */
|
||||
|
||||
|
||||
int IPv4Header::printOptions() const {
|
||||
char *p=format_ip_options(this->h.options, this->ipoptlen);
|
||||
printf("%s", p);
|
||||
return OP_SUCCESS;
|
||||
} /* End of printOptions() */
|
||||
|
||||
const char *IPv4Header::getOptionsString() const {
|
||||
return format_ip_options(this->h.options, this->ipoptlen);
|
||||
} /* End of getOptionsString() */
|
||||
250
libnetutil/IPv4Header.h
Normal file
250
libnetutil/IPv4Header.h
Normal file
@@ -0,0 +1,250 @@
|
||||
|
||||
/***************************************************************************
|
||||
* IPv4Header.h -- The IPv4Header Class represents an IPv4 datagram. It *
|
||||
* contains methods to set any header field. In general, these methods do *
|
||||
* error checkings and byte order conversion. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#ifndef IPV4HEADER_H
|
||||
#define IPV4HEADER_H 1
|
||||
|
||||
#include "NetworkLayerElement.h"
|
||||
|
||||
#define IP_RF 0x8000 /* Reserved fragment flag */
|
||||
#define IP_DF 0x4000 /* Dont fragment flag */
|
||||
#define IP_MF 0x2000 /* More fragments flag */
|
||||
#define IP_OFFMASK 0x1fff /* Mask for fragmenting bits */
|
||||
#define IP_HEADER_LEN 20 /* Length of the standard header */
|
||||
#define MAX_IP_OPTIONS_LEN 40 /* Max Length for IP Options */
|
||||
|
||||
/* Default header values */
|
||||
#define IPv4_DEFAULT_TOS 0
|
||||
#define IPv4_DEFAULT_ID 0
|
||||
#define IPv4_DEFAULT_TTL 64
|
||||
#define IPv4_DEFAULT_PROTO 6 /* TCP */
|
||||
|
||||
class IPv4Header : public NetworkLayerElement {
|
||||
|
||||
private:
|
||||
/*
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|Version| IHL |Type of Service| Total Length |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Identification |Flags| Fragment Offset |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Time to Live | Protocol | Header Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Source Address |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Destination Address |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Options | Padding |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
*/
|
||||
struct nping_ipv4_hdr {
|
||||
#if WORDS_BIGENDIAN
|
||||
u8 ip_v:4; /* Version */
|
||||
u8 ip_hl:4; /* Header length */
|
||||
#else
|
||||
u8 ip_hl:4; /* Header length */
|
||||
u8 ip_v:4; /* Version */
|
||||
#endif
|
||||
u8 ip_tos; /* Type of service */
|
||||
u16 ip_len; /* Total length */
|
||||
u16 ip_id; /* Identification */
|
||||
u16 ip_off; /* Fragment offset field */
|
||||
u8 ip_ttl; /* Time to live */
|
||||
u8 ip_p; /* Protocol */
|
||||
u16 ip_sum; /* Checksum */
|
||||
struct in_addr ip_src; /* Source IP address */
|
||||
struct in_addr ip_dst; /* Destination IP address */
|
||||
u8 options[MAX_IP_OPTIONS_LEN]; /* IP Options */
|
||||
}__attribute__((__packed__));
|
||||
|
||||
typedef struct nping_ipv4_hdr nping_ipv4_hdr_t;
|
||||
|
||||
nping_ipv4_hdr_t h;
|
||||
|
||||
int ipoptlen; /**< Length of IP options */
|
||||
|
||||
public:
|
||||
|
||||
/* Misc */
|
||||
IPv4Header();
|
||||
~IPv4Header();
|
||||
void reset();
|
||||
u8 *getBufferPointer();
|
||||
int storeRecvData(const u8 *buf, size_t len);
|
||||
int protocol_id() const;
|
||||
int validate();
|
||||
int print(FILE *output, int detail) const;
|
||||
|
||||
/* IP version */
|
||||
int setVersion();
|
||||
u8 getVersion() const;
|
||||
|
||||
/* Header Length */
|
||||
int setHeaderLength();
|
||||
int setHeaderLength(u8 l);
|
||||
u8 getHeaderLength() const;
|
||||
|
||||
/* Type of Service */
|
||||
int setTOS(u8 v);
|
||||
u8 getTOS() const;
|
||||
|
||||
/* Total lenght of the datagram */
|
||||
int setTotalLength();
|
||||
int setTotalLength(u16 l);
|
||||
u16 getTotalLength() const;
|
||||
|
||||
/* Identification value */
|
||||
int setIdentification();
|
||||
int setIdentification(u16 i);
|
||||
u16 getIdentification() const;
|
||||
|
||||
/* Fragment Offset */
|
||||
int setFragOffset();
|
||||
int setFragOffset(u16 f);
|
||||
u16 getFragOffset() const;
|
||||
|
||||
/* Flags */
|
||||
int setRF();
|
||||
int unsetRF();
|
||||
bool getRF() const;
|
||||
int setDF();
|
||||
int unsetDF();
|
||||
bool getDF() const;
|
||||
int setMF();
|
||||
int unsetMF();
|
||||
bool getMF() const;
|
||||
|
||||
/* Time to live */
|
||||
int setTTL();
|
||||
int setTTL(u8 t);
|
||||
u8 getTTL() const;
|
||||
|
||||
/* Next protocol */
|
||||
int setNextProto(u8 p);
|
||||
int setNextProto(const char *p);
|
||||
u8 getNextProto() const;
|
||||
int setNextHeader(u8 val);
|
||||
u8 getNextHeader() const;
|
||||
|
||||
/* Checksum */
|
||||
int setSum();
|
||||
int setSum(u16 s);
|
||||
int setSumRandom();
|
||||
u16 getSum() const;
|
||||
|
||||
/* Destination IP */
|
||||
int setDestinationAddress(u32 d);
|
||||
int setDestinationAddress(struct in_addr d);
|
||||
const u8 *getDestinationAddress() const;
|
||||
struct in_addr getDestinationAddress(struct in_addr *result) const;
|
||||
|
||||
|
||||
/* Source IP */
|
||||
int setSourceAddress(u32 d);
|
||||
int setSourceAddress(struct in_addr d);
|
||||
const u8 *getSourceAddress() const;
|
||||
struct in_addr getSourceAddress(struct in_addr *result) const;
|
||||
|
||||
u16 getAddressLength() const;
|
||||
|
||||
/* IP Options */
|
||||
int setOpts(const char *txt);
|
||||
const u8 *getOpts() const;
|
||||
const u8 *getOpts(int *len) const;
|
||||
int printOptions() const;
|
||||
const char *getOptionsString() const;
|
||||
|
||||
}; /* End of class IPv4Header */
|
||||
|
||||
#endif
|
||||
112
libnetutil/IPv6ExtensionHeader.h
Normal file
112
libnetutil/IPv6ExtensionHeader.h
Normal file
@@ -0,0 +1,112 @@
|
||||
|
||||
/***************************************************************************
|
||||
* IPv6ExtensionHeader.h -- The IPv6ExtensionHeader class represents *
|
||||
* a generic class for IPv6 extension headers. Specific headers (like *
|
||||
* Hop-by-Hop or Routing) inherit from this class. *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#ifndef __IPv6_EXTENSION_HEADER_H__
|
||||
#define __IPv6_EXTENSION_HEADER_H__ 1
|
||||
|
||||
#include "PacketElement.h"
|
||||
|
||||
/* Extension header option codes */
|
||||
#define EXTOPT_PAD1 0x00 /* Pad1 (RFC 2460) */
|
||||
#define EXTOPT_PADN 0x01 /* PadN (RFC 2460) */
|
||||
#define EXTOPT_JUMBO 0xC2 /* Jumbo Payload (RFC 2675) */
|
||||
#define EXTOPT_TUNENCAPLIM 0x04 /* Tunnel Encapsulation Limit (RFC 2473) */
|
||||
#define EXTOPT_ROUTERALERT 0x05 /* Router Alert (RFC 2711) */
|
||||
#define EXTOPT_QUICKSTART 0x26 /* Quick-Start (RFC 4782) */
|
||||
#define EXTOPT_CALIPSO 0x07 /* CALIPSO (RFC 5570) */
|
||||
#define EXTOPT_HOMEADDR 0xC9 /* Home Address (RFC 6275) */
|
||||
|
||||
class IPv6ExtensionHeader : public PacketElement {
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
511
libnetutil/IPv6Header.cc
Executable file
511
libnetutil/IPv6Header.cc
Executable file
@@ -0,0 +1,511 @@
|
||||
|
||||
/***************************************************************************
|
||||
* IPv6Header.cc -- The IPv6Header Class represents an IPv4 datagram. It *
|
||||
* contains methods to set any header field. In general, these methods do *
|
||||
* error checkings and byte order conversion. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#include "IPv6Header.h"
|
||||
|
||||
/******************************************************************************/
|
||||
/* CONTRUCTORS, DESTRUCTORS AND INITIALIZATION METHODS */
|
||||
/******************************************************************************/
|
||||
IPv6Header::IPv6Header() {
|
||||
this->reset();
|
||||
} /* End of IPv6Header constructor */
|
||||
|
||||
|
||||
IPv6Header::~IPv6Header() {
|
||||
|
||||
} /* End of IPv6Header destructor */
|
||||
|
||||
|
||||
/** Sets every attribute to its default value */
|
||||
void IPv6Header::reset(){
|
||||
memset(&this->h, 0, sizeof(nping_ipv6_hdr_t));
|
||||
this->length=IPv6_HEADER_LEN;
|
||||
this->setVersion();
|
||||
this->setTrafficClass(IPv6_DEFAULT_TCLASS);
|
||||
this->setFlowLabel(IPv6_DEFAULT_FLABEL);
|
||||
this->setHopLimit(IPv6_DEFAULT_HOPLIM);
|
||||
this->setNextHeader(IPv6_DEFAULT_NXTHDR); /* No next header */
|
||||
this->setPayloadLength(0);
|
||||
} /* End of reset() */
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* PacketElement:: OVERWRITTEN METHODS */
|
||||
/******************************************************************************/
|
||||
|
||||
/** @warning This method is essential for the superclass getBinaryBuffer()
|
||||
* method to work. Do NOT change a thing unless you know what you're doing */
|
||||
u8 *IPv6Header::getBufferPointer(){
|
||||
return (u8*)(&h);
|
||||
} /* End of getBufferPointer() */
|
||||
|
||||
|
||||
/** Stores supplied packet in the internal buffer so the information
|
||||
* can be accessed using the standard get & set methods.
|
||||
* @warning The IPv6Header class is able to hold a maximum of 40 bytes. If the
|
||||
* supplied buffer is longer than that, only the first 40 bytes will be stored
|
||||
* in the internal buffer.
|
||||
* @warning Supplied len MUST be at least 40 bytes (IPv6 header length).
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error */
|
||||
int IPv6Header::storeRecvData(const u8 *buf, size_t len){
|
||||
if(buf==NULL || len<IPv6_HEADER_LEN){
|
||||
return OP_FAILURE;
|
||||
}else{
|
||||
this->reset(); /* Re-init the object, just in case the caller had used it already */
|
||||
this->length=IPv6_HEADER_LEN;
|
||||
memcpy(&(this->h), buf, IPv6_HEADER_LEN);
|
||||
}
|
||||
return OP_SUCCESS;
|
||||
} /* End of storeRecvData() */
|
||||
|
||||
|
||||
/* Returns a protocol identifier. This is used by packet parsing funtions
|
||||
* that return linked lists of PacketElement objects, to determine the protocol
|
||||
* the object represents. */
|
||||
int IPv6Header::protocol_id() const {
|
||||
return HEADER_TYPE_IPv6;
|
||||
} /* End of protocol_id() */
|
||||
|
||||
|
||||
/** Determines if the data stored in the object after an storeRecvData() call
|
||||
* is valid and safe to use. This mainly checks the length of the data but may
|
||||
* also test the value of certain protocol fields to ensure their correctness.
|
||||
* @return the length, in bytes, of the header, if its found to be valid or
|
||||
* OP_FAILURE (-1) otherwise. */
|
||||
int IPv6Header::validate(){
|
||||
if( this->length!=IPv6_HEADER_LEN)
|
||||
return OP_FAILURE;
|
||||
else
|
||||
return IPv6_HEADER_LEN;
|
||||
} /* End of validate() */
|
||||
|
||||
|
||||
/** Prints the contents of the header and calls print() on the next protocol
|
||||
* header in the chain (if there is any).
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int IPv6Header::print(FILE *output, int detail) const {
|
||||
fprintf(output, "IPv6[]");
|
||||
if(this->next!=NULL){
|
||||
print_separator(output, detail);
|
||||
next->print(output, detail);
|
||||
}
|
||||
return OP_SUCCESS;
|
||||
} /* End of print() */
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* PROTOCOL-SPECIFIC METHODS */
|
||||
/******************************************************************************/
|
||||
|
||||
/** Set Version field (4 bits). */
|
||||
int IPv6Header::setVersion(u8 val){
|
||||
union{
|
||||
struct firstbyte{
|
||||
#if WORDS_BIGENDIAN
|
||||
u8 ver:4;
|
||||
u8 tclass:4;
|
||||
#else
|
||||
u8 tclass:4;
|
||||
u8 ver:4;
|
||||
#endif
|
||||
}halfbyte;
|
||||
u8 fullbyte;
|
||||
}header1stbyte;
|
||||
|
||||
header1stbyte.fullbyte = h.ip6_start[0];
|
||||
header1stbyte.halfbyte.ver=val;
|
||||
h.ip6_start[0]=header1stbyte.fullbyte;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setVersion() */
|
||||
|
||||
|
||||
/** Set Version field to value 6. */
|
||||
int IPv6Header::setVersion(){
|
||||
this->setVersion(6);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setVersion() */
|
||||
|
||||
|
||||
/** Returns an 8bit number containing the value of the Version field. */
|
||||
u8 IPv6Header::getVersion() const {
|
||||
union{
|
||||
struct firstbyte{
|
||||
#if WORDS_BIGENDIAN
|
||||
u8 ver:4;
|
||||
u8 tclass:4;
|
||||
#else
|
||||
u8 tclass:4;
|
||||
u8 ver:4;
|
||||
#endif
|
||||
}halfbyte;
|
||||
u8 fullbyte;
|
||||
}header1stbyte;
|
||||
|
||||
header1stbyte.fullbyte = h.ip6_start[0];
|
||||
return (u8)header1stbyte.halfbyte.ver;
|
||||
} /* End of getVersion() */
|
||||
|
||||
|
||||
int IPv6Header::setTrafficClass(u8 val){
|
||||
union{
|
||||
struct firstbyte{
|
||||
#if WORDS_BIGENDIAN
|
||||
u8 ver:4;
|
||||
u8 tclass1:4;
|
||||
#else
|
||||
u8 tclass1:4;
|
||||
u8 ver:4;
|
||||
#endif
|
||||
}halfbyte;
|
||||
u8 fullbyte;
|
||||
}header1stbyte;
|
||||
union{
|
||||
struct firstbyte{
|
||||
#if WORDS_BIGENDIAN
|
||||
u8 tclass2:4;
|
||||
u8 flow:4;
|
||||
#else
|
||||
u8 flow:4;
|
||||
u8 tclass2:4;
|
||||
#endif
|
||||
}halfbyte;
|
||||
u8 fullbyte;
|
||||
}header2ndbyte;
|
||||
|
||||
/* Store old contents */
|
||||
header1stbyte.fullbyte = h.ip6_start[0];
|
||||
header2ndbyte.fullbyte = h.ip6_start[1];
|
||||
|
||||
/* Fill the two 4bit halves */
|
||||
header1stbyte.halfbyte.tclass1=val>>4;
|
||||
header2ndbyte.halfbyte.tclass2=val;
|
||||
|
||||
/* Write the bytes back to the header */
|
||||
h.ip6_start[0]=header1stbyte.fullbyte;
|
||||
h.ip6_start[1]=header2ndbyte.fullbyte;
|
||||
|
||||
return OP_SUCCESS;
|
||||
} /* End of setTrafficClass() */
|
||||
|
||||
|
||||
u8 IPv6Header::getTrafficClass() const {
|
||||
union{
|
||||
struct firstbyte{
|
||||
#if WORDS_BIGENDIAN
|
||||
u8 ver:4;
|
||||
u8 tclass1:4;
|
||||
#else
|
||||
u8 tclass1:4;
|
||||
u8 ver:4;
|
||||
#endif
|
||||
}halfbyte;
|
||||
u8 fullbyte;
|
||||
}header1stbyte;
|
||||
union{
|
||||
struct firstbyte{
|
||||
#if WORDS_BIGENDIAN
|
||||
u8 tclass2:4;
|
||||
u8 flow:4;
|
||||
#else
|
||||
u8 flow:4;
|
||||
u8 tclass2:4;
|
||||
#endif
|
||||
}halfbyte;
|
||||
u8 fullbyte;
|
||||
}header2ndbyte;
|
||||
union{
|
||||
struct firstbyte{
|
||||
#if WORDS_BIGENDIAN
|
||||
u8 tclass1:4;
|
||||
u8 tclass2:4;
|
||||
#else
|
||||
u8 tclass2:4;
|
||||
u8 tclass1:4;
|
||||
#endif
|
||||
}halfbyte;
|
||||
u8 fullbyte;
|
||||
}finalbyte;
|
||||
|
||||
header1stbyte.fullbyte = h.ip6_start[0];
|
||||
header2ndbyte.fullbyte = h.ip6_start[1];
|
||||
finalbyte.halfbyte.tclass1=header1stbyte.halfbyte.tclass1;
|
||||
finalbyte.halfbyte.tclass2=header2ndbyte.halfbyte.tclass2;
|
||||
return finalbyte.fullbyte;
|
||||
} /* End of getTrafficClass() */
|
||||
|
||||
|
||||
int IPv6Header::setFlowLabel(u32 val){
|
||||
u32 netbyte = htonl(val);
|
||||
u8 *pnt=(u8*)&netbyte;
|
||||
union{
|
||||
struct firstbyte{
|
||||
#if WORDS_BIGENDIAN
|
||||
u8 tclass2:4;
|
||||
u8 flow:4;
|
||||
#else
|
||||
u8 flow:4;
|
||||
u8 tclass2:4;
|
||||
#endif
|
||||
}halfbyte;
|
||||
u8 fullbyte;
|
||||
}header2ndbyte;
|
||||
|
||||
header2ndbyte.fullbyte = h.ip6_start[1];
|
||||
header2ndbyte.halfbyte.flow=pnt[1];
|
||||
h.ip6_start[1]=header2ndbyte.fullbyte;
|
||||
h.ip6_start[2]=pnt[2];
|
||||
h.ip6_start[3]=pnt[3];
|
||||
return OP_SUCCESS;
|
||||
} /* End of setFlowLabel() */
|
||||
|
||||
|
||||
u32 IPv6Header::getFlowLabel() const {
|
||||
u32 hostbyte=0;
|
||||
u8 *pnt=(u8*)&hostbyte;
|
||||
union{
|
||||
struct firstbyte{
|
||||
#if WORDS_BIGENDIAN
|
||||
u8 tclass2:4;
|
||||
u8 flow:4;
|
||||
#else
|
||||
u8 flow:4;
|
||||
u8 tclass2:4;
|
||||
#endif
|
||||
}halfbyte;
|
||||
u8 fullbyte;
|
||||
}header2ndbyte;
|
||||
|
||||
header2ndbyte.fullbyte = h.ip6_start[1];
|
||||
pnt[0]=0;
|
||||
pnt[1]=header2ndbyte.halfbyte.flow;
|
||||
pnt[2]=h.ip6_start[2];
|
||||
pnt[3]=h.ip6_start[3];
|
||||
hostbyte=ntohl(hostbyte);
|
||||
return hostbyte;
|
||||
} /* End of getFlowLabel() */
|
||||
|
||||
|
||||
int IPv6Header::setPayloadLength(u16 val){
|
||||
this->h.ip6_len = htons(val);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setPayloadLength() */
|
||||
|
||||
|
||||
int IPv6Header::setPayloadLength(){
|
||||
int otherslen=0;
|
||||
if (next!=NULL)
|
||||
otherslen=next->getLen();
|
||||
setPayloadLength( otherslen );
|
||||
return OP_SUCCESS;
|
||||
} /* End of setTotalLength() */
|
||||
|
||||
|
||||
u16 IPv6Header::getPayloadLength() const {
|
||||
return ntohs(this->h.ip6_len);
|
||||
} /* End of getPayloadLength() */
|
||||
|
||||
|
||||
int IPv6Header::setNextHeader(u8 val){
|
||||
this->h.ip6_nh = val;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setNextHeader() */
|
||||
|
||||
|
||||
u8 IPv6Header::getNextHeader() const {
|
||||
return this->h.ip6_nh;
|
||||
} /* End of getNextHeader() */
|
||||
|
||||
|
||||
/** Sets field "next header" to the number that corresponds to the supplied
|
||||
* protocol name. Currently onyl TCP, UDP and ICMP are supported. Any
|
||||
* help to extend this functionality would be appreciated. For a list of all
|
||||
* proto names and numbers check:
|
||||
* http://www.iana.org/assignments/protocol-numbers/ */
|
||||
int IPv6Header::setNextHeader(const char *p){
|
||||
|
||||
if (p==NULL){
|
||||
printf("setNextProto(): NULL pointer supplied\n");
|
||||
return OP_FAILURE;
|
||||
}
|
||||
if( !strcasecmp(p, "TCP") )
|
||||
setNextHeader(6); /* 6=IANA number for proto TCP */
|
||||
else if( !strcasecmp(p, "UDP") )
|
||||
setNextHeader(17); /* 17=IANA number for proto UDP */
|
||||
else if( !strcasecmp(p, "ICMPv6"))
|
||||
setNextHeader(58); /* 58=IANA number for proto ICMPv6 */
|
||||
else
|
||||
netutil_fatal("setNextProto(): Invalid protocol number\n");
|
||||
return OP_SUCCESS;
|
||||
} /* End of setNextHeader() */
|
||||
|
||||
|
||||
int IPv6Header::setHopLimit(u8 val){
|
||||
this->h.ip6_hopl = val;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setHopLimit() */
|
||||
|
||||
|
||||
u8 IPv6Header::getHopLimit() const {
|
||||
return this->h.ip6_hopl;
|
||||
} /* End of getHopLimit() */
|
||||
|
||||
|
||||
int IPv6Header::setSourceAddress(u8 *val){
|
||||
if(val==NULL)
|
||||
netutil_fatal("setSourceAddress(): NULL value supplied.");
|
||||
memcpy(this->h.ip6_src, val, 16);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSourceAddress() */
|
||||
|
||||
|
||||
int IPv6Header::setSourceAddress(struct in6_addr val){
|
||||
memcpy(this->h.ip6_src, val.s6_addr, 16);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSourceAddress() */
|
||||
|
||||
|
||||
const u8 *IPv6Header::getSourceAddress() const {
|
||||
return this->h.ip6_src;
|
||||
} /* End of getSourceAddress() */
|
||||
|
||||
|
||||
/** Returns source IPv6 address
|
||||
* @warning Returned value is in NETWORK byte order. */
|
||||
struct in6_addr IPv6Header::getSourceAddress(struct in6_addr *result) const {
|
||||
struct in6_addr myaddr;
|
||||
memset(&myaddr, 0, sizeof(myaddr));
|
||||
memcpy(myaddr.s6_addr, this->h.ip6_src, 16);
|
||||
|
||||
if(result!=NULL)
|
||||
*result=myaddr;
|
||||
return myaddr;
|
||||
} /* End of getSourceAddress() */
|
||||
|
||||
|
||||
int IPv6Header::setDestinationAddress(u8 *val){
|
||||
if(val==NULL)
|
||||
netutil_fatal("setDestinationAddress(): NULL value supplied.");
|
||||
memcpy(this->h.ip6_dst, val, 16);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setDestinationAddress() */
|
||||
|
||||
|
||||
int IPv6Header::setDestinationAddress(struct in6_addr val){
|
||||
memcpy(this->h.ip6_dst, val.s6_addr, 16);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setDestinationAddress() */
|
||||
|
||||
|
||||
/** Returns destination IPv6 address. */
|
||||
const u8 *IPv6Header::getDestinationAddress() const {
|
||||
return this->h.ip6_dst;
|
||||
} /* End of getDestinationAddress() */
|
||||
|
||||
|
||||
/** Returns destination IPv6 address
|
||||
* @warning Returned value is in NETWORK byte order. */
|
||||
struct in6_addr IPv6Header::getDestinationAddress(struct in6_addr *result) const {
|
||||
struct in6_addr myaddr;
|
||||
memset(&myaddr, 0, sizeof(myaddr));
|
||||
memcpy(myaddr.s6_addr, this->h.ip6_dst, 16);
|
||||
|
||||
if(result!=NULL)
|
||||
*result=myaddr;
|
||||
return myaddr;
|
||||
} /* End of getDestinationAddress() */
|
||||
|
||||
|
||||
/** Returns the length of an IPv4 address. */
|
||||
u16 IPv6Header::getAddressLength() const {
|
||||
return 16;
|
||||
} /* End of getAddressLength()*/
|
||||
|
||||
203
libnetutil/IPv6Header.h
Normal file
203
libnetutil/IPv6Header.h
Normal file
@@ -0,0 +1,203 @@
|
||||
|
||||
/***************************************************************************
|
||||
* IPv6Header.h -- The IPv6Header Class represents an IPv6 datagram. It *
|
||||
* contains methods to set any header field. In general, these methods do *
|
||||
* error checkings and byte order conversion. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#ifndef IPV6HEADER_H
|
||||
#define IPV6HEADER_H 1
|
||||
|
||||
#include "NetworkLayerElement.h"
|
||||
|
||||
#define IPv6_HEADER_LEN 40
|
||||
|
||||
/* Default header values */
|
||||
#define IPv6_DEFAULT_TCLASS 0
|
||||
#define IPv6_DEFAULT_FLABEL 0
|
||||
#define IPv6_DEFAULT_HOPLIM 64
|
||||
#define IPv6_DEFAULT_NXTHDR 6 /* TCP */
|
||||
|
||||
class IPv6Header : public NetworkLayerElement {
|
||||
|
||||
private:
|
||||
|
||||
/* IPv6 Header Format:
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|Version| Traffic Class | Flow Label |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Payload Length | Next Header | Hop Limit |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
+-- --+
|
||||
| |
|
||||
+-- Source Address --+
|
||||
| |
|
||||
+-- --+
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
+-- --+
|
||||
| |
|
||||
+-- Destination Address --+
|
||||
| |
|
||||
+-- --+
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
*/
|
||||
|
||||
struct nping_ipv6_hdr {
|
||||
u8 ip6_start[4]; /* Version, Traffic and Flow */
|
||||
u16 ip6_len; /* Payload length */
|
||||
u8 ip6_nh; /* Next Header */
|
||||
u8 ip6_hopl; /* Hop Limit */
|
||||
u8 ip6_src[16]; /* Source IP Address */
|
||||
u8 ip6_dst[16]; /* Destination IP Address */
|
||||
}__attribute__((__packed__));
|
||||
|
||||
typedef struct nping_ipv6_hdr nping_ipv6_hdr_t;
|
||||
|
||||
nping_ipv6_hdr_t h;
|
||||
|
||||
public:
|
||||
|
||||
/* Misc */
|
||||
IPv6Header();
|
||||
~IPv6Header();
|
||||
void reset();
|
||||
u8 *getBufferPointer();
|
||||
int storeRecvData(const u8 *buf, size_t len);
|
||||
int protocol_id() const;
|
||||
int validate();
|
||||
int print(FILE *output, int detail) const;
|
||||
|
||||
/* IP version */
|
||||
int setVersion();
|
||||
int setVersion(u8 val);
|
||||
u8 getVersion() const;
|
||||
|
||||
/* Traffic class */
|
||||
int setTrafficClass(u8 val);
|
||||
u8 getTrafficClass() const;
|
||||
|
||||
/* Flow Label */
|
||||
int setFlowLabel(u32 val);
|
||||
u32 getFlowLabel() const;
|
||||
|
||||
/* Payload Length */
|
||||
int setPayloadLength(u16 val);
|
||||
int setPayloadLength();
|
||||
u16 getPayloadLength() const;
|
||||
|
||||
/* Next Header */
|
||||
int setNextHeader(u8 val);
|
||||
int setNextHeader(const char *p);
|
||||
u8 getNextHeader() const;
|
||||
|
||||
/* Hop Limit */
|
||||
int setHopLimit(u8 val);
|
||||
u8 getHopLimit() const;
|
||||
|
||||
/* Source Address */
|
||||
int setSourceAddress(u8 *val);
|
||||
int setSourceAddress(struct in6_addr val);
|
||||
const u8 *getSourceAddress() const;
|
||||
struct in6_addr getSourceAddress(struct in6_addr *result) const;
|
||||
|
||||
/* Destination Address*/
|
||||
int setDestinationAddress(u8 *val);
|
||||
int setDestinationAddress(struct in6_addr val);
|
||||
const u8 *getDestinationAddress() const;
|
||||
struct in6_addr getDestinationAddress(struct in6_addr *result) const;
|
||||
|
||||
u16 getAddressLength() const;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -14,8 +14,8 @@ LIBPCAPDIR = @libpcapdir@
|
||||
|
||||
TARGET = libnetutil.a
|
||||
|
||||
SRCS = $(srcdir)/netutil.cc
|
||||
OBJS = netutil.o
|
||||
SRCS = $(srcdir)/netutil.cc $(srcdir)/PacketElement.cc $(srcdir)/NetworkLayerElement.cc $(srcdir)/ARPHeader.cc $(srcdir)/PacketElement.cc $(srcdir)/NetworkLayerElement.cc $(srcdir)/TransportLayerElement.cc $(srcdir)/ARPHeader.cc $(srcdir)/EthernetHeader.cc $(srcdir)/ICMPv4Header.cc $(srcdir)/ICMPv6Header.cc $(srcdir)/IPv4Header.cc $(srcdir)/IPv6Header.cc $(srcdir)/TCPHeader.cc $(srcdir)/UDPHeader.cc $(srcdir)/RawData.cc $(srcdir)/HopByHopHeader.cc $(srcdir)/DestOptsHeader.cc $(srcdir)/FragmentHeader.cc $(srcdir)/RoutingHeader.cc $(srcdir)/PacketParser.cc $(srcdir)/npacket.cc
|
||||
OBJS = netutil.o PacketElement.o NetworkLayerElement.o TransportLayerElement.o ARPHeader.o EthernetHeader.o ICMPv4Header.o ICMPv6Header.o IPv4Header.o IPv6Header.o TCPHeader.o UDPHeader.o RawData.o HopByHopHeader.o DestOptsHeader.o FragmentHeader.o RoutingHeader.o PacketParser.o npacket.o
|
||||
|
||||
all: $(TARGET)
|
||||
|
||||
|
||||
93
libnetutil/NetworkLayerElement.cc
Normal file
93
libnetutil/NetworkLayerElement.cc
Normal file
@@ -0,0 +1,93 @@
|
||||
|
||||
/***************************************************************************
|
||||
* NetworkLayerElement.cc -- Class NetworkLayerElement is a generic class *
|
||||
* that represents a network layer protocol header. Classes like IPv4Header*
|
||||
* or IPv6Header inherit from it. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#include "NetworkLayerElement.h"
|
||||
123
libnetutil/NetworkLayerElement.h
Normal file
123
libnetutil/NetworkLayerElement.h
Normal file
@@ -0,0 +1,123 @@
|
||||
|
||||
/***************************************************************************
|
||||
* NetworkLayerElement.h -- Class NetworkLayerElement is a generic class *
|
||||
* that represents a network layer protocol header. Classes like IPv4Header*
|
||||
* or IPv6Header inherit from it. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#ifndef NETWORKLAYERELEMENT_H
|
||||
#define NETWORKLAYERELEMENT_H 1
|
||||
|
||||
#include "PacketElement.h"
|
||||
|
||||
/// class NetworkLayerElement -
|
||||
class NetworkLayerElement : public PacketElement {
|
||||
|
||||
public:
|
||||
virtual u16 getAddressLength(){
|
||||
return 0;
|
||||
}
|
||||
|
||||
virtual u8 *getSourceAddress(){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
virtual u8 *getDestinationAddress(){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
virtual int setNextHeader(u8 val){
|
||||
return 0;
|
||||
}
|
||||
|
||||
virtual u8 getNextHeader(){
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
101
libnetutil/PacketElement.cc
Normal file
101
libnetutil/PacketElement.cc
Normal file
@@ -0,0 +1,101 @@
|
||||
|
||||
/***************************************************************************
|
||||
* PacketElement.cc -- The PacketElement Class is a generic class that *
|
||||
* represents a protocol header or a part of a network packet. Many other *
|
||||
* classes inherit from it (NetworkLayerElement, TransportLayerElement, *
|
||||
* etc). *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#include "PacketElement.h"
|
||||
|
||||
PacketElement::PacketElement(){
|
||||
next=NULL; /* It's very important these get initialized to NULL */
|
||||
prev=NULL;
|
||||
length=0;
|
||||
} /* End of PacketElement constructor */
|
||||
|
||||
299
libnetutil/PacketElement.h
Normal file
299
libnetutil/PacketElement.h
Normal file
@@ -0,0 +1,299 @@
|
||||
|
||||
/***************************************************************************
|
||||
* PacketElement.h -- The PacketElement Class is a generic class that *
|
||||
* represents a protocol header or a part of a network packet. Many other *
|
||||
* classes inherit from it (NetworkLayerElement, TransportLayerElement, *
|
||||
* etc). *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#ifndef PACKETELEMENT_H
|
||||
#define PACKETELEMENT_H 1
|
||||
|
||||
#include "nbase.h"
|
||||
#include "netutil.h"
|
||||
|
||||
#define HEADER_TYPE_IPv6_HOPOPT 0 /* IPv6 Hop-by-Hop Option */
|
||||
#define HEADER_TYPE_ICMPv4 1 /* ICMP Internet Control Message */
|
||||
#define HEADER_TYPE_IGMP 2 /* IGMP Internet Group Management */
|
||||
#define HEADER_TYPE_IPv4 4 /* IPv4 IPv4 encapsulation */
|
||||
#define HEADER_TYPE_TCP 6 /* TCP Transmission Control */
|
||||
#define HEADER_TYPE_EGP 8 /* EGP Exterior Gateway Protocol */
|
||||
#define HEADER_TYPE_UDP 17 /* UDP User Datagram */
|
||||
#define HEADER_TYPE_IPv6 41 /* IPv6 IPv6 encapsulation */
|
||||
#define HEADER_TYPE_IPv6_ROUTE 43 /* IPv6-Route Routing Header for IPv6 */
|
||||
#define HEADER_TYPE_IPv6_FRAG 44 /* IPv6-Frag Fragment Header for IPv6 */
|
||||
#define HEADER_TYPE_GRE 47 /* GRE General Routing Encapsulation */
|
||||
#define HEADER_TYPE_ESP 50 /* ESP Encap Security Payload */
|
||||
#define HEADER_TYPE_AH 51 /* AH Authentication Header */
|
||||
#define HEADER_TYPE_ICMPv6 58 /* IPv6-ICMP ICMP for IPv6 */
|
||||
#define HEADER_TYPE_IPv6_NONXT 59 /* IPv6-NoNxt No Next Header for IPv6 */
|
||||
#define HEADER_TYPE_IPv6_OPTS 60 /* IPv6-Opts IPv6 Destination Options */
|
||||
#define HEADER_TYPE_EIGRP 88 /* EIGRP */
|
||||
#define HEADER_TYPE_ETHERNET 97 /* Ethernet */
|
||||
#define HEADER_TYPE_L2TP 115 /* L2TP Layer Two Tunneling Protocol */
|
||||
#define HEADER_TYPE_SCTP 132 /* SCTP Stream Control Transmission P. */
|
||||
#define HEADER_TYPE_IPv6_MOBILE 135 /* Mobility Header */
|
||||
#define HEADER_TYPE_MPLS_IN_IP 137 /* MPLS-in-IP */
|
||||
#define HEADER_TYPE_ARP 2054 /* ARP Address Resolution Protocol */
|
||||
#define HEADER_TYPE_ICMPv6_OPTION 9997 /* ICMPv6 option */
|
||||
#define HEADER_TYPE_NEP 9998 /* Nping Echo Protocol */
|
||||
#define HEADER_TYPE_RAW_DATA 9999 /* Raw unknown data */
|
||||
|
||||
#define PRINT_DETAIL_LOW 1
|
||||
#define PRINT_DETAIL_MED 2
|
||||
#define PRINT_DETAIL_HIGH 3
|
||||
|
||||
#define DEFAULT_PRINT_DETAIL (PRINT_DETAIL_LOW)
|
||||
#define DEFAULT_PRINT_DESCRIPTOR stdout
|
||||
|
||||
class PacketElement {
|
||||
|
||||
protected:
|
||||
|
||||
int length;
|
||||
PacketElement *next; /**< Next PacketElement (next proto header) */
|
||||
PacketElement *prev; /**< Prev PacketElement (previous proto header) */
|
||||
|
||||
public:
|
||||
|
||||
PacketElement();
|
||||
|
||||
virtual ~PacketElement(){
|
||||
|
||||
} /* End of PacketElement destructor */
|
||||
|
||||
/** This function MUST be overwritten on ANY class that inherits from
|
||||
* this one. Otherwise getBinaryBuffer will fail */
|
||||
virtual u8 * getBufferPointer(){
|
||||
netutil_fatal("getBufferPointer(): Attempting to use superclass PacketElement method.\n");
|
||||
return NULL;
|
||||
} /* End of getBufferPointer() */
|
||||
|
||||
|
||||
/** Returns a buffer that contains the header of the packet + all the
|
||||
* lower level headers and payload. Returned buffer should be ok to be
|
||||
* passes to a send() call to be transferred trough a socket.
|
||||
* @return a pointer to a free()able buffer that contains packet's binary
|
||||
* data.
|
||||
* @warning If there are linked elements, their getBinaryBuffer() method
|
||||
* will be called recursively and the buffers that they return WILL be
|
||||
* free()d as soon as we copy the data in our own allocated buffer.
|
||||
* @warning Calls to this method may not ve very efficient since they
|
||||
* always involved a few malloc()s and free()s. If you want efficiency
|
||||
* use dumpToBinaryBuffer(); */
|
||||
virtual u8 * getBinaryBuffer(){
|
||||
u8 *ourbuff=NULL;
|
||||
u8 *othersbuff=NULL;
|
||||
u8 *totalbuff=NULL;
|
||||
long otherslen=0;
|
||||
|
||||
/* Get our own buffer address */
|
||||
if ( (ourbuff=getBufferPointer()) == NULL ){
|
||||
netutil_fatal("getBinaryBuffer(): Couldn't get own data pointer\n");
|
||||
}
|
||||
if( next != NULL ){ /* There is some other packet element */
|
||||
othersbuff = next->getBinaryBuffer();
|
||||
otherslen=next->getLen();
|
||||
totalbuff=(u8 *)safe_zalloc(otherslen + length);
|
||||
memcpy(totalbuff, ourbuff, length);
|
||||
memcpy(totalbuff+length, othersbuff, otherslen);
|
||||
free(othersbuff);
|
||||
}else{
|
||||
totalbuff=(u8 *)safe_zalloc(length);
|
||||
memcpy(totalbuff, ourbuff, length);
|
||||
}
|
||||
return totalbuff;
|
||||
} /* End of getBinaryBuffer() */
|
||||
|
||||
|
||||
virtual int dumpToBinaryBuffer(u8* dst, int maxlen){
|
||||
u8 *ourbuff=NULL;
|
||||
long ourlength=0;
|
||||
/* Get our own buffer address and length */
|
||||
if ( (ourbuff=getBufferPointer()) == NULL || (ourlength=this->length) < 0 )
|
||||
netutil_fatal("getBinaryBuffer(): Couldn't get own data pointer\n");
|
||||
/* Copy our part of the buffer */
|
||||
if ( maxlen < ourlength )
|
||||
netutil_fatal("getBinaryBuffer(): Packet exceeds maximum length %d\n", maxlen);
|
||||
memcpy( dst, ourbuff, ourlength);
|
||||
/* If there are more elements, tell them to copy their part */
|
||||
if( next!= NULL ){
|
||||
next->dumpToBinaryBuffer(dst+ourlength, maxlen-ourlength);
|
||||
}
|
||||
return this->getLen();
|
||||
} /* End of dumpToBinaryBuffer() */
|
||||
|
||||
|
||||
/** Does the same as the previous one but it stores the length of the
|
||||
* return buffer on the memory pointed by the supplied int pointer. */
|
||||
virtual u8 * getBinaryBuffer(int *len){
|
||||
u8 *buff = getBinaryBuffer();
|
||||
if( len != NULL )
|
||||
*len = getLen();
|
||||
return buff;
|
||||
} /* End of getBinaryBuffer() */
|
||||
|
||||
|
||||
/** Returns the lenght of this PacketElement + the length of all the
|
||||
* PacketElements that are next to it (are linked trough the "next"
|
||||
* attribute). So for example, if we have IPv4Header p1, linked to
|
||||
* a TCPHeader p2, representing a simple TCP SYN with no options,
|
||||
* a call to p1.getLen() will return 20 (IP header with no options) + 20
|
||||
* (TCP header with no options) = 40 bytes. */
|
||||
int getLen() const {
|
||||
/* If we have some other packet element linked, get its length */
|
||||
if (next!=NULL)
|
||||
return length + next->getLen();
|
||||
else
|
||||
return length;
|
||||
} /* End of getLen() */
|
||||
|
||||
|
||||
/** Returns the address of the next PacketElement that is linked to this */
|
||||
virtual PacketElement *getNextElement() const {
|
||||
return next;
|
||||
} /* End of getNextElement() */
|
||||
|
||||
|
||||
/** Links current object with the next header in the protocol chain. Note
|
||||
* that this method also links the next element with this one, calling
|
||||
* setPrevElement(). */
|
||||
virtual int setNextElement(PacketElement *n){
|
||||
next=n;
|
||||
if(next!=NULL)
|
||||
next->setPrevElement(this);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setNextElement() */
|
||||
|
||||
/** Sets attribute prev with the supplied pointer value.
|
||||
* @warning Supplied pointer must point to a PacketElement object or
|
||||
* an object that inherits from it. */
|
||||
virtual int setPrevElement(PacketElement *n){
|
||||
this->prev=n;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setPrevElement() */
|
||||
|
||||
|
||||
/** Returns the address of the previous PacketElement that is linked to
|
||||
* this one.
|
||||
* @warning In many cases this function will return NULL since there is
|
||||
* a high probability that the user of this class does not link
|
||||
* PacketElements in both directions. Normally one would set attribute
|
||||
* "next" of an IPHeader object to the TCPHeader that follows it, but
|
||||
* not the other way around. */
|
||||
virtual PacketElement *getPrevElement(){
|
||||
return prev;
|
||||
} /* End of getPrevElement() */
|
||||
|
||||
/** This method should be overwritten by any class that inherits from
|
||||
* PacketElement. It should print the object contents and then call
|
||||
* this->next->print(), providing this->next!=NULL */
|
||||
virtual int print(FILE *output, int detail) const {
|
||||
if(this->next!=NULL)
|
||||
this->next->print(output, detail);
|
||||
return OP_SUCCESS;
|
||||
} /* End of printf() */
|
||||
|
||||
virtual int print() const {
|
||||
return print(DEFAULT_PRINT_DESCRIPTOR, DEFAULT_PRINT_DETAIL);
|
||||
}
|
||||
|
||||
virtual int print(int detail) const {
|
||||
return print(DEFAULT_PRINT_DESCRIPTOR, detail);
|
||||
}
|
||||
|
||||
virtual void print_separator(FILE *output, int detail) const {
|
||||
fprintf(output, " ");
|
||||
}
|
||||
|
||||
/* Returns the type of protocol an object represents. This method MUST
|
||||
* be overwritten by all children. */
|
||||
virtual int protocol_id() const = 0;
|
||||
};
|
||||
|
||||
#endif
|
||||
1708
libnetutil/PacketParser.cc
Normal file
1708
libnetutil/PacketParser.cc
Normal file
File diff suppressed because it is too large
Load Diff
162
libnetutil/PacketParser.h
Normal file
162
libnetutil/PacketParser.h
Normal file
@@ -0,0 +1,162 @@
|
||||
|
||||
/***************************************************************************
|
||||
* PacketParser.h -- The PacketParser Class offers methods to parse *
|
||||
* received network packets. Its main purpose is to facilitate the *
|
||||
* conversion of raw sequences of bytes into chains of objects of the *
|
||||
* PacketElement family. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2010 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#ifndef __PACKETPARSER_H__
|
||||
#define __PACKETPARSER_H__ 1
|
||||
|
||||
#include "ApplicationLayerElement.h"
|
||||
#include "ARPHeader.h"
|
||||
#include "DataLinkLayerElement.h"
|
||||
#include "EthernetHeader.h"
|
||||
#include "ICMPHeader.h"
|
||||
#include "ICMPv4Header.h"
|
||||
#include "ICMPv6Header.h"
|
||||
#include "ICMPv6Option.h"
|
||||
#include "ICMPv6RRBody.h"
|
||||
#include "IPv4Header.h"
|
||||
#include "IPv6Header.h"
|
||||
#include "NetworkLayerElement.h"
|
||||
#include "PacketElement.h"
|
||||
#include "RawData.h"
|
||||
#include "TCPHeader.h"
|
||||
#include "TransportLayerElement.h"
|
||||
#include "UDPHeader.h"
|
||||
#include "HopByHopHeader.h"
|
||||
#include "DestOptsHeader.h"
|
||||
#include "FragmentHeader.h"
|
||||
#include "RoutingHeader.h"
|
||||
|
||||
|
||||
#define LINK_LAYER 2
|
||||
#define NETWORK_LAYER 3
|
||||
#define TRANSPORT_LAYER 4
|
||||
#define APPLICATION_LAYER 5
|
||||
#define EXTHEADERS_LAYER 6
|
||||
|
||||
typedef struct header_type_string{
|
||||
u32 type;
|
||||
const char *str;
|
||||
}header_type_string_t;
|
||||
|
||||
|
||||
typedef struct packet_type{
|
||||
u32 type;
|
||||
u32 length;
|
||||
}pkt_type_t;
|
||||
|
||||
|
||||
class PacketParser {
|
||||
|
||||
private:
|
||||
|
||||
public:
|
||||
|
||||
/* Misc */
|
||||
PacketParser();
|
||||
~PacketParser();
|
||||
void reset();
|
||||
|
||||
static const char *header_type2string(int val);
|
||||
static pkt_type_t *parse_packet(const u8 *pkt, size_t pktlen, bool eth_included);
|
||||
static int dummy_print_packet_type(const u8 *pkt, size_t pktlen, bool eth_included); /* TODO: remove */
|
||||
static int dummy_print_packet(const u8 *pkt, size_t pktlen, bool eth_included); /* TODO: remove */
|
||||
static int payload_offset(const u8 *pkt, size_t pktlen, bool link_included);
|
||||
static PacketElement *split(const u8 *pkt, size_t pktlen, bool eth_included);
|
||||
static PacketElement *split(const u8 *pkt, size_t pktlen);
|
||||
static int freePacketChain(PacketElement *first);
|
||||
static const char *test_packet_parser(PacketElement *test_pkt);
|
||||
static bool is_response(PacketElement *sent, PacketElement *rcvd);
|
||||
|
||||
}; /* End of class PacketParser */
|
||||
|
||||
#endif /* __PACKETPARSER_H__ */
|
||||
211
libnetutil/RawData.cc
Normal file
211
libnetutil/RawData.cc
Normal file
@@ -0,0 +1,211 @@
|
||||
|
||||
/***************************************************************************
|
||||
* RawData.cc -- The RawData Class represents a network packet payload. It *
|
||||
* is essentially a single buffer that may contain either random data or *
|
||||
* caller supplied data. This class can be used, for example, to be linked *
|
||||
* to a UDP datagram. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#include "RawData.h"
|
||||
|
||||
/******************************************************************************/
|
||||
/* CONTRUCTORS, DESTRUCTORS AND INITIALIZATION METHODS */
|
||||
/******************************************************************************/
|
||||
RawData::RawData(){
|
||||
this->reset();
|
||||
} /* End of RawData contructor */
|
||||
|
||||
|
||||
RawData::~RawData(){
|
||||
if(this->data!=NULL){
|
||||
free(this->data);
|
||||
this->data=NULL;
|
||||
}
|
||||
} /* End of RawData destructor */
|
||||
|
||||
|
||||
/** Sets every attribute to its default value */
|
||||
void RawData::reset(){
|
||||
this->data=NULL;
|
||||
this->length=0;
|
||||
} /* End of reset() */
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* PacketElement:: OVERWRITTEN METHODS */
|
||||
/******************************************************************************/
|
||||
|
||||
u8 * RawData::getBufferPointer(){
|
||||
return this->getBufferPointer(NULL);
|
||||
} /* End of getBufferPointer() */
|
||||
|
||||
|
||||
u8 * RawData::getBufferPointer(int *mylen){
|
||||
if(mylen!=NULL)
|
||||
*mylen=this->length;
|
||||
return this->data;
|
||||
} /* End of getBufferPointer() */
|
||||
|
||||
|
||||
/** Added for consistency with the rest of classes of the PacketElement family. */
|
||||
int RawData::storeRecvData(const u8 *buf, size_t len){
|
||||
return this->store(buf, len);
|
||||
} /* End of storeRecvData() */
|
||||
|
||||
|
||||
/* Returns a protocol identifier. This is used by packet parsing funtions
|
||||
* that return linked lists of PacketElement objects, to determine the protocol
|
||||
* the object represents. */
|
||||
int RawData::protocol_id() const {
|
||||
return HEADER_TYPE_RAW_DATA;
|
||||
} /* End of protocol_id() */
|
||||
|
||||
|
||||
/** Determines if the data stored in the object after an storeRecvData() call
|
||||
* is valid and safe to use. This mainly checks the length of the data but may
|
||||
* also test the value of certain protocol fields to ensure their correctness.
|
||||
* @return the length, in bytes, of the header, if its found to be valid or
|
||||
* OP_FAILURE (-1) otherwise. */
|
||||
int RawData::validate(){
|
||||
return this->length;
|
||||
} /* End of validate() */
|
||||
|
||||
|
||||
/** Prints the contents of the header and calls print() on the next protocol
|
||||
* header in the chain (if there is any).
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int RawData::print(FILE *output, int detail) const {
|
||||
|
||||
if(detail<=PRINT_DETAIL_MED){
|
||||
fprintf(output, "Data[");
|
||||
fprintf(output, "%d byte%s]", this->length, (this->length!=1)? "s":"");
|
||||
}else{
|
||||
// Print hex dump
|
||||
fprintf(output, "Data[--HEXDUMP-- %d byte%s]", this->length, (this->length!=1)? "s":"");
|
||||
// @todo UNIMPLEMENTED. I don't want to use libnetutil's print_hexdump()
|
||||
// here because it introduces dependencies.
|
||||
}
|
||||
if(this->next!=NULL){
|
||||
print_separator(output, detail);
|
||||
next->print(output, detail);
|
||||
}
|
||||
return OP_SUCCESS;
|
||||
} /* End of print() */
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* PROTOCOL-SPECIFIC METHODS */
|
||||
/******************************************************************************/
|
||||
|
||||
int RawData::store(const u8 *buf, size_t len){
|
||||
/* If buffer had already been set, try to reuse it. */
|
||||
if(this->data!=NULL){
|
||||
if( this->length >= (int)len ){
|
||||
memcpy(this->data, buf, len);
|
||||
this->length=(int)len;
|
||||
return OP_SUCCESS;
|
||||
}else{
|
||||
free(this->data);
|
||||
}
|
||||
}
|
||||
if( (this->data=(u8 *)calloc(len, sizeof(u8)))==NULL )
|
||||
return OP_FAILURE;
|
||||
memcpy(this->data, buf, len);
|
||||
this->length=(int)len;
|
||||
return OP_SUCCESS;
|
||||
} /* End of store() */
|
||||
|
||||
|
||||
int RawData::store(const char *str){
|
||||
if(str==NULL)
|
||||
return OP_FAILURE;
|
||||
else
|
||||
return this->store((const u8*)str, strlen(str));
|
||||
} /* End of store() */
|
||||
|
||||
|
||||
121
libnetutil/RawData.h
Normal file
121
libnetutil/RawData.h
Normal file
@@ -0,0 +1,121 @@
|
||||
|
||||
/***************************************************************************
|
||||
* RawData.h -- The RawData Class represents a network packet payload. It *
|
||||
* is essentially a single buffer that may contain either random data or *
|
||||
* caller supplied data. This class can be used, for example, to be linked *
|
||||
* to a UDP datagram. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#ifndef RAWDATA_H
|
||||
#define RAWDATA_H 1
|
||||
|
||||
#include "ApplicationLayerElement.h"
|
||||
|
||||
|
||||
class RawData : public ApplicationLayerElement {
|
||||
|
||||
private:
|
||||
u8 *data;
|
||||
|
||||
public:
|
||||
RawData();
|
||||
~RawData();
|
||||
void reset();
|
||||
u8 *getBufferPointer();
|
||||
int storeRecvData(const u8 *buf, size_t len);
|
||||
int protocol_id() const;
|
||||
int validate();
|
||||
int print(FILE *output, int detail) const;
|
||||
|
||||
u8 *getBufferPointer(int *mylen);
|
||||
int store(const u8 *buf, size_t len);
|
||||
int store(const char *str);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
340
libnetutil/RoutingHeader.cc
Normal file
340
libnetutil/RoutingHeader.cc
Normal file
@@ -0,0 +1,340 @@
|
||||
|
||||
/***************************************************************************
|
||||
* RoutingHeader.cc -- The RoutingHeader Class represents an IPv6 Routing *
|
||||
* extension header. *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#include "RoutingHeader.h"
|
||||
#include <assert.h>
|
||||
|
||||
/******************************************************************************/
|
||||
/* CONTRUCTORS, DESTRUCTORS AND INITIALIZATION METHODS */
|
||||
/******************************************************************************/
|
||||
RoutingHeader::RoutingHeader() {
|
||||
this->reset();
|
||||
} /* End of RoutingHeader constructor */
|
||||
|
||||
|
||||
RoutingHeader::~RoutingHeader() {
|
||||
|
||||
} /* End of RoutingHeader destructor */
|
||||
|
||||
|
||||
/** Sets every attribute to its default value */
|
||||
void RoutingHeader::reset(){
|
||||
memset(&this->h, 0, sizeof(nping_ipv6_ext_routing_hdr_t));
|
||||
this->length=ROUTING_HEADER_MIN_LEN;
|
||||
this->curr_addr=(u8 *)this->h.data;
|
||||
} /* End of reset() */
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* PacketElement:: OVERWRITTEN METHODS */
|
||||
/******************************************************************************/
|
||||
|
||||
/** @warning This method is essential for the superclass getBinaryBuffer()
|
||||
* method to work. Do NOT change a thing unless you know what you're doing */
|
||||
u8 *RoutingHeader::getBufferPointer(){
|
||||
return (u8*)(&this->h);
|
||||
} /* End of getBufferPointer() */
|
||||
|
||||
|
||||
/** Stores supplied packet in the internal buffer so the information
|
||||
* can be accessed using the standard get & set methods.
|
||||
* @warning The RoutingHeader class is able to hold a maximum of
|
||||
* sizeof(nping_icmpv6_hdr_t) bytes. If the supplied buffer is longer than
|
||||
* that, only the first 1508 bytes will be stored in the internal buffer.
|
||||
* @warning Supplied len MUST be at least 8 bytes (min ICMPv6 header length).
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error */
|
||||
int RoutingHeader::storeRecvData(const u8 *buf, size_t len){
|
||||
if(buf==NULL || len<ROUTING_HEADER_MIN_LEN){
|
||||
this->length=0;
|
||||
return OP_FAILURE;
|
||||
}else{
|
||||
/* Store the first 4 bytes, so we can access lenght and routing type */
|
||||
memcpy(&(this->h), buf, 4);
|
||||
|
||||
/* Our behaviour is different depending on the routing type. */
|
||||
switch(this->h.type){
|
||||
|
||||
/* Routing Type 0 (deprecated by RFC 5095)*/
|
||||
case 0:
|
||||
/* Type 0 has a variable length, but the value of its HdrExtLen
|
||||
* field must be even (because it must be a multiple of the
|
||||
* IPv6 address size). We also make sure that the received buffer
|
||||
* has as many bytes as the HdrExtLen field says it has, and
|
||||
* that it doesn't exceed the maximum number of octets we
|
||||
* can store in this object. */
|
||||
if(this->h.len%2==1 || ((unsigned int)(this->h.len+1))*8 > len || (this->h.len+1)*8 > ROUTING_HEADER_MAX_LEN){
|
||||
this->length=0;
|
||||
return OP_FAILURE;
|
||||
}else{
|
||||
int pkt_len=(this->h.len+1)*8;
|
||||
this->reset();
|
||||
this->length=pkt_len;
|
||||
memcpy(&(this->h), buf, this->length);
|
||||
return OP_SUCCESS;
|
||||
}
|
||||
break;
|
||||
|
||||
/* Routing Type 2 (For IPv6 Mobility. See RFC 6275) */
|
||||
case 2:
|
||||
/* Type 2 has a fixed length. If we have that many octets, store
|
||||
* them. We'll perform validation later in validate(). */
|
||||
if(len<ROUTING_TYPE_2_HEADER_LEN){
|
||||
this->length=0;
|
||||
return OP_FAILURE;
|
||||
}else{
|
||||
this->reset();
|
||||
memcpy(&(this->h), buf, ROUTING_TYPE_2_HEADER_LEN);
|
||||
this->length=ROUTING_TYPE_2_HEADER_LEN;
|
||||
return OP_SUCCESS;
|
||||
}
|
||||
break;
|
||||
|
||||
/* Unknown routing type */
|
||||
default:
|
||||
/* If this is some routing type that we don't know about, we'll have
|
||||
* to store as much data as the header says it has. Obvioulsy, we
|
||||
* check that we received as much data as the HdrExtLen advertises,
|
||||
* and that we don't exceed our own internal limit. */
|
||||
if( ((unsigned int)(this->h.len+1))*8 > len || (this->h.len+1)*8 > ROUTING_HEADER_MAX_LEN){
|
||||
this->length=0;
|
||||
return OP_FAILURE;
|
||||
}else{
|
||||
this->reset();
|
||||
this->length=(this->h.len+1)*8;
|
||||
memcpy(&(this->h), buf, this->length);
|
||||
return OP_SUCCESS;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return OP_FAILURE;
|
||||
} /* End of storeRecvData() */
|
||||
|
||||
|
||||
/* Returns a protocol identifier. This is used by packet parsing funtions
|
||||
* that return linked lists of PacketElement objects, to determine the protocol
|
||||
* the object represents. */
|
||||
int RoutingHeader::protocol_id() const {
|
||||
return HEADER_TYPE_IPv6_ROUTE;
|
||||
} /* End of protocol_id() */
|
||||
|
||||
|
||||
/** Determines if the data stored in the object after an storeRecvData() call
|
||||
* is valid and safe to use. This mainly checks the length of the data but may
|
||||
* also test the value of certain protocol fields to ensure their correctness.
|
||||
* @return the length, in bytes, of the header, if its found to be valid or
|
||||
* OP_FAILURE (-1) otherwise. */
|
||||
int RoutingHeader::validate(){
|
||||
|
||||
/* Check the object's length makes sense*/
|
||||
if(this->length < ROUTING_HEADER_MIN_LEN || this->length%8!=0) {
|
||||
return OP_FAILURE;
|
||||
}
|
||||
|
||||
switch(this->h.type){
|
||||
/* Routing Type 0 (deprecated by RFC 5095)*/
|
||||
case 0:
|
||||
/* Here we check that:
|
||||
* 1) The length in HdrExtLen is even.
|
||||
* 2) The length in HdrExtLen matches the octects stored in this object.
|
||||
* 3) The length in HdrExtLen does not exceed our internal limit. */
|
||||
if(this->h.len%2==1 || (this->h.len+1)*8 != this->length || (this->h.len+1)*8 > ROUTING_HEADER_MAX_LEN){
|
||||
return OP_FAILURE;
|
||||
}
|
||||
|
||||
/* Also, for Type 0, the value in the SegmentsLeft field should be less
|
||||
* than or equal to the number of addresses in the packet. We verify
|
||||
* that using the value of the HDrExtLen field which, divided by two,
|
||||
* yields the number of addresses in the packet. It certainly doesn't
|
||||
* make sense for the packet to say there are 5 hops left when we
|
||||
* have less than 5 IPv6 addresses. We allow it to be less than
|
||||
* the number of addresses present in the packet because the RFC 2460
|
||||
* only talkes about segleft being greater than HDrExtLen/2, not less. */
|
||||
if(this->h.segleft > this->h.len/2){
|
||||
return OP_FAILURE;
|
||||
}
|
||||
break;
|
||||
|
||||
/* Routing Type 2 (For IPv6 Mobility. See RFC 6275) */
|
||||
case 2:
|
||||
/* Check that we have the exact number of octets we expect. */
|
||||
if(this->length!= ROUTING_TYPE_2_HEADER_LEN){
|
||||
return OP_FAILURE;
|
||||
}
|
||||
/* Also check that the HdrExtLen and SegmentsLeft fields have the
|
||||
* value that RFC 6275 dictates. */
|
||||
if(this->h.segleft!=1 || this->h.len!=2){
|
||||
return OP_FAILURE;
|
||||
}
|
||||
break;
|
||||
|
||||
/* Unknown routing type */
|
||||
default:
|
||||
/* If this is some routing type that we don't know about, we just
|
||||
* check that the length makes sense because we cannot make assumptions
|
||||
* about the semantics of other fields. */
|
||||
if( this->length!=(this->h.len+1)*8 || (this->h.len+1)*8>ROUTING_HEADER_MAX_LEN){
|
||||
return OP_FAILURE;
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
return this->length;
|
||||
} /* End of validate() */
|
||||
|
||||
|
||||
/** Prints the contents of the header and calls print() on the next protocol
|
||||
* header in the chain (if there is any).
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int RoutingHeader::print(FILE *output, int detail) const {
|
||||
fprintf(output, "Routing[nh=%d len=%d type=%d segleft=%d]", this->h.nh, this->h.len, this->h.type, this->h.segleft);
|
||||
// TODO: @todo : Implement this
|
||||
if(this->next!=NULL){
|
||||
print_separator(output, detail);
|
||||
next->print(output, detail);
|
||||
}
|
||||
return OP_SUCCESS;
|
||||
} /* End of print() */
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* PROTOCOL-SPECIFIC METHODS */
|
||||
/******************************************************************************/
|
||||
|
||||
/** Set Next Header field */
|
||||
int RoutingHeader::setNextHeader(u8 val){
|
||||
this->h.nh = val;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setNextHeader() */
|
||||
|
||||
|
||||
/** Returns next header id */
|
||||
u8 RoutingHeader::getNextHeader(){
|
||||
return this->h.nh;
|
||||
} /* End of getNextHeader() */
|
||||
|
||||
|
||||
/** Set routing type */
|
||||
int RoutingHeader::setRoutingType(u8 val){
|
||||
this->h.type = val;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setRoutingType() */
|
||||
|
||||
|
||||
/** Returns the routing type */
|
||||
u8 RoutingHeader::getRoutingType(){
|
||||
return this->h.type;
|
||||
} /* End of getRoutingType() */
|
||||
|
||||
|
||||
/** Set number of segments left */
|
||||
int RoutingHeader::setSegmentsLeft(u8 val){
|
||||
this->h.segleft = val;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSegmentsLeft() */
|
||||
|
||||
|
||||
/** Returns the number of segments left */
|
||||
u8 RoutingHeader::getSegmentsLeft(){
|
||||
return this->h.segleft;
|
||||
} /* End of getSegmentsLeft() */
|
||||
|
||||
|
||||
/** Set number of segments left */
|
||||
int RoutingHeader::addAddress(struct in6_addr val){
|
||||
/* Check we don't exceed max length */
|
||||
if((this->length + 16)>ROUTING_HEADER_MAX_LEN)
|
||||
return OP_FAILURE;
|
||||
memcpy(this->curr_addr, val.s6_addr, 16);
|
||||
this->curr_addr+=16;
|
||||
this->h.len+=2;
|
||||
this->length+=16;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSegmentsLeft() */
|
||||
207
libnetutil/RoutingHeader.h
Normal file
207
libnetutil/RoutingHeader.h
Normal file
@@ -0,0 +1,207 @@
|
||||
|
||||
/***************************************************************************
|
||||
* RoutingHeader.h -- The RoutingHeader Class represents an IPv6 Routing *
|
||||
* extension header. *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#ifndef __ROUTING_HEADER_H__
|
||||
#define __ROUTING_HEADER_H__ 1
|
||||
|
||||
#include "IPv6ExtensionHeader.h"
|
||||
|
||||
#define ROUTING_HEADER_MIN_LEN 8
|
||||
#define ROUTING_HEADER_MAX_LEN (8 + 256*8)
|
||||
#define ROUTING_MAX_DATA_LEN 256*8
|
||||
#define ROUTING_TYPE_2_HEADER_LEN 24
|
||||
#define ROUTING_TYPE_0_MIN_LEN 8
|
||||
|
||||
class RoutingHeader : public IPv6ExtensionHeader {
|
||||
|
||||
private:
|
||||
|
||||
/*
|
||||
1) Generic Routing Header:
|
||||
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Next Header | Hdr Ext Len | Routing Type | Segments Left |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
. .
|
||||
. type-specific data .
|
||||
. .
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|
||||
2) Type 0 Routing header:
|
||||
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Next Header | Hdr Ext Len | Routing Type=0| Segments Left |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Reserved |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+ Address[1] +
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+ Address[2] +
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
. . .
|
||||
. . .
|
||||
. . .
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+ Address[n] +
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|
||||
3) Type 2 Routing header:
|
||||
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Next Header | Hdr Ext Len=2 | Routing Type=2|Segments Left=1|
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Reserved |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+ Home Address +
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
|
||||
struct nping_ipv6_ext_routing_hdr{
|
||||
u8 nh;
|
||||
u8 len;
|
||||
u8 type;
|
||||
u8 segleft;
|
||||
u32 reserved;
|
||||
u8 data[ROUTING_MAX_DATA_LEN];
|
||||
}__attribute__((__packed__));
|
||||
typedef struct nping_ipv6_ext_routing_hdr nping_ipv6_ext_routing_hdr_t;
|
||||
|
||||
nping_ipv6_ext_routing_hdr_t h;
|
||||
u8 *curr_addr;
|
||||
|
||||
public:
|
||||
RoutingHeader();
|
||||
~RoutingHeader();
|
||||
void reset();
|
||||
u8 *getBufferPointer();
|
||||
int storeRecvData(const u8 *buf, size_t len);
|
||||
int protocol_id() const;
|
||||
int validate();
|
||||
int print(FILE *output, int detail) const;
|
||||
|
||||
/* Protocol specific methods */
|
||||
int setNextHeader(u8 val);
|
||||
u8 getNextHeader();
|
||||
|
||||
int setRoutingType(u8 val);
|
||||
u8 getRoutingType();
|
||||
|
||||
int setSegmentsLeft(u8 val);
|
||||
u8 getSegmentsLeft();
|
||||
|
||||
int addAddress(struct in6_addr val);
|
||||
|
||||
}; /* End of class RoutingHeader */
|
||||
|
||||
#endif
|
||||
963
libnetutil/TCPHeader.cc
Normal file
963
libnetutil/TCPHeader.cc
Normal file
@@ -0,0 +1,963 @@
|
||||
|
||||
/***************************************************************************
|
||||
* TCPHeader.cc -- The TCPHeader Class represents a TCP packet. It *
|
||||
* contains methods to set the different header fields. These methods *
|
||||
* tipically perform the necessary error checks and byte order *
|
||||
* conversions. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#include "TCPHeader.h"
|
||||
#include <assert.h>
|
||||
/******************************************************************************/
|
||||
/* CONTRUCTORS, DESTRUCTORS AND INITIALIZATION METHODS */
|
||||
/******************************************************************************/
|
||||
TCPHeader::TCPHeader(){
|
||||
this->reset();
|
||||
} /* End of TCPHeader constructor */
|
||||
|
||||
|
||||
TCPHeader::~TCPHeader(){
|
||||
|
||||
} /* End of TCPHeader destructor */
|
||||
|
||||
/** Sets every attribute to its default value */
|
||||
void TCPHeader::reset(){
|
||||
memset(&this->h, 0, sizeof(nping_tcp_hdr_t));
|
||||
this->length=TCP_HEADER_LEN; /* Initial value 20. This will be incremented if options are used */
|
||||
this->tcpoptlen=0;
|
||||
this->setSourcePort(TCP_DEFAULT_SPORT);
|
||||
this->setDestinationPort(TCP_DEFAULT_DPORT);
|
||||
this->setSeq(TCP_DEFAULT_SEQ);
|
||||
this->setAck(TCP_DEFAULT_ACK);
|
||||
this->setFlags(TCP_DEFAULT_FLAGS);
|
||||
this->setWindow(TCP_DEFAULT_WIN);
|
||||
this->setUrgPointer(TCP_DEFAULT_URP);
|
||||
this->setOffset();
|
||||
} /* End of reset() */
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* PacketElement:: OVERWRITTEN METHODS */
|
||||
/******************************************************************************/
|
||||
|
||||
/** @warning This method is essential for the superclass getBinaryBuffer()
|
||||
* method to work. Do NOT change a thing unless you know what you're doing */
|
||||
u8 * TCPHeader::getBufferPointer(){
|
||||
return (u8*)(&h);
|
||||
} /* End of getBufferPointer() */
|
||||
|
||||
|
||||
/** Stores supplied packet in the internal buffer so the information
|
||||
* can be accessed using the standard get & set methods.
|
||||
* @warning The TCPHeader class is able to hold a maximum of 60 bytes. If the
|
||||
* supplied buffer is longer than that, only the first 60 bytes will be stored
|
||||
* in the internal buffer.
|
||||
* @warning Supplied len MUST be at least 20 bytes (min TCP header length).
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error */
|
||||
int TCPHeader::storeRecvData(const u8 *buf, size_t len){
|
||||
if(buf==NULL || len<TCP_HEADER_LEN){
|
||||
return OP_FAILURE;
|
||||
}else{
|
||||
int stored_len = MIN((TCP_HEADER_LEN + MAX_TCP_OPTIONS_LEN), len);
|
||||
this->reset(); /* Re-init the object, just in case the caller had used it already */
|
||||
this->length=stored_len;
|
||||
if(stored_len>TCP_HEADER_LEN)
|
||||
this->tcpoptlen=stored_len-TCP_HEADER_LEN;
|
||||
memcpy(&(this->h), buf, stored_len);
|
||||
}
|
||||
return OP_SUCCESS;
|
||||
} /* End of storeRecvData() */
|
||||
|
||||
|
||||
/* Returns a protocol identifier. This is used by packet parsing funtions
|
||||
* that return linked lists of PacketElement objects, to determine the protocol
|
||||
* the object represents. */
|
||||
int TCPHeader::protocol_id() const {
|
||||
return HEADER_TYPE_TCP;
|
||||
} /* End of protocol_id() */
|
||||
|
||||
|
||||
/** Determines if the data stored in the object after an storeRecvData() call
|
||||
* is valid and safe to use. This mainly checks the length of the data but may
|
||||
* also test the value of certain protocol fields to ensure their correctness.
|
||||
* @warning If the information stored in the object has been set through a
|
||||
* call to storeRecvData(), the object's internal length count may be updated
|
||||
* if the validation is successful.
|
||||
* @return the length, in bytes, of the header, if its found to be valid or
|
||||
* OP_FAILURE (-1) otherwise. */
|
||||
int TCPHeader::validate(){
|
||||
if(this->getOffset()<5)
|
||||
return OP_FAILURE;
|
||||
else if(this->getOffset()*4 > this->length)
|
||||
return OP_FAILURE;
|
||||
this->length=this->getOffset()*4;
|
||||
return this->length;
|
||||
} /* End of validate() */
|
||||
|
||||
|
||||
/** Prints the contents of the header and calls print() on the next protocol
|
||||
* header in the chain (if there is any).
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int TCPHeader::print(FILE *output, int detail) const {
|
||||
char optinfo[256];
|
||||
fprintf(output, "TCP[");
|
||||
fprintf(output, "%d", this->getSourcePort());
|
||||
fprintf(output, " >");
|
||||
fprintf(output, " %d", this->getDestinationPort());
|
||||
fprintf(output, " %s%s%s%s%s%s%s%s",
|
||||
!this->getSYN() ? "" : "S",
|
||||
!this->getFIN() ? "" : "F",
|
||||
!this->getRST() ? "" : "R",
|
||||
!this->getPSH() ? "" : "P",
|
||||
!this->getACK() ? "" : "A",
|
||||
!this->getURG() ? "" : "U",
|
||||
!this->getECN() ? "" : "E",
|
||||
!this->getCWR() ? "" : "C"
|
||||
);
|
||||
fprintf(output, " seq=%lu", (long unsigned int)this->getSeq() );
|
||||
if(detail>=PRINT_DETAIL_HIGH){
|
||||
fprintf(output, " ack=%lu", (long unsigned int)this->getAck() );
|
||||
fprintf(output, " off=%d", this->getOffset() );
|
||||
fprintf(output, " res=%d", this->h.th_x2);
|
||||
}
|
||||
fprintf(output, " win=%hu", this->getWindow() );
|
||||
if(detail>=PRINT_DETAIL_MED)
|
||||
fprintf(output, " csum=0x%04X", ntohs( this->getSum() ));
|
||||
if(detail>=PRINT_DETAIL_HIGH)
|
||||
fprintf(output, " urp=%d", this->getUrgPointer() );
|
||||
|
||||
if(this->tcpoptlen>0 && (this->length >= TCP_HEADER_LEN+this->tcpoptlen) && this->tcpoptlen<=MAX_TCP_OPTIONS_LEN){
|
||||
this->__tcppacketoptinfo(this->h.options, this->tcpoptlen, optinfo, sizeof(optinfo)-1);
|
||||
optinfo[255]='\0';
|
||||
fprintf(output, " %s", optinfo);
|
||||
}
|
||||
fprintf(output, "]");
|
||||
|
||||
if(this->next!=NULL){
|
||||
print_separator(output, detail);
|
||||
next->print(output, detail);
|
||||
}
|
||||
return OP_SUCCESS;
|
||||
} /* End of print() */
|
||||
|
||||
|
||||
/* Get an ASCII information about a tcp option which is pointed by
|
||||
optp, with a length of len. The result is stored in the result
|
||||
buffer. The result may look like "<mss 1452,sackOK,timestamp
|
||||
45848914 0,nop,wscale 7>" */
|
||||
void TCPHeader::__tcppacketoptinfo(const u8 *optp, int len, char *result, int bufsize) const {
|
||||
assert(optp);
|
||||
assert(result);
|
||||
char *p, ch;
|
||||
const u8 *q;
|
||||
int opcode;
|
||||
u16 tmpshort;
|
||||
u32 tmpword1, tmpword2;
|
||||
unsigned int i=0;
|
||||
|
||||
p = result;
|
||||
*p = '\0';
|
||||
q = optp;
|
||||
ch = '<';
|
||||
|
||||
while (len > 0 && bufsize > 2) {
|
||||
Snprintf(p, bufsize, "%c", ch);
|
||||
bufsize--;
|
||||
p++;
|
||||
opcode = *q++;
|
||||
if (!opcode) { /* End of List */
|
||||
|
||||
Snprintf(p, bufsize, "eol");
|
||||
bufsize -= strlen(p);
|
||||
p += strlen(p);
|
||||
|
||||
len--;
|
||||
|
||||
} else if (opcode == 1) { /* No Op */
|
||||
Snprintf(p, bufsize, "nop");
|
||||
bufsize -= strlen(p);
|
||||
p += strlen(p);
|
||||
|
||||
len--;
|
||||
} else if (opcode == 2) { /* MSS */
|
||||
if (len < 4)
|
||||
break; /* MSS has 4 bytes */
|
||||
|
||||
q++;
|
||||
memcpy(&tmpshort, q, 2);
|
||||
|
||||
Snprintf(p, bufsize, "mss %u", ntohs(tmpshort));
|
||||
bufsize -= strlen(p);
|
||||
p += strlen(p);
|
||||
|
||||
q += 2;
|
||||
len -= 4;
|
||||
} else if (opcode == 3) { /* Window Scale */
|
||||
if (len < 3)
|
||||
break; /* Window Scale option has 3 bytes */
|
||||
|
||||
q++;
|
||||
|
||||
Snprintf(p, bufsize, "wscale %u", *q);
|
||||
bufsize -= strlen(p);
|
||||
p += strlen(p);
|
||||
|
||||
q++;
|
||||
len -= 3;
|
||||
} else if (opcode == 4) { /* SACK permitted */
|
||||
if (len < 2)
|
||||
break; /* SACK permitted option has 2 bytes */
|
||||
|
||||
Snprintf(p, bufsize, "sackOK");
|
||||
bufsize -= strlen(p);
|
||||
p += strlen(p);
|
||||
|
||||
q++;
|
||||
len -= 2;
|
||||
} else if (opcode == 5) { /* SACK */
|
||||
unsigned sackoptlen = *q;
|
||||
if ((unsigned) len < sackoptlen)
|
||||
break;
|
||||
|
||||
/* This would break parsing, so it's best to just give up */
|
||||
if (sackoptlen < 2)
|
||||
break;
|
||||
|
||||
q++;
|
||||
|
||||
if ((sackoptlen - 2) == 0 || ((sackoptlen - 2) % 8 != 0)) {
|
||||
Snprintf(p, bufsize, "malformed sack");
|
||||
bufsize -= strlen(p);
|
||||
p += strlen(p);
|
||||
} else {
|
||||
Snprintf(p, bufsize, "sack %d ", (sackoptlen - 2) / 8);
|
||||
bufsize -= strlen(p);
|
||||
p += strlen(p);
|
||||
for (i = 0; i < sackoptlen - 2; i += 8) {
|
||||
memcpy(&tmpword1, q + i, 4);
|
||||
memcpy(&tmpword2, q + i + 4, 4);
|
||||
Snprintf(p, bufsize, "{%u:%u}", tmpword1, tmpword2);
|
||||
bufsize -= strlen(p);
|
||||
p += strlen(p);
|
||||
}
|
||||
}
|
||||
|
||||
q += sackoptlen - 2;
|
||||
len -= sackoptlen;
|
||||
} else if (opcode == 8) { /* Timestamp */
|
||||
if (len < 10)
|
||||
break; /* Timestamp option has 10 bytes */
|
||||
|
||||
q++;
|
||||
memcpy(&tmpword1, q, 4);
|
||||
memcpy(&tmpword2, q + 4, 4);
|
||||
|
||||
Snprintf(p, bufsize, "timestamp %u %u", ntohl(tmpword1),
|
||||
ntohl(tmpword2));
|
||||
bufsize -= strlen(p);
|
||||
p += strlen(p);
|
||||
|
||||
q += 8;
|
||||
len -= 10;
|
||||
}
|
||||
|
||||
ch = ',';
|
||||
}
|
||||
|
||||
if (len > 0) {
|
||||
*result = '\0';
|
||||
return;
|
||||
}
|
||||
|
||||
Snprintf(p, bufsize, ">");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* PROTOCOL-SPECIFIC METHODS */
|
||||
/******************************************************************************/
|
||||
|
||||
/** Sets source port.
|
||||
* @warning Port must be supplied in host byte order. This method performs
|
||||
* byte order conversion using htons() */
|
||||
int TCPHeader::setSourcePort(u16 p){
|
||||
h.th_sport = htons(p);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSourcePort() */
|
||||
|
||||
|
||||
/** Returns source port in HOST byte order */
|
||||
u16 TCPHeader::getSourcePort() const {
|
||||
return ntohs(h.th_sport);
|
||||
} /* End of getSourcePort() */
|
||||
|
||||
|
||||
/** Sets destination port.
|
||||
* @warning Port must be supplied in host byte order. This method performs
|
||||
* byte order conversion using htons() */
|
||||
int TCPHeader::setDestinationPort(u16 p){
|
||||
h.th_dport = htons(p);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setDestinationPort() */
|
||||
|
||||
|
||||
/** Returns destination port in HOST byte order */
|
||||
u16 TCPHeader::getDestinationPort() const {
|
||||
return ntohs(h.th_dport);
|
||||
} /* End of getDestinationPort() */
|
||||
|
||||
|
||||
/** Sets sequence number.
|
||||
* @warning Seq number must be supplied in host byte order. This method
|
||||
* performs byte order conversion using htonl() */
|
||||
int TCPHeader::setSeq(u32 p){
|
||||
h.th_seq = htonl(p);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSeq() */
|
||||
|
||||
|
||||
/** Returns sequence number in HOST byte order */
|
||||
u32 TCPHeader::getSeq() const {
|
||||
return ntohl(h.th_seq);
|
||||
} /* End of getSeq() */
|
||||
|
||||
|
||||
/** Sets acknowledgement number.
|
||||
* @warning ACK number must be supplied in host byte order. This method
|
||||
* performs byte order conversion using htonl() */
|
||||
int TCPHeader::setAck(u32 p){
|
||||
h.th_ack = htonl(p);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setAck() */
|
||||
|
||||
|
||||
/** Returns ACK number in HOST byte order */
|
||||
u32 TCPHeader::getAck() const {
|
||||
return ntohl(h.th_ack);
|
||||
} /* End of getAck() */
|
||||
|
||||
|
||||
/* TODO: Test this method. It may not work becuasse th_off is supposed to
|
||||
* be 4 bits long and arg o is 8.
|
||||
* UPDATE: It seems to work just fine. However, let's keep this note just
|
||||
* in case problems arise. */
|
||||
int TCPHeader::setOffset(u8 o){
|
||||
h.th_off = o;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setOffset() */
|
||||
|
||||
|
||||
int TCPHeader::setOffset(){
|
||||
h.th_off = 5 + tcpoptlen/4;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setOffset() */
|
||||
|
||||
|
||||
/** Returns offset value */
|
||||
u8 TCPHeader::getOffset() const {
|
||||
return h.th_off;
|
||||
} /* End of getOffset() */
|
||||
|
||||
|
||||
/* Sets the 4-bit reserved field (Note that there are not 4 reserved bits anymore
|
||||
* as RFC 3540 introduces a new TCP flag, so calling this will overwrite
|
||||
* the value of such flag. */
|
||||
int TCPHeader::setReserved(u8 r){
|
||||
h.th_x2 = r;
|
||||
return OP_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
u8 TCPHeader::getReserved() const {
|
||||
return h.th_x2;
|
||||
}
|
||||
|
||||
|
||||
/** Sets TCP flags */
|
||||
int TCPHeader::setFlags(u8 f){
|
||||
h.th_flags = f;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setFlags() */
|
||||
|
||||
|
||||
/** Returns the 8bit flags field of the TCP header */
|
||||
u8 TCPHeader::getFlags() const {
|
||||
return h.th_flags;
|
||||
} /* End of getFlags() */
|
||||
|
||||
|
||||
/* Returns the 16bit flags field of the TCP header. As RFC 3540 defines a new
|
||||
* flag (NS), we no longer can store all TCP flags in a single octet, so
|
||||
* this method returns the flags as a two-octet unsigned integer. */
|
||||
u16 TCPHeader::getFlags16() const {
|
||||
/* Obtain the value of dataoff+reserved+flags in host byte order */
|
||||
u16 field=ntohs(*(u16 *)(((u8 *)&this->h)+12));
|
||||
/* Erase the contents of the data offset field */
|
||||
field = field & 0x0FFF;
|
||||
return field;
|
||||
} /* End of getFlags16() */
|
||||
|
||||
|
||||
/** Sets flag CWR
|
||||
* @return Previous state of the flag */
|
||||
bool TCPHeader::setCWR(){
|
||||
u8 prev = h.th_flags & TH_CWR;
|
||||
h.th_flags |= TH_CWR;
|
||||
return prev;
|
||||
} /* End of setCWR() */
|
||||
|
||||
|
||||
/** Unsets flag CWR
|
||||
* @return Previous state of the flag */
|
||||
bool TCPHeader::unsetCWR(){
|
||||
u8 prev = h.th_flags & TH_CWR;
|
||||
h.th_flags ^= TH_CWR;
|
||||
return prev;
|
||||
} /* End of unsetCWR() */
|
||||
|
||||
|
||||
/** Get CWR flag */
|
||||
bool TCPHeader::getCWR() const {
|
||||
return h.th_flags & TH_CWR;
|
||||
} /* End of getCWR() */
|
||||
|
||||
|
||||
/** Sets flag ECE/ECN
|
||||
* @return Previous state of the flag */
|
||||
bool TCPHeader::setECE(){
|
||||
u8 prev = h.th_flags & TH_ECN;
|
||||
h.th_flags |= TH_ECN;
|
||||
return prev;
|
||||
} /* End of setECE() */
|
||||
|
||||
|
||||
/** Unsets flag ECE/ECN
|
||||
* @return Previous state of the flag */
|
||||
bool TCPHeader::unsetECE(){
|
||||
u8 prev = h.th_flags & TH_ECN;
|
||||
h.th_flags ^= TH_ECN;
|
||||
return prev;
|
||||
} /* End of unsetECE() */
|
||||
|
||||
|
||||
/** Get CWR flag */
|
||||
bool TCPHeader::getECE() const {
|
||||
return h.th_flags & TH_ECN;
|
||||
} /* End of getECE() */
|
||||
|
||||
|
||||
/** Same as setECE() but with a different name since there are two possible
|
||||
* ways to call this flag
|
||||
* @return Previous state of the flag */
|
||||
bool TCPHeader::setECN(){
|
||||
u8 prev = h.th_flags & TH_ECN;
|
||||
h.th_flags |= TH_ECN;
|
||||
return prev;
|
||||
} /* End of setECN() */
|
||||
|
||||
|
||||
/** Unsets flag ECE/ECN
|
||||
* @return Previous state of the flag */
|
||||
bool TCPHeader::unsetECN(){
|
||||
u8 prev = h.th_flags & TH_ECN;
|
||||
h.th_flags ^= TH_ECN;
|
||||
return prev;
|
||||
} /* End of unsetECN() */
|
||||
|
||||
|
||||
/** Get ECN flag */
|
||||
bool TCPHeader::getECN() const {
|
||||
return h.th_flags & TH_ECN;
|
||||
} /* End of getECN() */
|
||||
|
||||
|
||||
/** Sets flag URG
|
||||
* @return Previous state of the flag */
|
||||
bool TCPHeader::setURG(){
|
||||
u8 prev = h.th_flags & TH_URG;
|
||||
h.th_flags |= TH_URG;
|
||||
return prev;
|
||||
} /* End of setURG() */
|
||||
|
||||
|
||||
/** Unsets flag URG
|
||||
* @return Previous state of the flag */
|
||||
bool TCPHeader::unsetURG(){
|
||||
u8 prev = h.th_flags & TH_URG;
|
||||
h.th_flags ^= TH_URG;
|
||||
return prev;
|
||||
} /* End of unsetURG() */
|
||||
|
||||
|
||||
/** Get URG flag */
|
||||
bool TCPHeader::getURG() const {
|
||||
return h.th_flags & TH_URG;
|
||||
} /* End of getURG() */
|
||||
|
||||
|
||||
/** Sets flag ACK
|
||||
* @return Previous state of the flag */
|
||||
bool TCPHeader::setACK(){
|
||||
u8 prev = h.th_flags & TH_ACK;
|
||||
h.th_flags |= TH_ACK;
|
||||
return prev;
|
||||
} /* End of setACK() */
|
||||
|
||||
|
||||
/** Unsets flag ACK
|
||||
* @return Previous state of the flag */
|
||||
bool TCPHeader::unsetACK(){
|
||||
u8 prev = h.th_flags & TH_ACK;
|
||||
h.th_flags ^= TH_ACK;
|
||||
return prev;
|
||||
} /* End of unsetACK() */
|
||||
|
||||
|
||||
/** Get ACK flag */
|
||||
bool TCPHeader::getACK() const {
|
||||
return h.th_flags & TH_ACK;
|
||||
} /* End of getACK() */
|
||||
|
||||
|
||||
/** Sets flag PSH
|
||||
* @return Previous state of the flag */
|
||||
bool TCPHeader::setPSH(){
|
||||
u8 prev = h.th_flags & TH_PSH;
|
||||
h.th_flags |= TH_PSH;
|
||||
return prev;
|
||||
} /* End of setPSH() */
|
||||
|
||||
|
||||
/** Unsets flag PSH
|
||||
* @return Previous state of the flag */
|
||||
bool TCPHeader::unsetPSH(){
|
||||
u8 prev = h.th_flags & TH_PSH;
|
||||
h.th_flags ^= TH_PSH;
|
||||
return prev;
|
||||
} /* End of unsetPSH() */
|
||||
|
||||
|
||||
/** Get PSH flag */
|
||||
bool TCPHeader::getPSH() const {
|
||||
return h.th_flags & TH_PSH;
|
||||
} /* End of getPSH() */
|
||||
|
||||
|
||||
/** Sets flag RST
|
||||
* @return Previous state of the flag */
|
||||
bool TCPHeader::setRST(){
|
||||
u8 prev = h.th_flags & TH_RST;
|
||||
h.th_flags |= TH_RST;
|
||||
return prev;
|
||||
} /* End of setRST() */
|
||||
|
||||
|
||||
/** Unsets flag RST
|
||||
* @return Previous state of the flag */
|
||||
bool TCPHeader::unsetRST(){
|
||||
u8 prev = h.th_flags & TH_RST;
|
||||
h.th_flags ^= TH_RST;
|
||||
return prev;
|
||||
} /* End of unsetRST() */
|
||||
|
||||
|
||||
/** Get RST flag */
|
||||
bool TCPHeader::getRST() const {
|
||||
return h.th_flags & TH_RST;
|
||||
} /* End of getRST() */
|
||||
|
||||
|
||||
/** Sets flag SYN
|
||||
* @return Previous state of the flag */
|
||||
bool TCPHeader::setSYN(){
|
||||
u8 prev = h.th_flags & TH_SYN;
|
||||
h.th_flags |= TH_SYN;
|
||||
return prev;
|
||||
} /* End of setSYN() */
|
||||
|
||||
|
||||
/** Unsets flag SYN
|
||||
* @return Previous state of the flag */
|
||||
bool TCPHeader::unsetSYN(){
|
||||
u8 prev = h.th_flags & TH_SYN;
|
||||
h.th_flags ^= TH_SYN;
|
||||
return prev;
|
||||
} /* End of unsetSYN() */
|
||||
|
||||
|
||||
/** Get SYN flag */
|
||||
bool TCPHeader::getSYN() const {
|
||||
return h.th_flags & TH_SYN;
|
||||
} /* End of getSYN() */
|
||||
|
||||
|
||||
/** Sets flag FIN
|
||||
* @return Previous state of the flag */
|
||||
bool TCPHeader::setFIN(){
|
||||
u8 prev = h.th_flags & TH_FIN;
|
||||
h.th_flags |= TH_FIN;
|
||||
return prev;
|
||||
} /* End of setFIN() */
|
||||
|
||||
|
||||
/** Unsets flag FIN
|
||||
* @return Previous state of the flag */
|
||||
bool TCPHeader::unsetFIN(){
|
||||
u8 prev = h.th_flags & TH_FIN;
|
||||
h.th_flags ^= TH_FIN;
|
||||
return prev;
|
||||
} /* End of unsetFIN() */
|
||||
|
||||
|
||||
/** Get FIN flag */
|
||||
bool TCPHeader::getFIN() const {
|
||||
return h.th_flags & TH_FIN;
|
||||
} /* End of getFIN() */
|
||||
|
||||
|
||||
/** Sets window size.
|
||||
* @warning Win number must be supplied in host byte order. This method
|
||||
* performs byte order conversion using htons() */
|
||||
int TCPHeader::setWindow(u16 p){
|
||||
h.th_win = htons(p);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setWindow() */
|
||||
|
||||
|
||||
/** Returns window size in HOST byte order. */
|
||||
u16 TCPHeader::getWindow() const {
|
||||
return ntohs(h.th_win);
|
||||
} /* End of getWindow() */
|
||||
|
||||
|
||||
/** Sets urgent pointer.
|
||||
* @warning Pointer must be supplied in host byte order. This method
|
||||
* performs byte order conversion using htons() */
|
||||
int TCPHeader::setUrgPointer(u16 l){
|
||||
h.th_urp = htons(l);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setUrgPointer() */
|
||||
|
||||
|
||||
/** Returns Urgent Pointer in HOST byte order. */
|
||||
u16 TCPHeader::getUrgPointer() const {
|
||||
return ntohs(h.th_urp);
|
||||
} /* End of getUrgPointer() */
|
||||
|
||||
|
||||
int TCPHeader::setSum(struct in_addr src, struct in_addr dst){
|
||||
int bufflen;
|
||||
u8 aux[ MAX_TCP_PAYLOAD_LEN ];
|
||||
/* FROM: RFC 1323: TCP Extensions for High Performance, March 4, 2009
|
||||
*
|
||||
* "With IP Version 4, the largest amount of TCP data that can be sent in
|
||||
* a single packet is 65495 bytes (64K - 1 - size of fixed IP and TCP
|
||||
* headers)".
|
||||
*
|
||||
* In theory TCP should not worry about the practical max payload length
|
||||
* because it is supposed to be independent of the network layer. However,
|
||||
* since TCP does not have any length field and we need to allocate a
|
||||
* buffer, we are using that value. (Note htat in UDPHeader.cc we do just
|
||||
* the opposite, forget about the practical limitation and allow the
|
||||
* theorical limit for the payload. */
|
||||
h.th_sum = 0;
|
||||
|
||||
/* Copy packet contents to a buffer */
|
||||
bufflen=dumpToBinaryBuffer(aux, MAX_TCP_PAYLOAD_LEN);
|
||||
|
||||
/* Compute checksum */
|
||||
h.th_sum = ipv4_pseudoheader_cksum(&src, &dst, IPPROTO_TCP, bufflen, (char *)aux);
|
||||
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSum() */
|
||||
|
||||
|
||||
/** @warning Sum is set to supplied value with NO byte ordering conversion
|
||||
* performed. */
|
||||
int TCPHeader::setSum(u16 s){
|
||||
h.th_sum = s;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSum() */
|
||||
|
||||
|
||||
int TCPHeader::setSum(){
|
||||
this->h.th_sum=0;
|
||||
this->h.th_sum = this->compute_checksum();
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSum() */
|
||||
|
||||
|
||||
/** Set the TCP checksum field to a random value, which may accidentally
|
||||
* match the correct checksum */
|
||||
int TCPHeader::setSumRandom(){
|
||||
h.th_sum=get_random_u16();
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSumRandom() */
|
||||
|
||||
/** Set the TCP checksum field to a random value. It takes the source and
|
||||
* destination address to make sure the random generated sum does not
|
||||
* accidentally match the correct checksum. This function only handles
|
||||
* IPv4 address. */
|
||||
int TCPHeader::setSumRandom(struct in_addr source, struct in_addr destination){
|
||||
u16 correct_csum=0;
|
||||
/* Compute the correct checksum */
|
||||
this->setSum(source, destination);
|
||||
correct_csum=this->getSum();
|
||||
/* Generate numbers until one does not match the correct sum */
|
||||
while( (h.th_sum=get_random_u16())==correct_csum);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSumRandom() */
|
||||
|
||||
|
||||
/** Returns the TCP checksum field in NETWORK byte order */
|
||||
u16 TCPHeader::getSum() const {
|
||||
return h.th_sum;
|
||||
} /* End of getSum() */
|
||||
|
||||
|
||||
/* Copies the supplied buffer into the TCP options field. Note that the supplied
|
||||
* buffer MUST NOT exceed MAX_TCP_OPTIONS_LEN octets and should be a multiple of
|
||||
* four. If it is not a multiple of four, no error will be returned but the
|
||||
* behaviour is unspecified. If this method is called passing NULL and zero
|
||||
* ( t.setOptions(NULL, 0), any existing options are cleared, and the object's
|
||||
* internal length is updated accordingly. Also, note that a call to setOptions()
|
||||
* involves an automatic call to setOffset(), which updates the Offset field
|
||||
* to take into account the new header length. If you need to set a bogus
|
||||
* data offset, you can do so after calling setOptions(), but not before.
|
||||
* It returns OP_SUCCESS on success and OP_FAILURE in case of error */
|
||||
int TCPHeader::setOptions(const u8 *optsbuff, size_t optslen){
|
||||
/* NULL and length=0 means delete existing options */
|
||||
if(optsbuff==NULL && optslen==0){
|
||||
this->tcpoptlen=0;
|
||||
this->length=TCP_HEADER_LEN;
|
||||
memset(this->h.options, 0, MAX_TCP_OPTIONS_LEN);
|
||||
return OP_SUCCESS;
|
||||
|
||||
/* Make sure params are safe to use */
|
||||
}else if(optsbuff==NULL || optslen==0 || optslen>MAX_TCP_OPTIONS_LEN){
|
||||
return OP_FAILURE;
|
||||
|
||||
/* Copy supplied buffer into the options field, and update the offset field. */
|
||||
}else{
|
||||
memcpy(this->h.options, optsbuff, optslen);
|
||||
this->tcpoptlen=optslen;
|
||||
this->length=TCP_HEADER_LEN+optslen;
|
||||
this->setOffset();
|
||||
return OP_SUCCESS;
|
||||
}
|
||||
} /* End of setOptions() */
|
||||
|
||||
|
||||
/* Returns a pointer to the start of the TCP options field. If the supplied
|
||||
* "optslen" pointer is not NULL, the length of the options will be stored
|
||||
* there. */
|
||||
const u8 *TCPHeader::getOptions(size_t *optslen) const {
|
||||
if(optslen!=NULL)
|
||||
*optslen=this->tcpoptlen;
|
||||
return this->h.options;
|
||||
} /* End of getOptions() */
|
||||
|
||||
|
||||
/* Returns the index-th option in the TCP header. On success it returns a
|
||||
* structure filled with option information. If there is no index-th option,
|
||||
* it returns a structure with st.value==NULL. Note that this function does
|
||||
* not perform strict validity checking. It does check that the length claimed
|
||||
* by the options does not exceed the available buffer but it does not check,
|
||||
* for example, that the MSS option always contains a length of 4. Also,
|
||||
* if the returned option type is TCPOPT_EOL or TCPOPT_NOOP, the len field
|
||||
* would be set to zero and the "value" field should NOT be accessed, as it
|
||||
* will not contain reliable information. */
|
||||
nping_tcp_opt_t TCPHeader::getOption(unsigned int index) const {
|
||||
nping_tcp_opt_t *curr_opt=NULL;
|
||||
u8 *curr_pnt=(u8 *)this->h.options;
|
||||
int bytes_left=this->length - TCP_HEADER_LEN;
|
||||
assert((this->length - TCP_HEADER_LEN) == this->tcpoptlen);
|
||||
unsigned int optsfound=0;
|
||||
nping_tcp_opt_t result;
|
||||
memset(&result, 0, sizeof(nping_tcp_opt_t));
|
||||
|
||||
while(bytes_left>0){
|
||||
/* Use the opts structure as a template to access current option. It is
|
||||
* OK to use it because we only access the first two elements. */
|
||||
curr_opt=(nping_tcp_opt_t *)curr_pnt;
|
||||
|
||||
/* If we are right in the option that the caller wants, just return it */
|
||||
if(optsfound==index){
|
||||
result.type=curr_opt->type;
|
||||
if(result.type==TCPOPT_EOL || result.type==TCPOPT_NOOP)
|
||||
result.len=1;
|
||||
else
|
||||
result.len=curr_opt->len;
|
||||
result.value=(u8 *)curr_pnt+2;
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Otherwise, we have to parse it, so we can skip it and access the next
|
||||
* option */
|
||||
switch(curr_opt->type){
|
||||
|
||||
/* EOL or NOOP
|
||||
+-+-+-+-+-+-+-+-+
|
||||
| X |
|
||||
+-+-+-+-+-+-+-+-+ */
|
||||
case TCPOPT_EOL:
|
||||
case TCPOPT_NOOP:
|
||||
curr_pnt++; /* Skip one octet */
|
||||
bytes_left--;
|
||||
break;
|
||||
|
||||
/* TLV encoded option */
|
||||
default:
|
||||
/* If we don't have as many octets as the option advertises, the
|
||||
* option is bogus. Return failure. */
|
||||
if(bytes_left<curr_opt->len)
|
||||
return result;
|
||||
curr_pnt+=curr_opt->len;
|
||||
bytes_left-=curr_opt->len;
|
||||
break;
|
||||
}
|
||||
optsfound++;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/* Returns a textual representation of a TCP Options code */
|
||||
const char *TCPHeader::optcode2str(u8 optcode){
|
||||
switch(optcode){
|
||||
case TCPOPT_EOL:
|
||||
return "EOL";
|
||||
case TCPOPT_NOOP:
|
||||
return "NOOP";
|
||||
case TCPOPT_MSS:
|
||||
return "MSS";
|
||||
case TCPOPT_WSCALE:
|
||||
return "WScale";
|
||||
case TCPOPT_SACKOK:
|
||||
return "SAckOK";
|
||||
case TCPOPT_SACK:
|
||||
return "SAck";
|
||||
case TCPOPT_ECHOREQ:
|
||||
return "EchoReq";
|
||||
case TCPOPT_ECHOREP:
|
||||
return "EchoRep";
|
||||
case TCPOPT_TSTAMP:
|
||||
return "TStamp";
|
||||
case TCPOPT_POCP:
|
||||
return "POCP";
|
||||
case TCPOPT_POSP:
|
||||
return "POSP";
|
||||
case TCPOPT_CC:
|
||||
return "CC";
|
||||
case TCPOPT_CCNEW:
|
||||
return "CC.NEW";
|
||||
case TCPOPT_CCECHO:
|
||||
return "CC.ECHO";
|
||||
case TCPOPT_ALTCSUMREQ:
|
||||
return "AltSumReq";
|
||||
case TCPOPT_ALTCSUMDATA:
|
||||
return "AltSumData";
|
||||
case TCPOPT_MD5:
|
||||
return "MD5";
|
||||
case TCPOPT_SCPS:
|
||||
return "SCPS";
|
||||
case TCPOPT_SNACK:
|
||||
return "SNAck";
|
||||
case TCPOPT_QSRES:
|
||||
return "QStart";
|
||||
case TCPOPT_UTO:
|
||||
return "UTO";
|
||||
case TCPOPT_AO:
|
||||
return "AO";
|
||||
default:
|
||||
return "Unknown";
|
||||
}
|
||||
} /* End of optcode2str() */
|
||||
|
||||
|
||||
290
libnetutil/TCPHeader.h
Normal file
290
libnetutil/TCPHeader.h
Normal file
@@ -0,0 +1,290 @@
|
||||
|
||||
/***************************************************************************
|
||||
* TCPHeader.h -- The TCPHeader Class represents a TCP packet. It contains *
|
||||
* methods to set the different header fields. These methods tipically *
|
||||
* perform the necessary error checks and byte order conversions. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#ifndef __TCPHEADER_H__
|
||||
#define __TCPHEADER_H__ 1
|
||||
|
||||
#include "TransportLayerElement.h"
|
||||
|
||||
/* TCP FLAGS */
|
||||
#define TH_FIN 0x01
|
||||
#define TH_SYN 0x02
|
||||
#define TH_RST 0x04
|
||||
#define TH_PSH 0x08
|
||||
#define TH_ACK 0x10
|
||||
#define TH_URG 0x20
|
||||
#define TH_ECN 0x40
|
||||
#define TH_CWR 0x80
|
||||
|
||||
/* TCP OPTIONS */
|
||||
#define TCPOPT_EOL 0 /* End of Option List (RFC793) */
|
||||
#define TCPOPT_NOOP 1 /* No-Operation (RFC793) */
|
||||
#define TCPOPT_MSS 2 /* Maximum Segment Size (RFC793) */
|
||||
#define TCPOPT_WSCALE 3 /* WSOPT - Window Scale (RFC1323) */
|
||||
#define TCPOPT_SACKOK 4 /* SACK Permitted (RFC2018) */
|
||||
#define TCPOPT_SACK 5 /* SACK (RFC2018) */
|
||||
#define TCPOPT_ECHOREQ 6 /* Echo (obsolete) (RFC1072)(RFC6247) */
|
||||
#define TCPOPT_ECHOREP 7 /* Echo Reply (obsolete) (RFC1072)(RFC6247) */
|
||||
#define TCPOPT_TSTAMP 8 /* TSOPT - Time Stamp Option (RFC1323) */
|
||||
#define TCPOPT_POCP 9 /* Partial Order Connection Permitted (obsol.) */
|
||||
#define TCPOPT_POSP 10 /* Partial Order Service Profile (obsolete) */
|
||||
#define TCPOPT_CC 11 /* CC (obsolete) (RFC1644)(RFC6247) */
|
||||
#define TCPOPT_CCNEW 12 /* CC.NEW (obsolete) (RFC1644)(RFC6247) */
|
||||
#define TCPOPT_CCECHO 13 /* CC.ECHO (obsolete) (RFC1644)(RFC6247) */
|
||||
#define TCPOPT_ALTCSUMREQ 14 /* TCP Alternate Checksum Request (obsolete) */
|
||||
#define TCPOPT_ALTCSUMDATA 15 /* TCP Alternate Checksum Data (obsolete) */
|
||||
#define TCPOPT_MD5 19 /* MD5 Signature Option (obsolete) (RFC2385) */
|
||||
#define TCPOPT_SCPS 20 /* SCPS Capabilities */
|
||||
#define TCPOPT_SNACK 21 /* Selective Negative Acknowledgements */
|
||||
#define TCPOPT_QSRES 27 /* Quick-Start Response (RFC4782) */
|
||||
#define TCPOPT_UTO 28 /* User Timeout Option (RFC5482) */
|
||||
#define TCPOPT_AO 29 /* TCP Authentication Option (RFC5925) */
|
||||
|
||||
/* Internal constants */
|
||||
#define TCP_HEADER_LEN 20
|
||||
#define MAX_TCP_OPTIONS_LEN 40
|
||||
#define MAX_TCP_PAYLOAD_LEN 65495 /**< Max len of a TCP packet */
|
||||
|
||||
/* Default header values */
|
||||
#define TCP_DEFAULT_SPORT 20
|
||||
#define TCP_DEFAULT_DPORT 80
|
||||
#define TCP_DEFAULT_SEQ 0
|
||||
#define TCP_DEFAULT_ACK 0
|
||||
#define TCP_DEFAULT_FLAGS 0x02
|
||||
#define TCP_DEFAULT_WIN 8192
|
||||
#define TCP_DEFAULT_URP 0
|
||||
|
||||
|
||||
|
||||
/*
|
||||
+--------+--------+---------+--------...
|
||||
| Type | Len | Value
|
||||
+--------+--------+---------+--------...
|
||||
*/
|
||||
struct nping_tcp_opt {
|
||||
u8 type; /* Option type code. */
|
||||
u8 len; /* Option length. */
|
||||
u8 *value; /* Option value */
|
||||
}__attribute__((__packed__));
|
||||
typedef struct nping_tcp_opt nping_tcp_opt_t;
|
||||
|
||||
|
||||
class TCPHeader : public TransportLayerElement {
|
||||
|
||||
private:
|
||||
/*
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Source Port | Destination Port |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Sequence Number |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Acknowledgment Number |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Offset| Res. |C|E|U|A|P|R|S|F| Window |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Checksum | Urgent Pointer |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Options | Padding |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
*/
|
||||
struct nping_tcp_hdr {
|
||||
u16 th_sport; /* Source port */
|
||||
u16 th_dport; /* Destination port */
|
||||
u32 th_seq; /* Sequence number */
|
||||
u32 th_ack; /* Acknowledgement number */
|
||||
#if WORDS_BIGENDIAN
|
||||
u8 th_off:4; /* Data offset */
|
||||
u8 th_x2:4; /* Reserved */
|
||||
#else
|
||||
u8 th_x2:4; /* Reserved */
|
||||
u8 th_off:4; /* Data offset */
|
||||
#endif
|
||||
u8 th_flags; /* Flags */
|
||||
u16 th_win; /* Window size */
|
||||
u16 th_sum; /* Checksum */
|
||||
u16 th_urp; /* Urgent pointer */
|
||||
|
||||
u8 options[MAX_TCP_OPTIONS_LEN ]; /* Space for TCP Options */
|
||||
}__attribute__((__packed__));
|
||||
|
||||
typedef struct nping_tcp_hdr nping_tcp_hdr_t;
|
||||
|
||||
nping_tcp_hdr_t h;
|
||||
|
||||
int tcpoptlen; /**< Length of TCP options */
|
||||
|
||||
void __tcppacketoptinfo(const u8 *optp, int len, char *result, int bufsize) const;
|
||||
|
||||
public:
|
||||
|
||||
TCPHeader();
|
||||
~TCPHeader();
|
||||
void reset();
|
||||
u8 *getBufferPointer();
|
||||
int storeRecvData(const u8 *buf, size_t len);
|
||||
int protocol_id() const;
|
||||
int validate();
|
||||
int print(FILE *output, int detail) const;
|
||||
|
||||
int setSourcePort(u16 p);
|
||||
u16 getSourcePort() const;
|
||||
|
||||
int setDestinationPort(u16 p);
|
||||
u16 getDestinationPort() const;
|
||||
|
||||
int setSeq(u32 p);
|
||||
u32 getSeq() const;
|
||||
|
||||
int setAck(u32 p);
|
||||
u32 getAck() const;
|
||||
|
||||
int setOffset(u8 o);
|
||||
int setOffset();
|
||||
u8 getOffset() const;
|
||||
|
||||
int setReserved(u8 r);
|
||||
u8 getReserved() const;
|
||||
|
||||
int setFlags(u8 f);
|
||||
u8 getFlags() const;
|
||||
u16 getFlags16() const;
|
||||
bool setCWR();
|
||||
bool unsetCWR();
|
||||
bool getCWR() const;
|
||||
bool setECE();
|
||||
bool unsetECE();
|
||||
bool getECE() const;
|
||||
bool setECN();
|
||||
bool unsetECN();
|
||||
bool getECN() const;
|
||||
bool setURG();
|
||||
bool unsetURG();
|
||||
bool getURG() const;
|
||||
bool setACK();
|
||||
bool unsetACK();
|
||||
bool getACK() const;
|
||||
bool setPSH();
|
||||
bool unsetPSH();
|
||||
bool getPSH() const;
|
||||
bool setRST();
|
||||
bool unsetRST();
|
||||
bool getRST() const;
|
||||
bool setSYN();
|
||||
bool unsetSYN();
|
||||
bool getSYN() const;
|
||||
bool setFIN();
|
||||
bool unsetFIN();
|
||||
bool getFIN() const;
|
||||
|
||||
int setWindow(u16 p);
|
||||
u16 getWindow() const;
|
||||
|
||||
int setUrgPointer(u16 l);
|
||||
u16 getUrgPointer() const;
|
||||
|
||||
int setSum(u16 s);
|
||||
int setSum(struct in_addr source, struct in_addr destination);
|
||||
int setSum();
|
||||
int setSumRandom();
|
||||
int setSumRandom(struct in_addr source, struct in_addr destination);
|
||||
u16 getSum() const;
|
||||
|
||||
int setOptions(const u8 *optsbuff, size_t optslen);
|
||||
const u8 *getOptions(size_t *optslen) const;
|
||||
nping_tcp_opt_t getOption(unsigned int index) const;
|
||||
static const char *optcode2str(u8 optcode);
|
||||
|
||||
}; /* End of class TCPHeader */
|
||||
|
||||
#endif /* __TCPHEADER_H__ */
|
||||
156
libnetutil/TransportLayerElement.cc
Normal file
156
libnetutil/TransportLayerElement.cc
Normal file
@@ -0,0 +1,156 @@
|
||||
/***************************************************************************
|
||||
* TransportLayerElement.cc -- Class TransportLayerElement is a generic *
|
||||
* class that represents a transport layer protocol header. Classes like *
|
||||
* TCPHeader or UDPHeader inherit from it. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#include "TransportLayerElement.h"
|
||||
#include "IPv4Header.h"
|
||||
#include "IPv6Header.h"
|
||||
|
||||
|
||||
/** Computes and returns the Internet checksum.
|
||||
* @warning This method requires the object to be linked to either an IPv6Header
|
||||
* object or an IPv4Header one, so the caller must ensure that objects are
|
||||
* properly linked with calls to setNextElement() like this:
|
||||
*
|
||||
* IPv6Header ip6;
|
||||
* TCPHeader tcp;
|
||||
* [...] # Set header fields
|
||||
* ip6.setNextElement(&tcp);
|
||||
* tcp.setSum();
|
||||
*
|
||||
* Note that there can be a number of other headers (like IPv6 extension headers)
|
||||
* between the transport header and the network one, but all of them need to
|
||||
* be linked in order for this method to traverse the list of headers and find
|
||||
* the IP source and destination address, required to compute the checksum. So
|
||||
* things like the following are OK:
|
||||
*
|
||||
* IPv6Header ip6;
|
||||
* HopByHopHeader hop;
|
||||
* RoutingHeader rte;
|
||||
* FragmentHeader frg;
|
||||
* UDPHeader udp;
|
||||
* [...] # Set whatever header fields you need
|
||||
* ip6.setNextElement(&hop);
|
||||
* hop.setNextElement(&rte);
|
||||
* rte.setNextElement(&frg);
|
||||
* frg.setNextElement(&udp);
|
||||
* udp.setSum(); # setSum() will be able to reach the IPv6Header. */
|
||||
u16 TransportLayerElement::compute_checksum(){
|
||||
PacketElement *hdr;
|
||||
hdr=this->getPrevElement();
|
||||
u16 final_sum=0;
|
||||
/* Traverse the list of headers backwards until we find an IP header */
|
||||
while(hdr!=NULL){
|
||||
if (hdr->protocol_id()==HEADER_TYPE_IPv6){
|
||||
IPv6Header *v6hdr=(IPv6Header *)hdr;
|
||||
struct in6_addr i6src, i6dst;
|
||||
memcpy(i6src.s6_addr, v6hdr->getSourceAddress(), 16);
|
||||
memcpy(i6dst.s6_addr, v6hdr->getDestinationAddress(), 16);
|
||||
u8 *buff=(u8 *)safe_malloc(this->getLen());
|
||||
this->dumpToBinaryBuffer(buff, this->getLen());
|
||||
final_sum=ipv6_pseudoheader_cksum(&i6src, &i6dst, this->protocol_id(), this->getLen(), buff);
|
||||
free(buff);
|
||||
return final_sum;
|
||||
}else if(hdr->protocol_id()==HEADER_TYPE_IPv4){
|
||||
IPv4Header *v4hdr=(IPv4Header *)hdr;
|
||||
struct in_addr i4src, i4dst;
|
||||
memcpy(&(i4src.s_addr), v4hdr->getSourceAddress(), 4);
|
||||
memcpy(&(i4dst.s_addr), v4hdr->getDestinationAddress(), 4);
|
||||
u8 *buff=(u8 *)safe_malloc(this->getLen());
|
||||
this->dumpToBinaryBuffer(buff, this->getLen());
|
||||
final_sum=ipv4_pseudoheader_cksum(&i4src, &i4dst, this->protocol_id(), this->getLen(), buff);
|
||||
free(buff);
|
||||
return final_sum;
|
||||
}else{
|
||||
hdr=hdr->getPrevElement();
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} /* End of setSum() */
|
||||
121
libnetutil/TransportLayerElement.h
Normal file
121
libnetutil/TransportLayerElement.h
Normal file
@@ -0,0 +1,121 @@
|
||||
/***************************************************************************
|
||||
* TransportLayerElement.cc -- Class TransportLayerElement is a generic *
|
||||
* class that represents a transport layer protocol header. Classes like *
|
||||
* TCPHeader or UDPHeader inherit from it. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#ifndef TRANSPORTLAYERELEMENT_H
|
||||
#define TRANSPORTLAYERELEMENT_H 1
|
||||
|
||||
#include "PacketElement.h"
|
||||
|
||||
/// class TransportLayerElement -
|
||||
class TransportLayerElement : public PacketElement {
|
||||
|
||||
public:
|
||||
|
||||
/* Returns source port. */
|
||||
virtual u16 getSourcePort() const = 0;
|
||||
|
||||
/* Sets source port. */
|
||||
virtual int setSourcePort(u16 val) = 0;
|
||||
|
||||
/* Returns destination port. */
|
||||
virtual u16 getDestinationPort() const = 0;
|
||||
|
||||
/* Sets destination port. */
|
||||
virtual int setDestinationPort(u16 val) = 0;
|
||||
|
||||
/* Sets checksum. */
|
||||
virtual int setSum(u16 val) = 0;
|
||||
|
||||
protected:
|
||||
u16 compute_checksum();
|
||||
};
|
||||
|
||||
#endif
|
||||
329
libnetutil/UDPHeader.cc
Normal file
329
libnetutil/UDPHeader.cc
Normal file
@@ -0,0 +1,329 @@
|
||||
|
||||
/***************************************************************************
|
||||
* UDPHeader.cc -- The UDPHeader Class represents a UDP packet. It *
|
||||
* contains methods to set the different header fields. These methods *
|
||||
* tipically perform the necessary error checks and byte order *
|
||||
* conversions. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#include "UDPHeader.h"
|
||||
|
||||
/******************************************************************************/
|
||||
/* CONTRUCTORS, DESTRUCTORS AND INITIALIZATION METHODS */
|
||||
/******************************************************************************/
|
||||
UDPHeader::UDPHeader(){
|
||||
this->reset();
|
||||
} /* End of UDPHeader constructor */
|
||||
|
||||
|
||||
UDPHeader::~UDPHeader(){
|
||||
|
||||
} /* End of UDPHeader destructor */
|
||||
|
||||
|
||||
/** Sets every attribute to its default value */
|
||||
void UDPHeader::reset(){
|
||||
this->length=UDP_HEADER_LEN;
|
||||
this->setSourcePort(UDP_DEFAULT_SPORT);
|
||||
this->setDestinationPort(UDP_DEFAULT_DPORT);
|
||||
this->setTotalLength(UDP_HEADER_LEN);
|
||||
this->setSum(0);
|
||||
} /* End of reset() */
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* PacketElement:: OVERWRITTEN METHODS */
|
||||
/******************************************************************************/
|
||||
|
||||
/** @warning This method is essential for the superclass getBinaryBuffer()
|
||||
* method to work. Do NOT change a thing unless you know what you're doing */
|
||||
u8 * UDPHeader::getBufferPointer(){
|
||||
return (u8*)(&h);
|
||||
} /* End of getBufferPointer() */
|
||||
|
||||
|
||||
/** Stores supplied packet in the internal buffer so the information
|
||||
* can be accessed using the standard get & set methods.
|
||||
* @warning The UDPHeader class is able to hold a maximum of 8 bytes. If the
|
||||
* supplied buffer is longer than that, only the first 8 bytes will be stored
|
||||
* in the internal buffer.
|
||||
* @warning Supplied len MUST be at least 8 bytes (UDP header length).
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error */
|
||||
int UDPHeader::storeRecvData(const u8 *buf, size_t len){
|
||||
if(buf==NULL || len<UDP_HEADER_LEN){
|
||||
return OP_FAILURE;
|
||||
}else{
|
||||
this->reset(); /* Re-init the object, just in case the caller had used it already */
|
||||
this->length=UDP_HEADER_LEN;
|
||||
memcpy(&(this->h), buf, UDP_HEADER_LEN);
|
||||
}
|
||||
return OP_SUCCESS;
|
||||
} /* End of storeRecvData() */
|
||||
|
||||
|
||||
/* Returns a protocol identifier. This is used by packet parsing funtions
|
||||
* that return linked lists of PacketElement objects, to determine the protocol
|
||||
* the object represents. */
|
||||
int UDPHeader::protocol_id() const {
|
||||
return HEADER_TYPE_UDP;
|
||||
} /* End of protocol_id() */
|
||||
|
||||
|
||||
/** Determines if the data stored in the object after an storeRecvData() call
|
||||
* is valid and safe to use. This mainly checks the length of the data but may
|
||||
* also test the value of certain protocol fields to ensure their correctness.
|
||||
* @return the length, in bytes, of the header, if its found to be valid or
|
||||
* OP_FAILURE (-1) otherwise. */
|
||||
int UDPHeader::validate(){
|
||||
if( this->length!=UDP_HEADER_LEN)
|
||||
return OP_FAILURE;
|
||||
else
|
||||
return UDP_HEADER_LEN;
|
||||
} /* End of validate() */
|
||||
|
||||
|
||||
/** Prints the contents of the header and calls print() on the next protocol
|
||||
* header in the chain (if there is any).
|
||||
* @return OP_SUCCESS on success and OP_FAILURE in case of error. */
|
||||
int UDPHeader::print(FILE *output, int detail) const {
|
||||
fprintf(output, "UDP[");
|
||||
fprintf(output, "%d", this->getSourcePort());
|
||||
fprintf(output, " >");
|
||||
fprintf(output, " %d", this->getDestinationPort());
|
||||
if(detail>=PRINT_DETAIL_HIGH)
|
||||
fprintf(output, " len=%d", (int)this->getTotalLength() );
|
||||
if(detail>=PRINT_DETAIL_MED)
|
||||
fprintf(output, " csum=0x%04X", ntohs( this->getSum() ));
|
||||
fprintf(output, "]");
|
||||
if(this->next!=NULL){
|
||||
print_separator(output, detail);
|
||||
next->print(output, detail);
|
||||
}
|
||||
return OP_SUCCESS;
|
||||
} /* End of print() */
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* PROTOCOL-SPECIFIC METHODS */
|
||||
/******************************************************************************/
|
||||
|
||||
/** Sets source port.
|
||||
* @warning Port must be supplied in host byte order. This method performs
|
||||
* byte order conversion using htons() */
|
||||
int UDPHeader::setSourcePort(u16 p){
|
||||
h.uh_sport = htons(p);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSrcPort() */
|
||||
|
||||
|
||||
/** Returns source port in HOST byte order */
|
||||
u16 UDPHeader::getSourcePort() const {
|
||||
return ntohs(h.uh_sport);
|
||||
} /* End of getSrcPort() */
|
||||
|
||||
|
||||
/** Sets destination port.
|
||||
* @warning Port must be supplied in host byte order. This method performs
|
||||
* byte order conversion using htons() */
|
||||
int UDPHeader::setDestinationPort(u16 p){
|
||||
h.uh_dport = htons(p);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setDstPort() */
|
||||
|
||||
|
||||
/** Returns destination port in HOST byte order */
|
||||
u16 UDPHeader::getDestinationPort() const {
|
||||
return ntohs(h.uh_dport);
|
||||
} /* End of getDstPort() */
|
||||
|
||||
|
||||
int UDPHeader::setSum(struct in_addr src, struct in_addr dst){
|
||||
int bufflen;
|
||||
u8 aux[ 65535-8 ];
|
||||
/* FROM: RFC 5405 Unicast UDP Usage Guidelines, November 2008
|
||||
* "A UDP datagram is carried in a single IP packet and is hence limited to
|
||||
* a maximum payload of 65,507 bytes for IPv4 and 65,527 bytes for IPv6"
|
||||
*
|
||||
* So, UDP is supposed to be able to carry 65535-8 bytes but in fact it can
|
||||
* only carry 65,507 or 65,527. However, we are not taking that into account
|
||||
* here because UDP is supposed to be independent of IPv4, IPv6 or
|
||||
* whatever other network layer protocol is used to carry the UDP datagrams.*/
|
||||
h.uh_sum = 0;
|
||||
|
||||
/* Copy packet contents to a buffer */
|
||||
bufflen=dumpToBinaryBuffer(aux, 65536-8 );
|
||||
|
||||
/* Compute checksum */
|
||||
h.uh_sum = ipv4_pseudoheader_cksum(&src, &dst, IPPROTO_UDP,bufflen, (char *) aux);
|
||||
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSum() */
|
||||
|
||||
|
||||
/** @warning Sum is set to supplied value with NO byte ordering conversion
|
||||
* performed. */
|
||||
int UDPHeader::setSum(u16 s){
|
||||
h.uh_sum = s;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSum() */
|
||||
|
||||
|
||||
int UDPHeader::setSum(){
|
||||
this->h.uh_sum=0;
|
||||
this->h.uh_sum = this->compute_checksum();
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSum() */
|
||||
|
||||
|
||||
/** Set the UDP checksum field to a random value, which may accidentally
|
||||
* match the correct checksum */
|
||||
int UDPHeader::setSumRandom(){
|
||||
h.uh_sum=(1 + (get_random_u16()%(65535-1))); /* Discard value zero */
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSumRandom() */
|
||||
|
||||
|
||||
/** Set the UDP checksum field to a random value. It takes the source and
|
||||
* destination address to make sure the random generated sum does not
|
||||
* accidentally match the correct checksum. This function only handles
|
||||
* IPv4 address. */
|
||||
int UDPHeader::setSumRandom(struct in_addr source, struct in_addr destination){
|
||||
u16 correct_csum=0;
|
||||
/* Compute the correct checksum */
|
||||
this->setSum(source, destination);
|
||||
correct_csum=this->getSum();
|
||||
/* Generate numbers until one does not match the correct sum */
|
||||
while( (h.uh_sum=(1 + (get_random_u16()%(65535-1))))==correct_csum);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSumRandom() */
|
||||
|
||||
|
||||
u16 UDPHeader::getSum() const {
|
||||
return h.uh_sum;
|
||||
} /* End of getSum() */
|
||||
|
||||
|
||||
int UDPHeader::setTotalLength(){
|
||||
int mylen = 8;
|
||||
int otherslen=0;
|
||||
|
||||
if (next!=NULL)
|
||||
otherslen=next->getLen();
|
||||
|
||||
/* FROM: RFC 5405 Unicast UDP Usage Guidelines, November 2008
|
||||
* "A UDP datagram is carried in a single IP packet and is hence limited to
|
||||
* a maximum payload of 65,507 bytes for IPv4 and 65,527 bytes for IPv6"
|
||||
*
|
||||
* So, UDP is supposed to be able to carry 65535-8 bytes but in fact it can
|
||||
* only carry 65,507 or 65,527. However, we are not taking that into account
|
||||
* here because UDP is supposed to be independent of IPv4, IPv6 or
|
||||
* whatever other network layer protocol is used to carry the UDP datagrams.*/
|
||||
if ((mylen+otherslen) > 65535 || (mylen+otherslen)<8 ){
|
||||
printf("UDPHeader::setTotalLenght(): Invalid length.\n");
|
||||
return OP_FAILURE;
|
||||
}
|
||||
|
||||
h.uh_ulen=htons( mylen+otherslen );
|
||||
|
||||
return OP_SUCCESS;
|
||||
} /* End of setTotalLenght() */
|
||||
|
||||
|
||||
/** @warning Supplied value MUST be in HOST byte order */
|
||||
int UDPHeader::setTotalLength(u16 l){
|
||||
this->h.uh_ulen=htons(l);
|
||||
return OP_SUCCESS;
|
||||
} /* End of setTotalLenght() */
|
||||
|
||||
|
||||
/** @warning Returned value is in HOST byte order */
|
||||
u16 UDPHeader::getTotalLength() const {
|
||||
return ntohs(this->h.uh_ulen);
|
||||
} /* End of getTotalLenght() */
|
||||
|
||||
|
||||
158
libnetutil/UDPHeader.h
Normal file
158
libnetutil/UDPHeader.h
Normal file
@@ -0,0 +1,158 @@
|
||||
|
||||
/***************************************************************************
|
||||
* UDPHeader.h -- The UDPHeader Class represents a UDP packet. It contains *
|
||||
* methods to set the different header fields. These methods tipically *
|
||||
* perform the necessary error checks and byte order conversions. *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
/* This code was originally part of the Nping tool. */
|
||||
|
||||
#ifndef UDPHEADER_H
|
||||
#define UDPHEADER_H 1
|
||||
|
||||
#include "TransportLayerElement.h"
|
||||
|
||||
#define UDP_HEADER_LEN 8
|
||||
|
||||
/* Default header values */
|
||||
#define UDP_DEFAULT_SPORT 53
|
||||
#define UDP_DEFAULT_DPORT 53
|
||||
|
||||
class UDPHeader : public TransportLayerElement {
|
||||
|
||||
private:
|
||||
/*
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Source Port | Destination Port |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Length | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
*/
|
||||
struct nping_udp_hdr{
|
||||
u16 uh_sport;
|
||||
u16 uh_dport;
|
||||
u16 uh_ulen;
|
||||
u16 uh_sum;
|
||||
}__attribute__((__packed__));
|
||||
|
||||
typedef struct nping_udp_hdr nping_udp_hdr_t;
|
||||
|
||||
nping_udp_hdr_t h;
|
||||
|
||||
public:
|
||||
|
||||
UDPHeader();
|
||||
~UDPHeader();
|
||||
void reset();
|
||||
u8 *getBufferPointer();
|
||||
int storeRecvData(const u8 *buf, size_t len);
|
||||
int protocol_id() const;
|
||||
int validate();
|
||||
int print(FILE *output, int detail) const;
|
||||
|
||||
int setSourcePort(u16 p);
|
||||
u16 getSourcePort() const;
|
||||
|
||||
int setDestinationPort(u16 p);
|
||||
u16 getDestinationPort() const;
|
||||
|
||||
int setTotalLength();
|
||||
int setTotalLength(u16 l);
|
||||
u16 getTotalLength() const;
|
||||
|
||||
int setSum(struct in_addr source, struct in_addr destination);
|
||||
int setSum(u16 s);
|
||||
int setSum();
|
||||
int setSumRandom();
|
||||
int setSumRandom(struct in_addr source, struct in_addr destination);
|
||||
u16 getSum() const;
|
||||
|
||||
}; /* End of class UDPHeader */
|
||||
|
||||
|
||||
#endif
|
||||
@@ -74,10 +74,52 @@
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="ARPHeader.cc" />
|
||||
<ClCompile Include="DestOptsHeader.cc" />
|
||||
<ClCompile Include="EthernetHeader.cc" />
|
||||
<ClCompile Include="FragmentHeader.cc" />
|
||||
<ClCompile Include="HopByHopHeader.cc" />
|
||||
<ClCompile Include="ICMPv4Header.cc" />
|
||||
<ClCompile Include="ICMPv6Header.cc" />
|
||||
<ClCompile Include="ICMPv6Option.cc" />
|
||||
<ClCompile Include="ICMPv6RRBody.cc" />
|
||||
<ClCompile Include="IPv4Header.cc" />
|
||||
<ClCompile Include="IPv6Header.cc" />
|
||||
<ClCompile Include="netutil.cc" />
|
||||
<ClCompile Include="NetworkLayerElement.cc" />
|
||||
<ClCompile Include="PacketElement.cc" />
|
||||
<ClCompile Include="PacketParser.cc" />
|
||||
<ClCompile Include="RawData.cc" />
|
||||
<ClCompile Include="RoutingHeader.cc" />
|
||||
<ClCompile Include="TCPHeader.cc" />
|
||||
<ClCompile Include="TransportLayerElement.cc" />
|
||||
<ClCompile Include="UDPHeader.cc" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="ApplicationLayerElement.h" />
|
||||
<ClInclude Include="ARPHeader.h" />
|
||||
<ClInclude Include="DataLinkLayerElement.h" />
|
||||
<ClInclude Include="DestOptsHeader.h" />
|
||||
<ClInclude Include="EthernetHeader.h" />
|
||||
<ClInclude Include="FragmentHeader.h" />
|
||||
<ClInclude Include="HopByHopHeader.h" />
|
||||
<ClInclude Include="ICMPHeader.h" />
|
||||
<ClInclude Include="ICMPv4Header.h" />
|
||||
<ClInclude Include="ICMPv6Header.h" />
|
||||
<ClInclude Include="ICMPv6Option.h" />
|
||||
<ClInclude Include="ICMPv6RRBody.h" />
|
||||
<ClInclude Include="IPv4Header.h" />
|
||||
<ClInclude Include="IPv6Header.h" />
|
||||
<ClInclude Include="netutil.h" />
|
||||
<ClInclude Include="NetworkLayerElement.h" />
|
||||
<ClInclude Include="npacket.h" />
|
||||
<ClInclude Include="PacketElement.h" />
|
||||
<ClInclude Include="PacketParser.h" />
|
||||
<ClInclude Include="RawData.h" />
|
||||
<ClInclude Include="RoutingHeader.h" />
|
||||
<ClInclude Include="TCPHeader.h" />
|
||||
<ClInclude Include="TransportLayerElement.h" />
|
||||
<ClInclude Include="UDPHeader.h" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
|
||||
@@ -1677,14 +1677,18 @@ int islocalhost(const struct sockaddr_storage *const ss) {
|
||||
/* Determines whether the supplied address corresponds to a private,
|
||||
* non-Internet-routable address. See RFC1918 for details.
|
||||
* Returns 1 if the address is private or 0 otherwise. */
|
||||
int isipprivate(const struct in_addr *const addr) {
|
||||
int isipprivate(const struct sockaddr_storage *addr) {
|
||||
const struct sockaddr_in *sin;
|
||||
char *ipc;
|
||||
unsigned char i1, i2;
|
||||
|
||||
if (!addr)
|
||||
return 0;
|
||||
if (addr->ss_family != AF_INET)
|
||||
return 0;
|
||||
sin = (struct sockaddr_in *) addr;
|
||||
|
||||
ipc = (char *) &(addr->s_addr);
|
||||
ipc = (char *) &(sin->sin_addr.s_addr);
|
||||
i1 = ipc[0];
|
||||
i2 = ipc[1];
|
||||
|
||||
|
||||
@@ -106,6 +106,10 @@ extern "C" {
|
||||
|
||||
#include "dnet.h"
|
||||
|
||||
|
||||
/* It is VERY important to never change the value of these two constants.
|
||||
* Specially, OP_FAILURE should never be positive, as some pieces of code take
|
||||
* that for granted. */
|
||||
enum { OP_FAILURE = -1, OP_SUCCESS = 0 };
|
||||
|
||||
|
||||
@@ -383,7 +387,7 @@ int islocalhost(const struct sockaddr_storage *const ss);
|
||||
/* Determines whether the supplied address corresponds to a private,
|
||||
* non-Internet-routable address. See RFC1918 for details.
|
||||
* Returns 1 if the address is private or 0 otherwise. */
|
||||
int isipprivate(const struct in_addr *const addr);
|
||||
int isipprivate(const struct sockaddr_storage *addr);
|
||||
|
||||
/* Takes binary data found in the IP Options field of an IPv4 packet
|
||||
* and returns a string containing an ASCII description of the options
|
||||
|
||||
119
libnetutil/npacket.cc
Normal file
119
libnetutil/npacket.cc
Normal file
@@ -0,0 +1,119 @@
|
||||
|
||||
/***************************************************************************
|
||||
* netutil.h -- The main include file exposing the external API for *
|
||||
* libnetutil, a library that provides network-related functions or *
|
||||
* classes that make it easier to handle things like network interfaces, *
|
||||
* routing tables, raw packet manipulation, etc. The lib was originally *
|
||||
* written for use in the Nmap Security Scanner ( http://nmap.org ). *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
|
||||
/* Uncomment the following lines to enable debugging output */
|
||||
//#ifndef NPACKET_DEBUG
|
||||
//#define NPACKET_DEBUG 1
|
||||
//#endif
|
||||
|
||||
/* Print debug messages to stdout and then return. A newline
|
||||
* character is printed automatically after the supplied text.*/
|
||||
void npacket_debug(const char *str, ...){
|
||||
#ifdef NPACKET_DEBUG
|
||||
va_list list;
|
||||
char errstr[1025];
|
||||
memset(errstr,0, 1024);
|
||||
va_start(list, str);
|
||||
fflush(stdout);
|
||||
vfprintf(stdout, str, list);
|
||||
fprintf(stdout,"\n");
|
||||
va_end(list);
|
||||
#endif
|
||||
} /* End of npacket_debug() */
|
||||
|
||||
|
||||
128
libnetutil/npacket.h
Normal file
128
libnetutil/npacket.h
Normal file
@@ -0,0 +1,128 @@
|
||||
|
||||
/***************************************************************************
|
||||
* netutil.h -- The main include file exposing the external API for *
|
||||
* libnetutil, a library that provides network-related functions or *
|
||||
* classes that make it easier to handle things like network interfaces, *
|
||||
* routing tables, raw packet manipulation, etc. The lib was originally *
|
||||
* written for use in the Nmap Security Scanner ( http://nmap.org ). *
|
||||
* *
|
||||
***********************IMPORTANT NMAP LICENSE TERMS************************
|
||||
* *
|
||||
* The Nmap Security Scanner is (C) 1996-2011 Insecure.Com LLC. Nmap is *
|
||||
* also a registered trademark of Insecure.Com LLC. This program is free *
|
||||
* software; you may redistribute and/or modify it under the terms of the *
|
||||
* GNU General Public License as published by the Free Software *
|
||||
* Foundation; Version 2 with the clarifications and exceptions described *
|
||||
* below. This guarantees your right to use, modify, and redistribute *
|
||||
* this software under certain conditions. If you wish to embed Nmap *
|
||||
* technology into proprietary software, we sell alternative licenses *
|
||||
* (contact sales@insecure.com). Dozens of software vendors already *
|
||||
* license Nmap technology such as host discovery, port scanning, OS *
|
||||
* detection, and version detection. *
|
||||
* *
|
||||
* Note that the GPL places important restrictions on "derived works", yet *
|
||||
* it does not provide a detailed definition of that term. To avoid *
|
||||
* misunderstandings, we consider an application to constitute a *
|
||||
* "derivative work" for the purpose of this license if it does any of the *
|
||||
* following: *
|
||||
* o Integrates source code from Nmap *
|
||||
* o Reads or includes Nmap copyrighted data files, such as *
|
||||
* nmap-os-db or nmap-service-probes. *
|
||||
* o Executes Nmap and parses the results (as opposed to typical shell or *
|
||||
* execution-menu apps, which simply display raw Nmap output and so are *
|
||||
* not derivative works.) *
|
||||
* o Integrates/includes/aggregates Nmap into a proprietary executable *
|
||||
* installer, such as those produced by InstallShield. *
|
||||
* o Links to a library or executes a program that does any of the above *
|
||||
* *
|
||||
* The term "Nmap" should be taken to also include any portions or derived *
|
||||
* works of Nmap. This list is not exclusive, but is meant to clarify our *
|
||||
* interpretation of derived works with some common examples. Our *
|
||||
* interpretation applies only to Nmap--we don't speak for other people's *
|
||||
* GPL works. *
|
||||
* *
|
||||
* If you have any questions about the GPL licensing restrictions on using *
|
||||
* Nmap in non-GPL works, we would be happy to help. As mentioned above, *
|
||||
* we also offer alternative license to integrate Nmap into proprietary *
|
||||
* applications and appliances. These contracts have been sold to dozens *
|
||||
* of software vendors, and generally include a perpetual license as well *
|
||||
* as providing for priority support and updates as well as helping to *
|
||||
* fund the continued development of Nmap technology. Please email *
|
||||
* sales@insecure.com for further information. *
|
||||
* *
|
||||
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||
* permission to link the code of this program with any version of the *
|
||||
* OpenSSL library which is distributed under a license identical to that *
|
||||
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||
* respects for all of the code used other than OpenSSL. If you modify *
|
||||
* this file, you may extend this exception to your version of the file, *
|
||||
* but you are not obligated to do so. *
|
||||
* *
|
||||
* If you received these files with a written license agreement or *
|
||||
* contract stating terms other than the terms above, then that *
|
||||
* alternative license agreement takes precedence over these comments. *
|
||||
* *
|
||||
* Source is provided to this software because we believe users have a *
|
||||
* right to know exactly what a program is going to do before they run it. *
|
||||
* This also allows you to audit the software for security holes (none *
|
||||
* have been found so far). *
|
||||
* *
|
||||
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||
* and add new features. You are highly encouraged to send your changes *
|
||||
* to nmap-dev@insecure.org for possible incorporation into the main *
|
||||
* distribution. By sending these changes to Fyodor or one of the *
|
||||
* Insecure.Org development mailing lists, it is assumed that you are *
|
||||
* offering the Nmap Project (Insecure.Com LLC) the unlimited, *
|
||||
* non-exclusive right to reuse, modify, and relicense the code. Nmap *
|
||||
* will always be available Open Source, but this is important because the *
|
||||
* inability to relicense code has caused devastating problems for other *
|
||||
* Free Software projects (such as KDE and NASM). We also occasionally *
|
||||
* relicense the code to third parties as discussed above. If you wish to *
|
||||
* specify special license conditions of your contributions, just say so *
|
||||
* when you send them. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License v2.0 for more details at *
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html , or in the COPYING file *
|
||||
* included with Nmap. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
/* $Id: npacket.h 18098 2010-06-14 11:50:12Z luis $ */
|
||||
|
||||
#ifndef __NPACKET_H__
|
||||
#define __NPACKET_H__ 1
|
||||
|
||||
|
||||
#include "ApplicationLayerElement.h"
|
||||
#include "ARPHeader.h"
|
||||
#include "DataLinkLayerElement.h"
|
||||
#include "EthernetHeader.h"
|
||||
#include "ICMPHeader.h"
|
||||
#include "ICMPv4Header.h"
|
||||
#include "ICMPv6Header.h"
|
||||
#include "ICMPv6Option.h"
|
||||
#include "ICMPv6RRBody.h"
|
||||
#include "IPv4Header.h"
|
||||
#include "IPv6Header.h"
|
||||
#include "NetworkLayerElement.h"
|
||||
#include "PacketElement.h"
|
||||
#include "RawData.h"
|
||||
#include "TCPHeader.h"
|
||||
#include "TransportLayerElement.h"
|
||||
#include "UDPHeader.h"
|
||||
#include "HopByHopHeader.h"
|
||||
#include "DestOptsHeader.h"
|
||||
#include "FragmentHeader.h"
|
||||
#include "RoutingHeader.h"
|
||||
#include "PacketParser.h"
|
||||
|
||||
void npacket_debug(const char *str, ...)
|
||||
__attribute__ ((noreturn))
|
||||
__attribute__ ((format (printf, 1, 2)));
|
||||
|
||||
#endif /* __NPACKET_H__ */
|
||||
|
||||
@@ -175,6 +175,9 @@ them both to 0; an emulation function will be used. */
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#undef PACKAGE_TARNAME
|
||||
|
||||
/* Define to the home page for this package. */
|
||||
#undef PACKAGE_URL
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#undef PACKAGE_VERSION
|
||||
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
Microsoft Visual Studio Solution File, Format Version 11.00
|
||||
# Visual Studio 2010
|
||||
# Visual C++ Express 2010
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nmap", "nmap.vcxproj", "{361719F0-AB42-4C93-9DE8-7D2144B96625}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{99157C3F-39F6-4663-99D7-1D9C1484494E} = {99157C3F-39F6-4663-99D7-1D9C1484494E}
|
||||
{A7BE3D76-F20C-40C5-8986-DE4028B3B57D} = {A7BE3D76-F20C-40C5-8986-DE4028B3B57D}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nsock", "..\nsock\nsock.vcxproj", "{F8D6D1E3-D4EA-402C-98AA-168E5309BAF4}"
|
||||
@@ -21,6 +22,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nping", "..\nping\nping.vcx
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libnetutil", "..\libnetutil\libnetutil.vcxproj", "{99157C3F-39F6-4663-99D7-1D9C1484494E}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "liblinear", "..\liblinear\liblinear.vcxproj", "{A7BE3D76-F20C-40C5-8986-DE4028B3B57D}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
@@ -76,6 +79,12 @@ Global
|
||||
{99157C3F-39F6-4663-99D7-1D9C1484494E}.Ncat Static|Win32.ActiveCfg = Release|Win32
|
||||
{99157C3F-39F6-4663-99D7-1D9C1484494E}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{99157C3F-39F6-4663-99D7-1D9C1484494E}.Release|Win32.Build.0 = Release|Win32
|
||||
{A7BE3D76-F20C-40C5-8986-DE4028B3B57D}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{A7BE3D76-F20C-40C5-8986-DE4028B3B57D}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{A7BE3D76-F20C-40C5-8986-DE4028B3B57D}.Ncat Static|Win32.ActiveCfg = Release|Win32
|
||||
{A7BE3D76-F20C-40C5-8986-DE4028B3B57D}.Ncat Static|Win32.Build.0 = Release|Win32
|
||||
{A7BE3D76-F20C-40C5-8986-DE4028B3B57D}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{A7BE3D76-F20C-40C5-8986-DE4028B3B57D}.Release|Win32.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\liblua;.;..;../nbase;../libpcre;winip;..\nsock\include;pcap-include;..\libdnet-stripped\include;OpenSSL\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>..\liblua;.;..;../nbase;../libpcre;winip;..\nsock\include;pcap-include;..\libdnet-stripped\include;OpenSSL\include;..\liblinear;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessToFile>false</PreprocessToFile>
|
||||
<PreprocessSuppressLineNumbers>false</PreprocessSuppressLineNumbers>
|
||||
@@ -73,10 +73,10 @@
|
||||
<CompileAs>CompileAsCpp</CompileAs>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>liblua.lib;nsock.lib;libpcre.lib;nbase.lib;libdnet-stripped.lib;ws2_32.lib;IPHlpAPI.Lib;wpcap.lib;packet.lib;advapi32.lib;libeay32.lib;ssleay32.lib;shell32.lib;libnetutil.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>liblua.lib;nsock.lib;libpcre.lib;nbase.lib;libdnet-stripped.lib;liblinear.lib;ws2_32.lib;IPHlpAPI.Lib;wpcap.lib;packet.lib;advapi32.lib;libeay32.lib;ssleay32.lib;shell32.lib;libnetutil.lib</AdditionalDependencies>
|
||||
<OutputFile>.\Debug\nmap.exe</OutputFile>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<AdditionalLibraryDirectories>lib;..\liblua;..\libpcre;..\nsock;..\nbase;..\libdnet-stripped;../libnetutil;OpenSSL\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalLibraryDirectories>lib;..\liblua;..\libpcre;..\nsock;..\nbase;..\libdnet-stripped;../libnetutil;OpenSSL\lib;..\liblinear;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
|
||||
<DelayLoadDLLs>packet.dll;wpcap.dll;iphlpapi.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
@@ -100,7 +100,7 @@
|
||||
<ClCompile>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||
<AdditionalIncludeDirectories>.;..;../liblua;../nbase;../libpcre;winip;..\nsock\include;pcap-include;..\libdnet-stripped\include;OpenSSL\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>.;..;../liblua;../nbase;../libpcre;winip;..\nsock\include;pcap-include;..\libdnet-stripped\include;OpenSSL\include;..\liblinear;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>true</StringPooling>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
@@ -115,10 +115,10 @@
|
||||
<CompileAs>CompileAsCpp</CompileAs>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>liblua.lib;nsock.lib;libpcre.lib;nbase.lib;libdnet-stripped.lib;ws2_32.lib;IPHlpAPI.Lib;wpcap.lib;packet.lib;advapi32.lib;libeay32.lib;ssleay32.lib;shell32.lib;libnetutil.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>liblua.lib;nsock.lib;libpcre.lib;nbase.lib;libdnet-stripped.lib;liblinear.lib;ws2_32.lib;IPHlpAPI.Lib;wpcap.lib;packet.lib;advapi32.lib;libeay32.lib;ssleay32.lib;shell32.lib;libnetutil.lib</AdditionalDependencies>
|
||||
<OutputFile>.\Release/nmap.exe</OutputFile>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<AdditionalLibraryDirectories>lib;..\liblua;..\libpcre;..\nsock;..\nbase;..\libdnet-stripped;../libnetutil;OpenSSL\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalLibraryDirectories>lib;..\liblua;..\libpcre;..\nsock;..\nbase;..\libdnet-stripped;../libnetutil;OpenSSL\lib;..\liblinear;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
|
||||
<DelayLoadDLLs>packet.dll;wpcap.dll;iphlpapi.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
|
||||
<ProgramDatabaseFile>.\Release/nmap.pdb</ProgramDatabaseFile>
|
||||
@@ -134,6 +134,8 @@
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\charpool.cc" />
|
||||
<ClCompile Include="..\FingerPrintResults.cc" />
|
||||
<ClCompile Include="..\FPEngine.cc" />
|
||||
<ClCompile Include="..\FPmodel.cc" />
|
||||
<ClCompile Include="..\idle_scan.cc" />
|
||||
<ClCompile Include="..\MACLookup.cc" />
|
||||
<ClCompile Include="..\main.cc" />
|
||||
@@ -185,6 +187,7 @@
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\charpool.h" />
|
||||
<ClInclude Include="..\FingerPrintResults.h" />
|
||||
<ClInclude Include="..\FPEngine.h" />
|
||||
<ClInclude Include="..\global_structures.h" />
|
||||
<ClInclude Include="..\idle_scan.h" />
|
||||
<ClInclude Include="..\MACLookup.h" />
|
||||
|
||||
13
nmap.cc
13
nmap.cc
@@ -940,8 +940,7 @@ void parse_options(int argc, char **argv) {
|
||||
o.script = 1;
|
||||
#endif
|
||||
if (o.isr00t) {
|
||||
if (o.af() == AF_INET)
|
||||
o.osscan++;
|
||||
o.osscan++;
|
||||
o.traceroute = true;
|
||||
}
|
||||
break;
|
||||
@@ -1306,8 +1305,10 @@ void apply_delayed_options() {
|
||||
if (delayed_options.pre_host_timeout != -1) o.host_timeout = delayed_options.pre_host_timeout;
|
||||
|
||||
|
||||
if (o.osscan)
|
||||
if (o.osscan) {
|
||||
o.reference_FPs = parse_fingerprint_reference_file("nmap-os-db");
|
||||
o.os_labels_ipv6 = load_fp_matches();
|
||||
}
|
||||
|
||||
validate_scan_lists(ports,o);
|
||||
o.ValidateOptions();
|
||||
@@ -1945,8 +1946,10 @@ int nmap_main(int argc, char *argv[]) {
|
||||
}
|
||||
}
|
||||
|
||||
if (o.osscan)
|
||||
os_scan2(Targets);
|
||||
if (o.osscan){
|
||||
OSScan os_engine;
|
||||
os_engine.os_scan(Targets);
|
||||
}
|
||||
|
||||
if (o.traceroute)
|
||||
traceroute(Targets);
|
||||
|
||||
4
nmap.h
4
nmap.h
@@ -252,8 +252,8 @@ void *realloc();
|
||||
#ifndef NMAP_VERSION
|
||||
/* Edit this definition only within the quotes, because it is read from this
|
||||
file by the makefiles. */
|
||||
#define NMAP_VERSION "5.59BETA3"
|
||||
#define NMAP_NUM_VERSION "5.59.0.3"
|
||||
#define NMAP_VERSION "5.59BETA1"
|
||||
#define NMAP_NUM_VERSION "5.59.0.1"
|
||||
#endif
|
||||
|
||||
/* User configurable #defines: */
|
||||
|
||||
@@ -184,7 +184,7 @@ void set_hostinfo(lua_State *L, Target *currenths) {
|
||||
lua_newtable(L);
|
||||
// this will run at least one time and at most 8 times, see if condition
|
||||
for(i = 0; FPR->accuracy[i] == 1; i++) {
|
||||
lua_pushstring(L, FPR->prints[i]->OS_name);
|
||||
lua_pushstring(L, FPR->matches[i]->OS_name);
|
||||
lua_rawseti(L, -2, i+1);
|
||||
}
|
||||
lua_setfield(L, -2, "os");
|
||||
|
||||
61
osscan.cc
61
osscan.cc
@@ -206,8 +206,6 @@ FingerPrintDB::~FingerPrintDB() {
|
||||
}
|
||||
|
||||
FingerPrint::FingerPrint() {
|
||||
line = 0;
|
||||
OS_name = NULL;
|
||||
}
|
||||
|
||||
const struct AVal *FingerTest::getattrbyname(const char *name) const {
|
||||
@@ -460,11 +458,11 @@ double compare_fingerprints(FingerPrint *referenceFP, FingerPrint *observedFP,
|
||||
|
||||
/* Takes a fingerprint and looks for matches inside the passed in
|
||||
reference fingerprint DB. The results are stored in in FPR (which
|
||||
must point to an instantiated FingerPrintResults class) -- results
|
||||
must point to an instantiated FingerPrintResultsIPv4 class) -- results
|
||||
will be reverse-sorted by accuracy. No results below
|
||||
accuracy_threshhold will be included. The max matches returned is
|
||||
the maximum that fits in a FingerPrintResults class. */
|
||||
void match_fingerprint(FingerPrint *FP, FingerPrintResults *FPR,
|
||||
the maximum that fits in a FingerPrintResultsIPv4 class. */
|
||||
void match_fingerprint(FingerPrint *FP, FingerPrintResultsIPv4 *FPR,
|
||||
FingerPrintDB *DB, double accuracy_threshold) {
|
||||
double FPR_entrance_requirement = accuracy_threshold; /* accuracy must be
|
||||
at least this big
|
||||
@@ -474,10 +472,10 @@ void match_fingerprint(FingerPrint *FP, FingerPrintResults *FPR,
|
||||
double acc;
|
||||
int state;
|
||||
int skipfp;
|
||||
int max_prints = sizeof(FPR->prints) / sizeof(FingerPrint *);
|
||||
int max_prints = sizeof(FPR->matches) / sizeof(FPR->matches[0]);
|
||||
int idx;
|
||||
double tmp_acc=0.0, tmp_acc2; /* These are temp buffers for list swaps */
|
||||
FingerPrint *tmp_FP = NULL, *tmp_FP2;
|
||||
FingerMatch *tmp_FP = NULL, *tmp_FP2;
|
||||
|
||||
assert(FP);
|
||||
assert(FPR);
|
||||
@@ -495,12 +493,12 @@ void match_fingerprint(FingerPrint *FP, FingerPrintResults *FPR,
|
||||
|
||||
state = 0;
|
||||
for (idx=0; idx < FPR->num_matches; idx++) {
|
||||
if (strcmp(FPR->prints[idx]->OS_name, (*current_os)->OS_name) == 0) {
|
||||
if (strcmp(FPR->matches[idx]->OS_name, (*current_os)->match.OS_name) == 0) {
|
||||
if (FPR->accuracy[idx] >= acc) {
|
||||
skipfp = 1; /* Skip it -- a higher version is already in list */
|
||||
} else {
|
||||
/* We must shift the list left to delete this sucker */
|
||||
memmove(FPR->prints + idx, FPR->prints + idx + 1,
|
||||
memmove(FPR->matches + idx, FPR->matches + idx + 1,
|
||||
(FPR->num_matches - 1 - idx) * sizeof(FingerPrint *));
|
||||
memmove(FPR->accuracy + idx, FPR->accuracy + idx + 1,
|
||||
(FPR->num_matches - 1 - idx) * sizeof(double));
|
||||
@@ -528,18 +526,18 @@ void match_fingerprint(FingerPrint *FP, FingerPrintResults *FPR,
|
||||
if (state == 1) {
|
||||
/* Push tmp_acc and tmp_FP onto the next idx */
|
||||
tmp_acc2 = FPR->accuracy[idx+1];
|
||||
tmp_FP2 = FPR->prints[idx+1];
|
||||
tmp_FP2 = FPR->matches[idx+1];
|
||||
|
||||
FPR->accuracy[idx+1] = tmp_acc;
|
||||
FPR->prints[idx+1] = tmp_FP;
|
||||
FPR->matches[idx+1] = tmp_FP;
|
||||
|
||||
tmp_acc = tmp_acc2;
|
||||
tmp_FP = tmp_FP2;
|
||||
} else if (FPR->accuracy[idx + 1] < acc) {
|
||||
/* OK, I insert the sucker into the next slot ... */
|
||||
tmp_acc = FPR->accuracy[idx+1];
|
||||
tmp_FP = FPR->prints[idx+1];
|
||||
FPR->prints[idx+1] = *current_os;
|
||||
tmp_FP = FPR->matches[idx+1];
|
||||
FPR->matches[idx+1] = &(*current_os)->match;
|
||||
FPR->accuracy[idx+1] = acc;
|
||||
state = 1;
|
||||
}
|
||||
@@ -595,8 +593,9 @@ static const char *dist_method_fp_string(enum dist_calc_method method)
|
||||
top of a fingerprint. Gives info which might be useful when the
|
||||
FPrint is submitted (eg Nmap version, etc). Result is written (up
|
||||
to ostrlen) to the ostr var passed in */
|
||||
static void WriteSInfo(char *ostr, int ostrlen, bool isGoodFP,
|
||||
const struct in_addr * const addr, int distance,
|
||||
void WriteSInfo(char *ostr, int ostrlen, bool isGoodFP,
|
||||
const char *engine_id,
|
||||
const struct sockaddr_storage *addr, int distance,
|
||||
enum dist_calc_method distance_calculation_method,
|
||||
const u8 *mac, int openTcpPort,
|
||||
int closedTcpPort, int closedUdpPort) {
|
||||
@@ -629,8 +628,8 @@ static void WriteSInfo(char *ostr, int ostrlen, bool isGoodFP,
|
||||
if (mac)
|
||||
Snprintf(macbuf, sizeof(macbuf), "%%M=%02X%02X%02X", mac[0], mac[1], mac[2]);
|
||||
|
||||
Snprintf(ostr, ostrlen, "SCAN(V=%s%%D=%d/%d%%OT=%s%%CT=%s%%CU=%s%%PV=%c%s%s%%G=%c%s%%TM=%X%%P=%s)",
|
||||
NMAP_VERSION, ltime->tm_mon + 1, ltime->tm_mday,
|
||||
Snprintf(ostr, ostrlen, "SCAN(V=%s%%E=%s%%D=%d/%d%%OT=%s%%CT=%s%%CU=%s%%PV=%c%s%s%%G=%c%s%%TM=%X%%P=%s)",
|
||||
NMAP_VERSION, engine_id, ltime->tm_mon + 1, ltime->tm_mday,
|
||||
otbuf, ctbuf, cubuf, isipprivate(addr) ? 'Y' : 'N', dsbuf, dcbuf, isGoodFP ? 'Y' : 'N',
|
||||
macbuf, (int) timep, NMAP_PLATFORM);
|
||||
}
|
||||
@@ -804,7 +803,7 @@ static bool FingerTest_lessthan(const FingerTest* a, const FingerTest* b) {
|
||||
are included only once. If wrapit is true, the string is wrapped for
|
||||
submission. */
|
||||
const char *mergeFPs(FingerPrint *FPs[], int numFPs, bool isGoodFP,
|
||||
const struct in_addr * const addr, int distance,
|
||||
const struct sockaddr_storage *addr, int distance,
|
||||
enum dist_calc_method distance_calculation_method,
|
||||
const u8 *mac, int openTcpPort, int closedTcpPort,
|
||||
int closedUdpPort, bool wrapit) {
|
||||
@@ -872,7 +871,7 @@ const char *mergeFPs(FingerPrint *FPs[], int numFPs, bool isGoodFP,
|
||||
p = str;
|
||||
|
||||
/* Lets start by writing the fake "SCAN" test for submitting fingerprints */
|
||||
WriteSInfo(p, sizeof(str), isGoodFP, addr, distance, distance_calculation_method, mac, openTcpPort, closedTcpPort, closedUdpPort);
|
||||
WriteSInfo(p, sizeof(str), isGoodFP, "4", addr, distance, distance_calculation_method, mac, openTcpPort, closedTcpPort, closedUdpPort);
|
||||
p = p + strlen(str);
|
||||
if (!wrapit)
|
||||
*p++ = '\n';
|
||||
@@ -997,16 +996,16 @@ static void parse_classline(FingerPrint *FP, char *thisline, int lineno) {
|
||||
end = strchr(begin, '\0');
|
||||
os_class.Device_Type = string_pool_substr_strip(begin, end);
|
||||
|
||||
FP->OS_class.push_back(os_class);
|
||||
FP->match.OS_class.push_back(os_class);
|
||||
}
|
||||
|
||||
static void parse_cpeline(FingerPrint *FP, char *thisline, int lineno) {
|
||||
const char *cpe;
|
||||
|
||||
if (FP->OS_class.empty())
|
||||
if (FP->match.OS_class.empty())
|
||||
fatal("\"CPE\" line without preceding \"Class\" at line %d", lineno);
|
||||
|
||||
OS_Classification& osc = FP->OS_class.back();
|
||||
OS_Classification& osc = FP->match.OS_class.back();
|
||||
|
||||
if (thisline == NULL || strncmp(thisline, "CPE ", 4) != 0)
|
||||
fatal("Bogus line #%d (%s) passed to %s()", lineno, thisline, __func__);
|
||||
@@ -1050,7 +1049,7 @@ FingerPrint *parse_single_fingerprint(char *fprint_orig) {
|
||||
|
||||
if (strncmp(thisline, "Fingerprint ", 12) == 0) {
|
||||
/* Ignore a second Fingerprint line if it appears. */
|
||||
if (FP->OS_name == NULL) {
|
||||
if (FP->match.OS_name == NULL) {
|
||||
p = thisline + 12;
|
||||
while (*p && isspace((int) (unsigned char) *p))
|
||||
p++;
|
||||
@@ -1061,9 +1060,9 @@ FingerPrint *parse_single_fingerprint(char *fprint_orig) {
|
||||
while (q > p && isspace((int) (unsigned char) *(--q)))
|
||||
;
|
||||
|
||||
FP->OS_name = (char *) cp_alloc(q - p + 2);
|
||||
memcpy(FP->OS_name, p, q - p + 1);
|
||||
FP->OS_name[q - p + 1] = '\0';
|
||||
FP->match.OS_name = (char *) cp_alloc(q - p + 2);
|
||||
memcpy(FP->match.OS_name, p, q - p + 1);
|
||||
FP->match.OS_name[q - p + 1] = '\0';
|
||||
}
|
||||
} else if (strncmp(thisline, "MatchPoints", 11) == 0) {
|
||||
p = thisline + 11;
|
||||
@@ -1150,7 +1149,7 @@ fparse:
|
||||
current = new FingerPrint;
|
||||
|
||||
if (parsingMatchPoints) {
|
||||
current->OS_name = NULL;
|
||||
current->match.OS_name = NULL;
|
||||
DB->MatchPoints = current;
|
||||
} else {
|
||||
DB->prints.push_back(current);
|
||||
@@ -1168,12 +1167,12 @@ fparse:
|
||||
if (q < p)
|
||||
fatal("Parse error on line %d of fingerprint: %s", lineno, line);
|
||||
|
||||
current->OS_name = (char *) cp_alloc(q - p + 2);
|
||||
memcpy(current->OS_name, p, q - p + 1);
|
||||
current->OS_name[q - p + 1] = '\0';
|
||||
current->match.OS_name = (char *) cp_alloc(q - p + 2);
|
||||
memcpy(current->match.OS_name, p, q - p + 1);
|
||||
current->match.OS_name[q - p + 1] = '\0';
|
||||
}
|
||||
|
||||
current->line = lineno;
|
||||
current->match.line = lineno;
|
||||
|
||||
/* Now we read the fingerprint itself */
|
||||
while (fgets(line, sizeof(line), fp)) {
|
||||
|
||||
14
osscan.h
14
osscan.h
@@ -144,18 +144,24 @@ double compare_fingerprints(FingerPrint *referenceFP, FingerPrint *observedFP,
|
||||
|
||||
/* Takes a fingerprint and looks for matches inside the passed in
|
||||
reference fingerprint DB. The results are stored in in FPR (which
|
||||
must point to an instantiated FingerPrintResults class) -- results
|
||||
must point to an instantiated FingerPrintResultsIPv4 class) -- results
|
||||
will be reverse-sorted by accuracy. No results below
|
||||
accuracy_threshhold will be included. The max matches returned is
|
||||
the maximum that fits in a FingerPrintResults class. */
|
||||
void match_fingerprint(FingerPrint *FP, FingerPrintResults *FPR,
|
||||
the maximum that fits in a FingerPrintResultsIPv4 class. */
|
||||
void match_fingerprint(FingerPrint *FP, FingerPrintResultsIPv4 *FPR,
|
||||
FingerPrintDB *DB, double accuracy_threshold);
|
||||
|
||||
/* Returns true if perfect match -- if num_subtests & num_subtests_succeeded are non_null it updates them. if shortcircuit is zero, it does all the tests, otherwise it returns when the first one fails */
|
||||
|
||||
void freeFingerPrint(FingerPrint *FP);
|
||||
void WriteSInfo(char *ostr, int ostrlen, bool isGoodFP,
|
||||
const char *engine_id,
|
||||
const struct sockaddr_storage *addr, int distance,
|
||||
enum dist_calc_method distance_calculation_method,
|
||||
const u8 *mac, int openTcpPort,
|
||||
int closedTcpPort, int closedUdpPort);
|
||||
const char *mergeFPs(FingerPrint *FPs[], int numFPs, bool isGoodFP,
|
||||
const struct in_addr * const addr, int distance,
|
||||
const struct sockaddr_storage *addr, int distance,
|
||||
enum dist_calc_method distance_calculation_method,
|
||||
const u8 *mac, int openTcpPort, int closedTcpPort,
|
||||
int closedUdpPort, bool wrapit);
|
||||
|
||||
306
osscan2.cc
306
osscan2.cc
@@ -97,6 +97,7 @@
|
||||
#include "NmapOps.h"
|
||||
#include "Target.h"
|
||||
#include "utils.h"
|
||||
#include "FPEngine.h"
|
||||
#include <dnet.h>
|
||||
#include <list>
|
||||
|
||||
@@ -755,8 +756,8 @@ static void endRound(OsScanInfo *OSI, HostOsScan *HOS, int roundNum) {
|
||||
HOS->makeFP(hsi->hss);
|
||||
|
||||
hsi->FPs[roundNum] = hsi->hss->getFP();
|
||||
hsi->target->FPR->FPs[roundNum] = hsi->FPs[roundNum];
|
||||
hsi->target->FPR->numFPs = roundNum + 1;
|
||||
hsi->FPR->FPs[roundNum] = hsi->FPs[roundNum];
|
||||
hsi->FPR->numFPs = roundNum + 1;
|
||||
double tr = hsi->hss->timingRatio();
|
||||
hsi->target->FPR->maxTimingRatio = MAX(hsi->target->FPR->maxTimingRatio, tr);
|
||||
match_fingerprint(hsi->FPs[roundNum], &hsi->FP_matches[roundNum],
|
||||
@@ -768,7 +769,7 @@ static void endRound(OsScanInfo *OSI, HostOsScan *HOS, int roundNum) {
|
||||
if (roundNum > 0) {
|
||||
if(o.verbose) log_write(LOG_STDOUT, "WARNING: OS didn't match until try #%d\n", roundNum + 1);
|
||||
}
|
||||
match_fingerprint(hsi->target->FPR->FPs[roundNum], hsi->target->FPR,
|
||||
match_fingerprint(hsi->FPR->FPs[roundNum], hsi->FPR,
|
||||
o.reference_FPs, OSSCAN_GUESS_THRESHOLD);
|
||||
hsi->isCompleted = true;
|
||||
}
|
||||
@@ -810,7 +811,7 @@ static void findBestFPs(OsScanInfo *OSI) {
|
||||
/* Now lets find the best match */
|
||||
bestacc = 0;
|
||||
bestaccidx = 0;
|
||||
for(i=0; i < hsi->target->FPR->numFPs; i++) {
|
||||
for(i=0; i < hsi->FPR->numFPs; i++) {
|
||||
if (hsi->FP_matches[i].overall_results == OSSCAN_SUCCESS &&
|
||||
hsi->FP_matches[i].num_matches > 0 &&
|
||||
hsi->FP_matches[i].accuracy[0] > bestacc) {
|
||||
@@ -824,7 +825,7 @@ static void findBestFPs(OsScanInfo *OSI) {
|
||||
// Now we redo the match, since target->FPR has various data (such as
|
||||
// target->FPR->numFPs) which is not in FP_matches[bestaccidx]. This is
|
||||
// kinda ugly.
|
||||
match_fingerprint(hsi->target->FPR->FPs[bestaccidx], hsi->target->FPR,
|
||||
match_fingerprint(hsi->FPR->FPs[bestaccidx], (FingerPrintResultsIPv4 *) hsi->target->FPR,
|
||||
o.reference_FPs, OSSCAN_GUESS_THRESHOLD);
|
||||
}
|
||||
}
|
||||
@@ -833,17 +834,17 @@ static void findBestFPs(OsScanInfo *OSI) {
|
||||
static void printFP(OsScanInfo *OSI) {
|
||||
list<HostOsScanInfo *>::iterator hostI;
|
||||
HostOsScanInfo *hsi = NULL;
|
||||
FingerPrintResults *FPR;
|
||||
FingerPrintResultsIPv4 *FPR;
|
||||
|
||||
for(hostI = OSI->incompleteHosts.begin(); hostI != OSI->incompleteHosts.end(); hostI++) {
|
||||
hsi = *hostI;
|
||||
FPR = hsi->target->FPR;
|
||||
FPR = hsi->FPR;
|
||||
|
||||
log_write(LOG_NORMAL|LOG_SKID_NOXLT|LOG_STDOUT,
|
||||
"No OS matches for %s by new os scan system.\n\nTCP/IP fingerprint:\n%s",
|
||||
hsi->target->targetipstr(),
|
||||
mergeFPs(FPR->FPs, FPR->numFPs, true,
|
||||
hsi->target->v4hostip(), hsi->target->distance,
|
||||
hsi->target->TargetSockAddr(), hsi->target->distance,
|
||||
hsi->target->distance_calculation_method,
|
||||
hsi->target->MACAddress(),
|
||||
FPR->osscan_opentcpport, FPR->osscan_closedtcpport,
|
||||
@@ -871,7 +872,7 @@ static int expireUnmatchedHosts(OsScanInfo *OSI, list<HostOsScanInfo *> *unMatch
|
||||
if (HOS->target->FPR->OmitSubmissionFP())
|
||||
max_tries = min(max_tries, STANDARD_OS2_TRIES);
|
||||
|
||||
if (HOS->target->FPR->numFPs >= max_tries) {
|
||||
if (HOS->FPR->numFPs >= max_tries) {
|
||||
/* We've done all the OS2 tries we're going to do ... move this
|
||||
to unMatchedHosts */
|
||||
HOS->target->stopTimeOutClock(&now);
|
||||
@@ -886,108 +887,6 @@ static int expireUnmatchedHosts(OsScanInfo *OSI, list<HostOsScanInfo *> *unMatch
|
||||
}
|
||||
|
||||
|
||||
/* You should call os_scan2 rather than this function, as that version handles
|
||||
chunking so you don't do too many targets in parallel */
|
||||
static int os_scan_2(vector<Target *> &Targets) {
|
||||
// Hosts which haven't matched and have been removed from
|
||||
// incompleteHosts because they have exceeded the number of
|
||||
// retransmissions the host is allowed.
|
||||
list<HostOsScanInfo *> unMatchedHosts;
|
||||
int itry;
|
||||
|
||||
if (Targets.size() == 0) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
init_perf_values();
|
||||
|
||||
OsScanInfo OSI(Targets);
|
||||
if (OSI.numIncompleteHosts() == 0) {
|
||||
/* no one will be scanned */
|
||||
return 1;
|
||||
}
|
||||
OSI.starttime = o.TimeSinceStart();
|
||||
startTimeOutClocks(&OSI);
|
||||
|
||||
HostOsScan HOS(Targets[0]);
|
||||
|
||||
itry = 0;
|
||||
|
||||
|
||||
|
||||
begin_sniffer(&HOS, Targets); /* initial the pcap session handler in HOS */
|
||||
while(OSI.numIncompleteHosts() != 0) {
|
||||
if (itry > 0) sleep(1);
|
||||
if (itry == 3) usleep(1500000); /* Try waiting a little longer just in case it matters */
|
||||
if (o.verbose) {
|
||||
char targetstr[128];
|
||||
bool plural = (OSI.numIncompleteHosts() != 1);
|
||||
if (!plural) {
|
||||
(*(OSI.incompleteHosts.begin()))->target->NameIP(targetstr, sizeof(targetstr));
|
||||
} else Snprintf(targetstr, sizeof(targetstr), "%d hosts", (int) OSI.numIncompleteHosts());
|
||||
log_write(LOG_STDOUT, "%s OS detection (try #%d) against %s\n", (itry == 0)? "Initiating" : "Retrying", itry + 1, targetstr);
|
||||
log_flush_all();
|
||||
}
|
||||
startRound(&OSI, &HOS, itry);
|
||||
doSeqTests(&OSI, &HOS);
|
||||
doTUITests(&OSI, &HOS);
|
||||
endRound(&OSI, &HOS, itry);
|
||||
expireUnmatchedHosts(&OSI, &unMatchedHosts);
|
||||
itry++;
|
||||
}
|
||||
|
||||
/* Now move the unMatchedHosts array back to IncompleteHosts */
|
||||
if (!unMatchedHosts.empty())
|
||||
OSI.incompleteHosts.splice(OSI.incompleteHosts.begin(), unMatchedHosts);
|
||||
|
||||
if (OSI.numIncompleteHosts()) {
|
||||
/* For host that doesn't have a perfect match, we do the following
|
||||
things. */
|
||||
|
||||
/* Find the most matching item in the db. */
|
||||
findBestFPs(&OSI);
|
||||
|
||||
/* Print the fp in debug mode.
|
||||
Normally let output.cc to print the FP. */
|
||||
if(o.debugging > 1)
|
||||
printFP(&OSI);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* This is the primary OS detection function. If many Targets are
|
||||
passed in (the threshold is based on timing level), they are
|
||||
processed as smaller groups to improve accuracy */
|
||||
void os_scan2(vector<Target *> &Targets) {
|
||||
unsigned int max_os_group_sz = 20;
|
||||
double fudgeratio = 1.2; /* Allow a slightly larger final group rather than finish with a tiny one */
|
||||
vector<Target *> tmpTargets;
|
||||
unsigned int startidx = 0;
|
||||
|
||||
if (o.timing_level == 4)
|
||||
max_os_group_sz = (unsigned int) (max_os_group_sz * 1.5);
|
||||
|
||||
if (o.timing_level > 4 || Targets.size() <= max_os_group_sz * fudgeratio) {
|
||||
os_scan_2(Targets);
|
||||
return;
|
||||
}
|
||||
|
||||
/* We need to split it up */
|
||||
while(startidx < Targets.size()) {
|
||||
int diff = Targets.size() - startidx;
|
||||
if (diff > max_os_group_sz * fudgeratio) {
|
||||
diff = max_os_group_sz;
|
||||
}
|
||||
tmpTargets.assign(Targets.begin() + startidx, Targets.begin() + startidx + diff);
|
||||
os_scan_2(tmpTargets);
|
||||
startidx += diff;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* Implementation of class OFProbe *
|
||||
******************************************************************************/
|
||||
@@ -3364,12 +3263,14 @@ HostOsScanInfo::HostOsScanInfo(Target *t, OsScanInfo *OsSI) {
|
||||
OSI = OsSI;
|
||||
|
||||
FPs = (FingerPrint **) safe_zalloc(o.maxOSTries() * sizeof(FingerPrint *));
|
||||
FP_matches = (FingerPrintResults *) safe_zalloc(o.maxOSTries() * sizeof(FingerPrintResults));
|
||||
FP_matches = (FingerPrintResultsIPv4 *) safe_zalloc(o.maxOSTries() * sizeof(FingerPrintResultsIPv4));
|
||||
timedOut = false;
|
||||
isCompleted = false;
|
||||
|
||||
if (target->FPR == NULL)
|
||||
target->FPR = new FingerPrintResults;
|
||||
if (target->FPR == NULL) {
|
||||
this->FPR = new FingerPrintResultsIPv4;
|
||||
target->FPR = this->FPR;
|
||||
}
|
||||
target->osscanSetFlag(OS_PERF);
|
||||
|
||||
hss = new HostOsScanStats(t);
|
||||
@@ -3521,3 +3422,180 @@ int OsScanInfo::removeCompletedHosts() {
|
||||
}
|
||||
return hostsRemoved;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Implementation of class OSScan() *
|
||||
******************************************************************************/
|
||||
|
||||
/* Constructor */
|
||||
OSScan::OSScan() {
|
||||
this->reset();
|
||||
return;
|
||||
}
|
||||
|
||||
/* Destructor */
|
||||
OSScan::~OSScan() {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Function that initializes internal variables */
|
||||
void OSScan::reset(){
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* This function takes a group of targets and divides it in chunks if there are
|
||||
* too many to be processed at the same time. The threshold is based on Nmap's
|
||||
* timing level (when timing level is above 4, no chunking is performed).
|
||||
* The reason targets are processed in smaller groups is to improve accuracy. */
|
||||
int OSScan::chunk_and_do_scan(vector<Target *> &Targets, int family) {
|
||||
unsigned int max_os_group_sz = 20;
|
||||
double fudgeratio = 1.2; /* Allow a slightly larger final group rather than finish with a tiny one */
|
||||
vector<Target *> tmpTargets;
|
||||
unsigned int startidx = 0;
|
||||
|
||||
if (o.timing_level == 4)
|
||||
max_os_group_sz = (unsigned int) (max_os_group_sz * 1.5);
|
||||
|
||||
if (o.timing_level > 4 || Targets.size() <= max_os_group_sz * fudgeratio) {
|
||||
if(family==AF_INET6)
|
||||
os_scan_ipv6(Targets);
|
||||
else
|
||||
os_scan_ipv4(Targets);
|
||||
return OP_SUCCESS;
|
||||
}
|
||||
|
||||
/* We need to split it up */
|
||||
while(startidx < Targets.size()) {
|
||||
int diff = Targets.size() - startidx;
|
||||
if (diff > max_os_group_sz * fudgeratio) {
|
||||
diff = max_os_group_sz;
|
||||
}
|
||||
tmpTargets.assign(Targets.begin() + startidx, Targets.begin() + startidx + diff);
|
||||
if(family==AF_INET6)
|
||||
os_scan_ipv6(Targets);
|
||||
else
|
||||
os_scan_ipv4(Targets);
|
||||
startidx += diff;
|
||||
}
|
||||
return OP_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/* Performs the OS detection for IPv4 hosts. This method should not be called
|
||||
* directly. os_scan() should be used instead, as it handles chunking so
|
||||
* you don't do too many targets in parallel */
|
||||
int OSScan::os_scan_ipv4(vector<Target *> &Targets) {
|
||||
int itry=0;
|
||||
/* Hosts which haven't matched and have been removed from incompleteHosts because
|
||||
* they have exceeded the number of retransmissions the host is allowed. */
|
||||
list<HostOsScanInfo *> unMatchedHosts;
|
||||
|
||||
/* Check we have at least one target*/
|
||||
if (Targets.size() == 0) {
|
||||
return OP_FAILURE;
|
||||
}
|
||||
|
||||
/* Init the necessary objects to perform the detection */
|
||||
init_perf_values();
|
||||
|
||||
OsScanInfo OSI(Targets);
|
||||
if (OSI.numIncompleteHosts() == 0) {
|
||||
/* no one will be scanned */
|
||||
return OP_FAILURE;
|
||||
}
|
||||
OSI.starttime = o.TimeSinceStart();
|
||||
startTimeOutClocks(&OSI);
|
||||
|
||||
HostOsScan HOS(Targets[0]);
|
||||
|
||||
/* Initialize the pcap session handler in HOS */
|
||||
begin_sniffer(&HOS, Targets);
|
||||
while(OSI.numIncompleteHosts() != 0) {
|
||||
if (itry > 0) sleep(1);
|
||||
if (itry == 3) usleep(1500000); /* Try waiting a little longer just in case it matters */
|
||||
if (o.verbose) {
|
||||
char targetstr[128];
|
||||
bool plural = (OSI.numIncompleteHosts() != 1);
|
||||
if (!plural) {
|
||||
(*(OSI.incompleteHosts.begin()))->target->NameIP(targetstr, sizeof(targetstr));
|
||||
} else Snprintf(targetstr, sizeof(targetstr), "%d hosts", (int) OSI.numIncompleteHosts());
|
||||
log_write(LOG_STDOUT, "%s OS detection (try #%d) against %s\n", (itry == 0)? "Initiating" : "Retrying", itry + 1, targetstr);
|
||||
log_flush_all();
|
||||
}
|
||||
startRound(&OSI, &HOS, itry);
|
||||
doSeqTests(&OSI, &HOS);
|
||||
doTUITests(&OSI, &HOS);
|
||||
endRound(&OSI, &HOS, itry);
|
||||
expireUnmatchedHosts(&OSI, &unMatchedHosts);
|
||||
itry++;
|
||||
}
|
||||
|
||||
/* Now move the unMatchedHosts array back to IncompleteHosts */
|
||||
if (!unMatchedHosts.empty())
|
||||
OSI.incompleteHosts.splice(OSI.incompleteHosts.begin(), unMatchedHosts);
|
||||
|
||||
if (OSI.numIncompleteHosts()) {
|
||||
/* For hosts that don't have a perfect match, find the closest fingerprint
|
||||
* in the DB and, if we are in debugging mode, print them. */
|
||||
findBestFPs(&OSI);
|
||||
if(o.debugging > 1)
|
||||
printFP(&OSI);
|
||||
}
|
||||
|
||||
return OP_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/* Performs the OS detection for IPv6 hosts. This method should not be called
|
||||
* directly. os_scan() should be used instead, as it handles chunking so
|
||||
* you don't do too many targets in parallel */
|
||||
int OSScan::os_scan_ipv6(vector<Target *> &Targets) {
|
||||
|
||||
/* Object instantiation */
|
||||
FPEngine6 fp6;
|
||||
|
||||
/* Safe checks. */
|
||||
if (Targets.size() == 0) {
|
||||
return OP_FAILURE;
|
||||
}
|
||||
|
||||
return fp6.os_scan(Targets);
|
||||
}
|
||||
|
||||
|
||||
/* This function performs the OS detection. It processes the supplied list of
|
||||
* targets and classifies it into two groups: IPv4 and IPv6 targets. Then,
|
||||
* OS detection is carried out for those two separate groups. It returns
|
||||
* OP_SUCCESS on success or OP_FAILURE in case of error. */
|
||||
int OSScan::os_scan(vector<Target *> &Targets){
|
||||
vector<Target *> ip4_targets;
|
||||
vector<Target *> ip6_targets;
|
||||
int res4=OP_SUCCESS, res6=OP_SUCCESS;
|
||||
|
||||
/* Make sure we have at least one target */
|
||||
if(Targets.size()<=0)
|
||||
return OP_FAILURE;
|
||||
|
||||
/* Classify targets into two groups: IPv4 and IPv6 */
|
||||
for(size_t i=0; i<Targets.size(); i++){
|
||||
if(Targets[i]->af()==AF_INET6)
|
||||
ip6_targets.push_back(Targets[i]);
|
||||
else
|
||||
ip4_targets.push_back(Targets[i]);
|
||||
}
|
||||
|
||||
/* Do IPv4 OS Detection */
|
||||
if( ip4_targets.size()>0 )
|
||||
res4=this->os_scan_ipv4(ip4_targets);
|
||||
|
||||
/* Do IPv6 OS Detection */
|
||||
if( ip6_targets.size()>0 )
|
||||
res6=this->os_scan_ipv6(ip6_targets);
|
||||
|
||||
/* If both scans were succesful, return OK */
|
||||
if(res4==OP_SUCCESS && res6==OP_SUCCESS)
|
||||
return OP_SUCCESS;
|
||||
else
|
||||
return OP_FAILURE;
|
||||
}
|
||||
|
||||
23
osscan2.h
23
osscan2.h
@@ -511,13 +511,34 @@ class HostOsScanInfo {
|
||||
~HostOsScanInfo();
|
||||
|
||||
Target *target; /* The target */
|
||||
FingerPrintResultsIPv4 *FPR;
|
||||
OsScanInfo *OSI; /* The OSI which contains this HostOsScanInfo */
|
||||
FingerPrint **FPs; /* Fingerprints of the host */
|
||||
FingerPrintResults *FP_matches; /* Fingerprint-matching results */
|
||||
FingerPrintResultsIPv4 *FP_matches; /* Fingerprint-matching results */
|
||||
bool timedOut; /* Did it time out? */
|
||||
bool isCompleted; /* Has the OS detection been completed? */
|
||||
HostOsScanStats *hss; /* Scan status of the host in one scan round */
|
||||
};
|
||||
|
||||
|
||||
/** This is the class that performs OS detection (both IPv4 and IPv6).
|
||||
* Using it is simple, just call os_scan() passing a list of targets.
|
||||
* The results of the detection will be stored inside the supplied
|
||||
* target objects. */
|
||||
class OSScan {
|
||||
|
||||
private:
|
||||
int ip_ver; /* IP version for the OS Scan (4 or 6) */
|
||||
int chunk_and_do_scan(vector<Target *> &Targets, int family);
|
||||
int os_scan_ipv4(vector<Target *> &Targets);
|
||||
int os_scan_ipv6(vector<Target *> &Targets);
|
||||
|
||||
public:
|
||||
OSScan();
|
||||
~OSScan();
|
||||
void reset();
|
||||
int os_scan(vector<Target *> &Targets);
|
||||
};
|
||||
|
||||
#endif /*OSSCAN2_H*/
|
||||
|
||||
|
||||
210
output.cc
210
output.cc
@@ -114,6 +114,7 @@
|
||||
#include <set>
|
||||
#include <vector>
|
||||
#include <list>
|
||||
#include <sstream>
|
||||
|
||||
/* Workaround for lack of namespace std on HP-UX 11.00 */
|
||||
namespace std {};
|
||||
@@ -1499,7 +1500,7 @@ static void printosclassificationoutput(const struct
|
||||
// Now to create the fodder for normal output
|
||||
for (classno = 0; classno < OSR->OSC_num_matches; classno++) {
|
||||
/* We have processed enough if any of the following are true */
|
||||
if ((!guess && OSR->OSC_Accuracy[classno] < 1.0) ||
|
||||
if ((!guess && classno >= OSR->OSC_num_perfect_matches) ||
|
||||
OSR->OSC_Accuracy[classno] <= OSR->OSC_Accuracy[0] - 0.1 ||
|
||||
(OSR->OSC_Accuracy[classno] < 1.0 && classno > 9))
|
||||
break;
|
||||
@@ -1563,14 +1564,14 @@ static void printosclassificationoutput(const struct
|
||||
log_write(LOG_PLAIN, "Device type: ");
|
||||
for (classno = 0; classno < numtypes; classno++)
|
||||
log_write(LOG_PLAIN, "%s%s", types[classno], (classno < numtypes - 1) ? "|" : "");
|
||||
log_write(LOG_PLAIN, "\nRunning%s: ", (familyaccuracy[0] < 1.0) ? " (JUST GUESSING)" : "");
|
||||
log_write(LOG_PLAIN, "\nRunning%s: ", OSR->OSC_num_perfect_matches == 0 ? " (JUST GUESSING)" : "");
|
||||
for (familyno = 0; familyno < numfamilies; familyno++) {
|
||||
if (familyno > 0)
|
||||
log_write(LOG_PLAIN, ", ");
|
||||
log_write(LOG_PLAIN, "%s", fullfamily[familyno]);
|
||||
if (*familygenerations[familyno])
|
||||
log_write(LOG_PLAIN, " %s", familygenerations[familyno]);
|
||||
if (familyaccuracy[familyno] < 1.0)
|
||||
if (familyno >= OSR->OSC_num_perfect_matches)
|
||||
log_write(LOG_PLAIN, " (%.f%%)",
|
||||
floor(familyaccuracy[familyno] * 100));
|
||||
}
|
||||
@@ -1609,28 +1610,187 @@ void printmacinfo(Target *currenths) {
|
||||
|
||||
|
||||
/* A convenience wrapper around mergeFPs. */
|
||||
static const char *merge_fpr(const FingerPrintResults *FPR,
|
||||
const Target *currenths,
|
||||
bool isGoodFP, bool wrapit) {
|
||||
return mergeFPs(FPR->FPs, FPR->numFPs, isGoodFP, currenths->v4hostip(),
|
||||
const char *FingerPrintResultsIPv4::merge_fpr(const Target *currenths,
|
||||
bool isGoodFP, bool wrapit) const {
|
||||
return mergeFPs(this->FPs, this->numFPs, isGoodFP, currenths->TargetSockAddr(),
|
||||
currenths->distance,
|
||||
currenths->distance_calculation_method,
|
||||
currenths->MACAddress(), FPR->osscan_opentcpport,
|
||||
FPR->osscan_closedtcpport, FPR->osscan_closedudpport,
|
||||
currenths->MACAddress(), this->osscan_opentcpport,
|
||||
this->osscan_closedtcpport, this->osscan_closedudpport,
|
||||
wrapit);
|
||||
}
|
||||
|
||||
/* Run-length encode a string in chunks of two bytes. The output sequence
|
||||
AA{n} means to repeat AA n times. The input must not contain '{' or '}'
|
||||
characters. */
|
||||
static std::string run_length_encode(const std::string &s) {
|
||||
std::ostringstream result;
|
||||
const char *p, *q;
|
||||
unsigned int reps;
|
||||
|
||||
p = s.c_str();
|
||||
while (*p != '\0' && *(p + 1) != '\0') {
|
||||
for (q = p + 2; *q == *p && *(q + 1) == *(p + 1); q += 2)
|
||||
;
|
||||
reps = (q - p) / 2;
|
||||
if (reps < 3)
|
||||
result << std::string(p, q);
|
||||
else
|
||||
result << std::string(p, 2) << "{" << reps << "}";
|
||||
p = q;
|
||||
}
|
||||
if (*p != '\0')
|
||||
result << std::string(p);
|
||||
|
||||
return result.str();
|
||||
}
|
||||
|
||||
static std::string wrap(const std::string &s) {
|
||||
const static char *prefix = "OS:";
|
||||
std::string t, buf;
|
||||
int i, len, prefixlen;
|
||||
size_t p;
|
||||
|
||||
t = s;
|
||||
/* Remove newlines. */
|
||||
p = 0;
|
||||
while ((p = t.find("\n", p)) != std::string::npos)
|
||||
t.erase(p, 1);
|
||||
|
||||
len = t.size();
|
||||
prefixlen = strlen(prefix);
|
||||
assert(FP_RESULT_WRAP_LINE_LEN > prefixlen);
|
||||
for (i = 0; i < len; i += FP_RESULT_WRAP_LINE_LEN - prefixlen) {
|
||||
buf.append(prefix);
|
||||
buf.append(t, i, FP_RESULT_WRAP_LINE_LEN - prefixlen);
|
||||
buf.append("\n");
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
static void scrub_packet(PacketElement *pe, unsigned char fill) {
|
||||
unsigned char fillbuf[16];
|
||||
|
||||
memset(fillbuf, fill, sizeof(fillbuf));
|
||||
for (; pe != NULL; pe = pe->getNextElement()) {
|
||||
if (pe->protocol_id() == HEADER_TYPE_IPv6) {
|
||||
IPv6Header *ipv6 = (IPv6Header *) pe;
|
||||
ipv6->setSourceAddress(fillbuf);
|
||||
ipv6->setDestinationAddress(fillbuf);
|
||||
} else if (pe->protocol_id() == HEADER_TYPE_ICMPv6) {
|
||||
ICMPv6Header *icmpv6 = (ICMPv6Header *) pe;
|
||||
in6_addr *addr = (in6_addr *) fillbuf;
|
||||
if (icmpv6->getType() == ICMPV6_NEIGHBOR_ADVERTISEMENT)
|
||||
icmpv6->setTargetAddress(*addr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static std::string get_scrubbed_buffer(const FPResponse *resp) {
|
||||
std::ostringstream result;
|
||||
PacketElement *scrub1, *scrub2;
|
||||
u8 *buf1, *buf2;
|
||||
int len1, len2;
|
||||
unsigned int i;
|
||||
|
||||
scrub1 = PacketParser::split(resp->buf, resp->len);
|
||||
assert(scrub1 != NULL);
|
||||
scrub_packet(scrub1, 0x00);
|
||||
|
||||
scrub2 = PacketParser::split(resp->buf, resp->len);
|
||||
assert(scrub2 != NULL);
|
||||
scrub_packet(scrub2, 0xFF);
|
||||
|
||||
buf1 = scrub1->getBinaryBuffer(&len1);
|
||||
buf2 = scrub2->getBinaryBuffer(&len2);
|
||||
|
||||
assert(resp->len == (unsigned int) len1);
|
||||
assert(resp->len == (unsigned int) len2);
|
||||
|
||||
result.fill('0');
|
||||
result << std::hex;
|
||||
for (i = 0; i < resp->len; i++) {
|
||||
if (resp->buf[i] == buf1[i] && resp->buf[i] == buf2[i]) {
|
||||
result.width(2);
|
||||
result << (unsigned int) resp->buf[i];
|
||||
} else {
|
||||
result << "XX";
|
||||
}
|
||||
}
|
||||
|
||||
free(buf1);
|
||||
free(buf2);
|
||||
PacketParser::freePacketChain(scrub1);
|
||||
PacketParser::freePacketChain(scrub2);
|
||||
|
||||
return result.str();
|
||||
}
|
||||
|
||||
const char *FingerPrintResultsIPv6::merge_fpr(const Target *currenths,
|
||||
bool isGoodFP, bool wrapit) const {
|
||||
static char str[10240];
|
||||
const FingerPrintResultsIPv6 *FPR;
|
||||
std::ostringstream result;
|
||||
std::string output;
|
||||
unsigned int i;
|
||||
|
||||
/* Write the SCAN line. */
|
||||
WriteSInfo(str, sizeof(str), isGoodFP, "6", currenths->TargetSockAddr(),
|
||||
currenths->distance, currenths->distance_calculation_method,
|
||||
currenths->MACAddress(), this->osscan_opentcpport,
|
||||
this->osscan_closedtcpport, this->osscan_closedudpport);
|
||||
result << str << "\n";
|
||||
|
||||
FPR = (FingerPrintResultsIPv6 *) currenths->FPR;
|
||||
assert(FPR->begin_time.tv_sec != 0);
|
||||
for (i = 0; i < sizeof(FPR->fp_responses) / sizeof(FPR->fp_responses[0]); i++) {
|
||||
const FPResponse *resp;
|
||||
std::string scrubbed;
|
||||
|
||||
resp = this->fp_responses[i];
|
||||
if (resp == NULL)
|
||||
continue;
|
||||
scrubbed = get_scrubbed_buffer(resp);
|
||||
if (wrapit)
|
||||
scrubbed = run_length_encode(scrubbed);
|
||||
result << resp->probe_id << "(P=" << scrubbed;
|
||||
assert(resp->senttime.tv_sec != 0);
|
||||
result << "%ST=" << TIMEVAL_FSEC_SUBTRACT(resp->senttime, FPR->begin_time);
|
||||
assert(resp->rcvdtime.tv_sec != 0);
|
||||
result << "%RT=" << TIMEVAL_FSEC_SUBTRACT(resp->rcvdtime, FPR->begin_time);
|
||||
result << ")\n";
|
||||
}
|
||||
|
||||
result << "EXTRA(";
|
||||
result << "FL=";
|
||||
result.fill('0');
|
||||
result << std::hex;
|
||||
result.width(5);
|
||||
result << FPR->flow_label;
|
||||
result << ")\n";
|
||||
|
||||
output = result.str();
|
||||
if (wrapit) {
|
||||
output = wrap(output);
|
||||
}
|
||||
|
||||
Strncpy(str, output.c_str(), sizeof(str));
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
static void write_merged_fpr(const FingerPrintResults *FPR,
|
||||
const Target *currenths,
|
||||
bool isGoodFP, bool wrapit) {
|
||||
log_write(LOG_NORMAL | LOG_SKID_NOXLT | LOG_STDOUT,
|
||||
"TCP/IP fingerprint:\n%s\n",
|
||||
merge_fpr(FPR, currenths, isGoodFP, wrapit));
|
||||
FPR->merge_fpr(currenths, isGoodFP, wrapit));
|
||||
|
||||
/* Added code here to print fingerprint to XML file any time it would be
|
||||
printed to any other output format */
|
||||
xml_open_start_tag("osfingerprint");
|
||||
xml_attribute("fingerprint", "%s", merge_fpr(FPR, currenths, isGoodFP, wrapit));
|
||||
xml_attribute("fingerprint", "%s", FPR->merge_fpr(currenths, isGoodFP, wrapit));
|
||||
xml_close_empty_tag();
|
||||
xml_newline();
|
||||
}
|
||||
@@ -1691,22 +1851,22 @@ void printosscanoutput(Target *currenths) {
|
||||
/* Success, not too many perfect matches. */
|
||||
if (FPR->num_perfect_matches > 0) {
|
||||
/* Some perfect matches. */
|
||||
for (i = 0; FPR->accuracy[i] == 1; i++) {
|
||||
for (i = 0; i < FPR->num_perfect_matches; i++) {
|
||||
xml_open_start_tag("osmatch");
|
||||
xml_attribute("name", "%s", FPR->prints[i]->OS_name);
|
||||
xml_attribute("accuracy", "100");
|
||||
xml_attribute("line", "%d", FPR->prints[i]->line);
|
||||
xml_attribute("name", "%s", FPR->matches[i]->OS_name);
|
||||
xml_attribute("accuracy", "%d", (int) (FPR->accuracy[i] * 100));
|
||||
xml_attribute("line", "%d", FPR->matches[i]->line);
|
||||
xml_close_empty_tag();
|
||||
xml_newline();
|
||||
}
|
||||
|
||||
log_write(LOG_MACHINE, "\tOS: %s", FPR->prints[0]->OS_name);
|
||||
for (i = 1; FPR->accuracy[i] == 1; i++)
|
||||
log_write(LOG_MACHINE, "|%s", FPR->prints[i]->OS_name);
|
||||
log_write(LOG_MACHINE, "\tOS: %s", FPR->matches[0]->OS_name);
|
||||
for (i = 1; i < FPR->num_perfect_matches; i++)
|
||||
log_write(LOG_MACHINE, "|%s", FPR->matches[i]->OS_name);
|
||||
|
||||
log_write(LOG_PLAIN, "OS details: %s", FPR->prints[0]->OS_name);
|
||||
for (i = 1; FPR->accuracy[i] == 1; i++)
|
||||
log_write(LOG_PLAIN, ", %s", FPR->prints[i]->OS_name);
|
||||
log_write(LOG_PLAIN, "OS details: %s", FPR->matches[0]->OS_name);
|
||||
for (i = 1; i < FPR->num_perfect_matches; i++)
|
||||
log_write(LOG_PLAIN, ", %s", FPR->matches[i]->OS_name);
|
||||
log_write(LOG_PLAIN, "\n");
|
||||
|
||||
if (o.debugging || o.verbose > 1)
|
||||
@@ -1721,17 +1881,17 @@ void printosscanoutput(Target *currenths) {
|
||||
/* Print the best guesses available */
|
||||
for (i = 0; i < 10 && i < FPR->num_matches && FPR->accuracy[i] > FPR->accuracy[0] - 0.10; i++) {
|
||||
xml_open_start_tag("osmatch");
|
||||
xml_attribute("name", "%s", FPR->prints[i]->OS_name);
|
||||
xml_attribute("name", "%s", FPR->matches[i]->OS_name);
|
||||
xml_attribute("accuracy", "%d", (int) (FPR->accuracy[i] * 100));
|
||||
xml_attribute("line", "%d", FPR->prints[i]->line);
|
||||
xml_attribute("line", "%d", FPR->matches[i]->line);
|
||||
xml_close_empty_tag();
|
||||
xml_newline();
|
||||
}
|
||||
|
||||
log_write(LOG_PLAIN, "Aggressive OS guesses: %s (%.f%%)",
|
||||
FPR->prints[0]->OS_name, floor(FPR->accuracy[0] * 100));
|
||||
FPR->matches[0]->OS_name, floor(FPR->accuracy[0] * 100));
|
||||
for (i = 1; i < 10 && FPR->num_matches > i && FPR->accuracy[i] > FPR->accuracy[0] - 0.10; i++)
|
||||
log_write(LOG_PLAIN, ", %s (%.f%%)", FPR->prints[i]->OS_name, floor(FPR->accuracy[i] * 100));
|
||||
log_write(LOG_PLAIN, ", %s (%.f%%)", FPR->matches[i]->OS_name, floor(FPR->accuracy[i] * 100));
|
||||
|
||||
log_write(LOG_PLAIN, "\n");
|
||||
}
|
||||
|
||||
@@ -371,6 +371,14 @@ o [Nsock] Consider adding server support to Nsock so it can accept
|
||||
followed by a nonblocking accept(). Then Nping gives the SD's to
|
||||
Nsock to manage.
|
||||
|
||||
o Consider implementing both global and per-host congestion control in
|
||||
the IPv6 OS detection engine. Currently it handles congestion globally
|
||||
(one CWND and SSTHRESH shared by all hosts). This works fine but it
|
||||
may not be the most efficient approach: if the congestion is not
|
||||
in our network segment but in a target's and we are os-scanning
|
||||
hosts in different networks, then all hosts get "penalized" because
|
||||
there is congestion in another network, not in theirs.
|
||||
|
||||
o [Nsock] Consider implementing a nsock_pcap_close() function or making
|
||||
nsp_delete() call pcap_close() when pcap IODs are used. Currently valgrind
|
||||
warns about a socket descriptor left opened (at least in Nping).
|
||||
|
||||
Reference in New Issue
Block a user