Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hy,

hat mir jemand nen Link zu ner Page die erklärt wie man nen Scanner mit C baut ?

Soll bloß ein Konsolenapp sein, keine Gui. Hab viele Beispiele für C++ gefunden, aber nichts für C.

Die Sourcen von IpcScan oder ScanSql wären genial, die 2 Scanner sind echt fein.

Thanks

Geschrieben

Ich will verstehen wie genau das funktioniert. Vorallem die SQL/NT Anmelderoutine interessiert mich. Aber genauso das Threaden und das aufsplitten der Range, in einzelne IP's, mit der man das Prog startet.

Greets Ex

Geschrieben

Ich wuerde sagen, dann hast du jetzt ein Problem.

Der Datenbankzugriff und auch die NT Anmeldung sind meines Erachtens nicht unter ANSI C moeglich.

Die einzige Alternative sind vielleicht C++ Dlls in denen der Zugriff gehandlet wird und die du dann auch unter ANSI C ansprechen kannst.

Ich halte dein Anliegen sogesehen fuer nicht allzu sinnvoll :)

Goos

Geschrieben

Das Problem ist, dass ich den Scanner in ein bereits vorhandenes C Programm integrieren will. Das umschreiben des Progs würde viel zu viel Zeit beanspruchen.

Du magst recht haben über den Sinn dieses Vorhabens, aber mir bietet sich leider keine andere Möglichkeit.

Kannst du (oder jemand anders) mir trotzdem helfen das ganze ans laufen zu bringen?

Fangen wir mit dem Pingen (mit Threads) an und arbeiten uns zum Anmelden an SQL/NT heran.

Sagen wir mal, ich möchte das der Scanner unendlich lange läuft, also ohne Range starten, und maximal 20 Threads erzeugt. Dann müsste das doch ungefähr so aussehen. (Garantiert Fehler drin, da ich noch nie was derartiges geschrieben habe)



struct sockaddr_in scan;


int maxNtThread = 20; // maximal Anzahl von Threads

int curNtThread = 0; // Derzeitige Anzahl von Threads

int ntPort = 139; // NT Port

int TermNtThread = 0; // Falls auf 1 gesetzt werden alle Threads beendet


void *scannerNT(void *addr)

{

	int s;


	if(TermNtThread == 1)

	{

		pthread_exit( NULL );

	}


	s = socket(AF_INET, SOCK_STREAM, 0);

	if (s == -1)

	{

		curNtThread--;

		return NULL;

	}


	// jetzt zu der Ip Connecten

	scan.sin_family = AF_INET;

       	/* inet_addr() wandelt einen String mit einer IPAdresse 

	in 'dotted' Schreibweise in eine vom Rechner lesbare Form um */

	scan.sin_addr.s_addr = inet_addr(addr);

	scan.sin_port = htons(ntPort);


	if(connect(s, (struct sockaddr *)&scan, sizeof(scan)) == -1)

	{	

		close(s);

	}

	else

	{

		printf("Port offen!");

		close(s);

	}

	curNtThread--;

	return NULL;

}


void *ntscaninit(void *arg)

{

	int a,b,c,d;

	char destaddr[20];

	pthread_t p1[maxNtThread];


  while(1)

  {

	for(a = 70; a < 255; a++)

	{

                // Mit Blacklist-IP's abgleichen

		if(((a >= 127) && (a <= 170)) || ((a >= 192) && (a <= 217))) 

		{

			continue;

		}


		for(b = 0; b < 255; b++)

		{

			for(c = 0; c < 255; c++)

			{

				for(d = 1; d < 255; d++)

				{

					wsprintf(destaddr,"%i.%i.%i.%i", a, b, c, d);


                                        // Falls TermNtThread == 1 Thread beenden

					if(TermNtThread == 1)

					{

						pthread_exit( NULL );

					}


                                        // Falls derzeitige Threads größer oder gleich maxNtThread ist, diese While Schleife wiederholen

					while(curNtThread >= maxNtThread)

					{

						printf(""); // ohne dieses printf funzt die Schleife nicht, k.a. wieso

						continue;

					}


					curNtThread++;


					pthread_create(&p1[curNtThread], NULL, scannerNT, &destaddr);

					pthread_detach(p1[curNtThread]); 

				}

			}

		}

	}

  return NULL;

  }

Was kann man da verbessern? Bzw das mit den Threads besser regeln. Und wenn ich den Scanner so starte, dann pingt er manche IP's doppelt.

Also eigentlich müsste er so pingen: 70.0.0.1, 70.0.0.2, 70.0.0.3 usw

Aber er macht meistens: 70.0.0.1, 70.0.0.2, 70.0.0.2, 70.0.0.3, 70.0.0.3 usw

Woran liegt das ?

Und wieso spielt die while anweisung ohne das printf nicht mit?

Fragen über Fragen.

Bin dankbar für jede Hilfe.

Thx

Geschrieben
Bzw das mit den Threads besser regeln. Und wenn ich den Scanner so starte, dann pingt er manche IP's doppelt.
Das wundert mich nicht. Du übergibst jedem Thread die Adresse desselben char-Arrays (destaddr). Wie willst du sicherstellen, dass der Thread den Inhalt ausgewertet hast, bevor du ihn in der Schleife wieder änderst?
Geschrieben

Indem du entweder für jeden Thread ein eigenes Array benutzt oder durch Synchronisationsobjekte (Events o.ä.) sicherstellst, dass die Schleife erst dann weiterläuft, wenn der Thread das Array ausgewertet oder kopiert hat.

Geschrieben

würde es reichen wenn ich es so mache?


void *scannerNT(void *addr)

{

    char destaddr[20];

    strcpy(destaddr, addr);

    .....

    scan.sin_addr.s_addr = inet_addr(destaddr);

    .....

}

oder war das jetzt ein Denkfehler?

Geschrieben
Nein. Der Fehler würde seltener auftreten, aber er ist immer noch da. Wirklich sicher geht es nur so, wie ich es beschrieben habe.

Kannst mir da ein Beispiel für geben?

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...