Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

Weil ich in C Programmiere und nicht in C++.

Dass kommt noch.

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

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

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?

Und wie bring ich das in Ordnung ?

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?

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?

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.