Commit 26a1961f authored by robertdavidgraham's avatar robertdavidgraham
Browse files

binary format

parent 49944128
Loading
Loading
Loading
Loading
+8 −15
Original line number Diff line number Diff line
@@ -128,15 +128,10 @@ masscan_echo(struct Masscan *masscan, FILE *fp)
     */
    fprintf(fp, "# OUTPUT/REPORTING SETTINGS\n");
    switch (masscan->nmap.format) {
    case Output_Interactive:
        fprintf(fp, "output-format = interactive\n");
        break;
    case Output_List:
        fprintf(fp, "output-format = list\n");
        break;
    case Output_XML:
        fprintf(fp, "output-format = xml\n");
        break;
    case Output_Interactive:    fprintf(fp, "output-format = interactive\n"); break;
    case Output_List:           fprintf(fp, "output-format = list\n"); break;
    case Output_XML:            fprintf(fp, "output-format = xml\n"); break;
    case Output_Binary:         fprintf(fp, "output-format = binary\n"); break;
    default:
        fprintf(fp, "output-format = unknown(%u)\n", masscan->nmap.format);
        break;
@@ -620,12 +615,10 @@ masscan_set_parameter(struct Masscan *masscan, const char *name, const char *val
        fprintf(stderr, "nmap(%s): OS scanning unsupported\n", name);
        exit(1);
    } else if (EQUALS("output-format", name)) {
        if (EQUALS("list", value))
            masscan->nmap.format = Output_List;
        else if (EQUALS("interactive", value))
            masscan->nmap.format = Output_Interactive;
        else if (EQUALS("xml", value))
            masscan->nmap.format = Output_XML;
        if (EQUALS("list", value))              masscan->nmap.format = Output_List;
        else if (EQUALS("interactive", value))  masscan->nmap.format = Output_Interactive;
        else if (EQUALS("xml", value))          masscan->nmap.format = Output_XML;
        else if (EQUALS("binary", value))       masscan->nmap.format = Output_Binary;
        else {
            fprintf(stderr, "error: %s=%s\n", name, value);
        }
+1 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ enum OutpuFormat {
    Output_XML,
    Output_ScriptKiddie,
    Output_Grepable,
    Output_Binary,
    Output_All,
    Output_List /* specific to Masscan */
};
+200 −163
Original line number Diff line number Diff line
@@ -126,6 +126,12 @@ open_rotate(struct Output *output, const char *filename)
        fprintf(fp, "<scaninfo type=\"%s\" protocol=\"%s\" />\r\n",
            "syn", "tcp" );
        break;
    case Output_Binary:
        fwrite( "mass" "can/" "1.0\0", 1, 12, fp);
        break;
    default:
        LOG(0, "output: ERROR: unknown format\n");
        exit(1);
    }

    return fp;
@@ -170,6 +176,12 @@ close_rotate(struct Output *out, FILE *fp)
        out->open_count + out->closed_count
        );
        break;
    case Output_Binary:
        fwrite( "mass" "can/" "1.0\0", 1, 12, fp);
        break;
    default:
        LOG(0, "output: ERROR: unknown format\n");
        exit(1);
    }

    out->open_count = 0;
@@ -432,8 +444,8 @@ output_report(struct Output *out, int status, unsigned ip, unsigned port, unsign
            return;
    }


    if (masscan->nmap.format == Output_List || masscan->nmap.format == Output_All) {
    switch (masscan->nmap.format) {
    case Output_List:
        fprintf(fp, "%s tcp %u %u.%u.%u.%u %u\n",
            status_string(status),
            port,
@@ -443,8 +455,9 @@ output_report(struct Output *out, int status, unsigned ip, unsigned port, unsign
            (ip>> 0)&0xFF,
            (unsigned)global_now
            );
    }
    if (masscan->nmap.format == Output_XML || masscan->nmap.format == Output_All) {
        break;
    case Output_XML:
        {
        char reason_buffer[128];
        fprintf(fp, "<host endtime=\"%u\">"
                     "<address addr=\"%u.%u.%u.%u\" addrtype=\"ipv4\"/>"
@@ -466,6 +479,30 @@ output_report(struct Output *out, int status, unsigned ip, unsigned port, unsign
            ttl
            );
        }
        break;
    case Output_Binary:
        {
            struct {
                unsigned timestamp;
                unsigned ip;
                unsigned short port;
                unsigned char reason;
                unsigned char ttl;
            } foo;
            foo.timestamp = (unsigned)global_now;
            foo.ip = ip;
            foo.port = (unsigned short)port;
            foo.reason = (unsigned char)reason;
            foo.ttl = (unsigned char)ttl;

            fwrite(&foo, 1, 12, fp);
        }
        break;
    default:
        LOG(0, "output: ERROR: unknown format\n");
        exit(1);

    }

}
+19 −6
Original line number Diff line number Diff line
@@ -252,6 +252,11 @@ extern unsigned tcp_checksum(struct TcpPacket *pkt);

/***************************************************************************
 * wrapper for libpcap's sendpacket
 *
 * PORTABILITY: WINDOWS and PF_RING
 * For performance, Windows and PF_RING can queue up multiple packets, then
 * transmit them all in a chunk. If we stop and wait for a bit, we need
 * to flush the queue to force packets to be transmitted immediately.
 ***************************************************************************/
int
rawsock_send_packet(
@@ -260,7 +265,7 @@ rawsock_send_packet(
    unsigned length,
    unsigned flush)
{

    /* PF_RING */
    if (adapter->ring) {
        int err = PF_RING_ERROR_NO_TX_SLOT_AVAILABLE;

@@ -270,7 +275,10 @@ rawsock_send_packet(
	    if (err < 0)
    		LOG(1, "pfring:xmit: ERROR %d\n", err);
        return err;
    } else if (adapter->sendq) {
    }
    
    /* WINDOWS PCAP */
    if (adapter->sendq) {
        int err;
        struct pcap_pkthdr hdr;
	    hdr.len = length;
@@ -291,13 +299,18 @@ rawsock_send_packet(
			; //printf("+%u\n", count++);
        if (flush) {
            pcap_sendqueue_transmit(adapter->pcap, adapter->sendq, 0);

            /* Dude, I totally forget why this step is necessary. I vaguely
             * remember there's a good reason for it though */
   			pcap_sendqueue_destroy(adapter->sendq);
			adapter->sendq =  pcap_sendqueue_alloc(65536);
        }
        return 0;
    } else {
        return pcap_sendpacket(adapter->pcap, packet, length);
    }
    
    /* LIBPCAP */
    return pcap_sendpacket(adapter->pcap, packet, length);
    
}
extern unsigned control_c_pressed;