Jump to content
Gonzalez

[C++] A Simple but Effective Port Scanner

Recommended Posts

/**************************************
//* * *
// ****** A Simple but effective port sca
//* * *nner
// Description:This port scanner is pret
//* * *ty simple, it just fork()'s each connect
//* * *() call, and reads the return value.

/* simple connect port scanner.. -- very fast .. very detectable... */
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>
#include <netdb.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/time.h>
#include <sys/poll.h>
static int verbose = 0;


* * enum port_e {
* * P_ERROR = 0,
* * P_CLOSED = 1,
* * P_OPEN = 2,
};

enum port_e chkport(struct sockaddr_in addr);
//int v_printf(const char *fmt, ...); /*
//* * *verbose printf */
#define v_printf(x) if(verbose) printf x
int main(int argc, char *argv[])


* * {
* * int index = 1, i;
* * struct sockaddr_in addr;
* * struct hostent *hp;


* * * * if(argc < 2) {
* * * * fprintf(stderr, "Usage:\n\t%s [-v] <host>\n", argv[0]);
* * * * return 0;
* * * * }
* * * * if((argv[1][0] == '-') && argv[1][1] == 'v')
* * * * verbose = index++;


* * * * * * if(index != 1 && argc == 2) {
* * * * * * fprintf(stderr, "missing host\n");
* * * * * * return 0;
* * * * * * }
* * * * * * hp = gethostbyname(argv[index]);


* * * * * * * * if(!hp) {
* * * * * * * * fprintf(stderr, "could not lookup host\n");
* * * * * * * * return 0;
* * * * * * * * }
* * * * * * * * memset(&addr, 0, sizeof(addr));
* * * * * * * * addr.sin_family = PF_INET;
* * * * * * * * memcpy(&addr.sin_addr, hp->h_addr, hp->h_length);
* * * * * * * * printf("Scanning Host %s\n", argv[index]);
* * * * * * * * clock_t st = clock();


* * * * * * * * * * for(i = 1; i <= 65535; i++) {
* * * * * * * * * * addr.sin_port = htons(i);


* * * * * * * * * * * * if(!fork()) {
* * * * * * * * * * * * enum port_e p = chkport(addr);


* * * * * * * * * * * * * * switch(p) {
* * * * * * * * * * * * * * case P_OPEN: printf("%-4d OPEN\n", i); break;
* * * * * * * * * * * * * * case P_CLOSED: if(verbose) printf("%-4d CLOSED\n", i); break;
* * * * * * * * * * * * * * case P_ERROR: if(verbose) printf("%-4d ERROR\n", i); break;
* * * * * * * * * * * * * * }
* * * * * * * * * * * * * * exit(0);
* * * * * * * * * * * * * * }
* * * * * * * * * * * * * * }
* * * * * * * * * * * * * * printf("Done in %.2lf seconds.\n", (float) (clock() - st) / CLOCKS_PER_SEC);
* * * * * * * * * * * * * * return 0;
* * * * * * * * * * * * }

* * * * * * * * * * * * enum port_e chkport(struct sockaddr_in addr)


* * * * * * * * * * * * * * {
* * * * * * * * * * * * * * int sd = socket(PF_INET, SOCK_STREAM, 0);
* * * * * * * * * * * * * * enum port_e prtst = P_OPEN;
* * * * * * * * * * * * * * if(sd < 0)
* * * * * * * * * * * * * * return P_ERROR;
* * * * * * * * * * * * * * /*


* * * * * * * * * * * * * * * * if(fcntl(sd, F_SETFL, O_NONBLOCK) < 0) {
* * * * * * * * * * * * * * * * close(sd);
* * * * * * * * * * * * * * * * return P_ERROR;
* * * * * * * * * * * * * * * * }
* * * * * * * * * * * * * * * * */
* * * * * * * * * * * * * * * * if(connect(sd, (struct sockaddr*) &addr, sizeof(addr)))
* * * * * * * * * * * * * * * * return P_CLOSED;
* * * * * * * * * * * * * * * * shutdown(sd, 2);
* * * * * * * * * * * * * * * * close(sd);
* * * * * * * * * * * * * * * * return prtst;
* * * * * * * * * * * * * * }

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...