C++ DNS Checker

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Roel911
  • Registratie: Januari 2008
  • Laatst online: 18-08 19:29
Ik ben een DNS checker aan het maken, die brute-force combinaties (bijv. aa.nl - 99.nl) probed. Echter zodra ik het programma compileer en uitvoer wordt alle output grotendeels vervangen door het laatste resultaat (behalve de regelnummers).

De code:
C++: adbfc.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
//compile: g++ adbfc.cpp -lanl -std=c++11 -fpermissive
#define _GNU_SOURCE
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>

static struct gaicb **reqs = NULL;
static int nreqs = 0;
const std::string validurlchar ="abcdefghijklmnopqrstuvwxyz0123456789-_";
const std::string tld=".nl";

/* Add requests for specified hostnames */
static void add_requests(void)
{
    int nreqs_base = nreqs;
    char *host;
    int ret;
    //std::cout << validurlchar.length() << std::endl;
    for(int a=0;a<validurlchar.length();a++)
    {
   for(int b=0;b<validurlchar.length();b++)
   {
          std::string url;
     url=validurlchar[a];
     url+=validurlchar[b];
     url+=tld;
     nreqs++;
     reqs = realloc(reqs, nreqs * sizeof(reqs[0]));

     reqs[nreqs - 1] = calloc(1, sizeof(*reqs[0]));
     reqs[nreqs - 1]->ar_name = url.c_str();
     //std::cout << url.c_str() << std::endl;
     //std::cout << reqs[nreqs-1]->ar_name << std::endl;
   }
    }
   ret = getaddrinfo_a(GAI_WAIT, &reqs[nreqs_base], nreqs - nreqs_base, NULL);
       if (ret) {
        fprintf(stderr, "getaddrinfo_a() failed: %s\n",
                gai_strerror(ret));
        exit(EXIT_FAILURE);
    }
}



/* List all requests */
static void
list_requests(void)
{
    int i, ret;
    char host[NI_MAXHOST];
    struct addrinfo *res;

   for (i = 0; i < nreqs; i++) {
        printf("[%02d] %s: ", i, reqs[i]->ar_name);
        ret = gai_error(reqs[i]);

       if (!ret) {
            res = reqs[i]->ar_result;

           ret = getnameinfo(res->ai_addr, res->ai_addrlen,
                              host, sizeof(host),
                              NULL, 0, NI_NUMERICHOST);
            if (ret) {
                fprintf(stderr, "getnameinfo() failed: %s\n",
                        gai_strerror(ret));
                exit(EXIT_FAILURE);
            }
            puts(host);
        } else {
            puts(gai_strerror(ret));
        }
    }
}


int main()
{
 add_requests();
 list_requests();
}

De output:
[00] __.nl: Name or service not known
...
[1443] __.nl: Name or service not known

Ik ben me er van bewust dat "_" en "-" niet in alle gevallen zomaar geldig zijn. Zelfs als ik "9" het laatst laat checken worden alle regels vervangen met bijv. "99.nl". Wat ik zelf geprobeerd heb: google, man page van getaddrinfo_a doorgelezen, gezocht op stackoverflow. Tevens als test het voorbeeld genoemd op de manpage gecompileerd en 2 domeinen doorgegeven als parameters, dat werkt goed. Wat doe ik fout?

Acties:
  • 0 Henk 'm!

  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Ik ken c++ niet zo goed om hier een definitief antwoord op te kunnen geven. Wat mij wel opvalt:

C++:
1
2
3
4
5
for(...)
{
    std::string url;
    ... = url.c_str();
}


Is de pointer nog wel geldig die uit c_str() komt nadat een iteratie van de loop voorbij is? Volgens mij wordt url namelijk bij iedere iteratie opnieuw gealloceerd (op dezelfde locatie?) en weer opgeruimt bij het einde van de loop-scope.

[ Voor 6% gewijzigd door Feanathiel op 16-06-2015 08:32 ]


Acties:
  • 0 Henk 'm!

  • Roel911
  • Registratie: Januari 2008
  • Laatst online: 18-08 19:29
Feanathiel schreef op dinsdag 16 juni 2015 @ 08:32:
Ik ken c++ niet zo goed om hier een definitief antwoord op te kunnen geven. Wat mij wel opvalt:

C++:
1
2
3
4
5
for(...)
{
    std::string url;
    ... = url.c_str();
}


Is de pointer nog wel geldig die uit c_str() komt nadat een iteratie van de loop voorbij is? Volgens mij wordt url namelijk bij iedere iteratie opnieuw gealloceerd (op dezelfde locatie?) en weer opgeruimt bij het einde van de loop-scope.
Je hebt gelijk! Ik heb een array van strings gemaakt en daarmee is de output wel zoals ik verwacht. Bedankt voor je reactie_/-\o_

Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
realloc, calloc, fprintf, puts. Je maakt het jezelf niet makkelijk door in C te programmeren.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein