Der erste April ist leider schon vorbei aber klar ist: E-Mails mit falschen Absenderadressen (also Fake Mails) zu schicken ist ein weit verbreiteter Scherz. Eine ähnliche Technik wird verwendet um sogenannte Phishing Mails zu versenden und Empfänger in die Irre zu führen.
Kein Wunder wenn die Technik dahinter so einfach ist, zumindest wenn man keine hohen Ansprüche an die gefälschte Mail setzt. Mit etwas Know-How lassen sich solche Mails entlarven.
Wir wollen uns heute das Grundgerüst eines Fakemailers ansehen.

Ihr braucht dazu erstmal eine PHP-fähige Plattform. Das ist also ein Webserver oder eine lokale Webserverinstallation wie XAMPP.

Der Fakemailer selbst besteht aus 2 Dateien. Da ich Aussehen und PHP Code aus Übersichtsgründen trenne wird eine .html Datei das Design des Formulars bestimmen und eine .php Datei kümmert sich um das Verarbeiten und Versenden der Daten. Man könnte Formular und PHP Code auch in 1 Datei packen, zusammen mit integrierten CSS Styles, aber etwas Stil muss sein!

Hier der Inhalt meiner .html Datei:

<html>
<form action="phpfake.php" method="post">
<table border="0">
<tbody>
<tr>
<td>Empfänger (Mail) :</td>
<td><input name="to" type="text" size="90" /></td>
</tr>
<tr>
<td>Von (Mail) :</td>
<td><input name="from" type="text" size="90" /></td>
</tr>
<tr>
<td>Von (Name) :</td>
<td><input name="name" type="text" size="90" /></td>
</tr>
<tr>
<td>Betreff :</td>
<td><input name="subject" type="text" size="90" /></td>
</tr>
<tr>
<td>Nachricht :</td>
<td><textarea cols="70" rows="10" name="message"></textarea></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Send" /></td>
</tr>
</tbody></table>
</form>
</html>

So sieht es aus:

Absolut keine Muster-.html aber es geht ja nur darum, dass ihr schnell zum Ziel kommt, anpassen und optimieren kann jeder für sich.

Die erste Zeile schickt die ausgefüllten Formulardaten an folgenden PHP Code:

<?php
$to=$_POST['to'];
$from=$_POST['from'];
$name=$_POST['name'];
$absender = $name.' <'.$from.'>';
$headers .= 'From:' . $absender . "\n";
$headers .= 'Reply-To:' . $from . "\n";
$subject=$_POST['subject'];
$message=$_POST['message'];

$ret=mail($to, stripslashes($subject), stripslashes($message), $headers);
if($ret==true) {
echo "<br /> Mail sent Successfully";
} else {
echo "<br /> Unable to Send mail";
}
?>

Die mail(); Funktion aus Zeile 11 erledigt den Mailversand.
stripslashes(); ermöglicht einfache Backslashes in eurem Mailbetreff und -text.

Die Dateien einfach auf den besagten Server laden, die .html aufrufen, ausfüllen und auf den Senden Button klicken.
Das Ergebnis ist beunruhigend überzeugend, der einfache Header gibt keine Hinweise auf einen gefälschten Absender preis.

Nur der erweiterte Header gibt Aufschluss von wem diese Mail wirklich kommt:

Received: from dd11438.kasserver.com (dd11438.kasserver.com [85.13.133.243])
by mx.kundenserver.de (node=mxeu3) with ESMTP (Nemesis)
id 0MV5j7-1O1Mvp1aSj-00YTu9 for hannes.schurig@online.de; Thu, 08 Apr 2010 21:26:04 +0200
Received: by dd11438.kasserver.com (Postfix, from userid 1086)
id 20A6B56E0C9; Thu, 8 Apr 2010 21:26:04 +0200 (CEST)

Aber clever eingesetzt ist ein Schrecken der Zielperson garantiert.
Einfach, huh!?

Ich habe mir den Spaß erlaubt und ein kleinen IT April Scherz programmiert. Eine simple Fake Fehlermeldung, die etwas nervig sein sollte.
Dazu reicht etwas Code, der das Schließen des Programms verhindert.
Damit werden folgende Wege geblockt: X Button oben rechts, Alt+F4, Rechtsklick in der Taskleiste -> Schließen, Strg+Esc Das Programm sollte nicht nur die Shortcuts überleben sondern sich als Strafe sogar ein weiteres Mal starten.

Hier der Code:

csharp“ line=“1″>
protected override void OnClosing(CancelEventArgs e)
{
e.Cancel = true;
Main Main = new Main();
Main.Show();
}

Statt also das Programm zu schließen, wird eine weitere Instanz davon gestartet.

Ich fand auch einen zweiten Code, der das selbe bewerkstelligte. Allerdings versteh ich da nur die Hälfte und habe mich für die einfacheren Zeilen oben entschieden.
Für C# Pros hier noch der Code, vielleicht kann mir ja jemand ne Erläuterung geben und sagen, ob der Code besser wäre und warum.

csharp“ line=“1″>
protected override void WndProc(ref Message m)
{
if (m.Msg != 0x0010)
{
base.WndProc(ref m);
}
else
{
Main Main = new Main();
Main.Show();
}
}

0x0010 ist wahrscheinlich das Kill Signal, dieses wird abgefangen und statt dessen das Programm ein weiteres mal gestartet. Wenn statt dem Kill Signal ein anderer Input kommt wird dieser einfach ausgeführt. Naja hier hänge ich mich weit aus dem Fenster, nur Vermutungen.

Wer mein Programm mal testen möchte, hier ist es:
Aprilscherz

Es gibt 2 Möglichkeiten, das Programm zu beenden. Prozess killen (Prozess beenden oder taskkill) oder eine der empfindlichen Stellen anklicken:

Wo ich jetzt noch Hilfe bräuchte wäre ein globaler Tastaturhook (Kenny?? :D) in C#, um von überall im System Strg+Alt+Entf abzufangen. Oder eine andere Art, den Prozess des Programms vor dem Kill „Prozess beenden“ oder „taskkill“ zu bewahren, wenn das einfacher sein sollte. Hab das leider noch nicht hinbekommen.

Beim Schreiben von Programmen nutzt man fast immer externe Dateien wie zum Beispiel .dll Dateien. Ist das Programm dann als .exe released brauch es die .dll um zu funktionieren.
Es gibt mindestens 3 Möglichkeiten, dieses Problem zu umgehen. Uns interessiert jetzt nur der leichteste und geilste Weg:

ILMerge nennt sich das Microsoft Tool, dass es erlaubt, verschiedene .NET Projektdateien zu einer Datei zusammenzuführen. Das Tool ist kommandozeilenbasiert und kommt daher nur als single .exe. Es gibt zwar GUIs für ILMerge aber die Handhabung ist denkbar einfach. Auch wenn die, im Download beiliegende, Dokumentation das nicht vermuten lässt.

Kopiert ILMerge(.exe), eure Projekt .exe und alle externen Dateien, die integriert werden sollen, in ein Verzeichnis. CMD auf und los:

ilmerge /out:Final.exe Projekt.exe ExternFunctions.dll ExternData.dll

Und schon liegt in dem Verzeichnis eine Final.exe, die allein funktionstüchtig ist. Einfacher gehts gar nicht!

Das neue Benutzerkontensicherheitsprinzip ab Vista kennen ja sicher alle. Wird eine ausführbare Datei oder ein Programm mit einem Klick oder Doppelklick geöffnet, sei es in einem Administratorkonto oder nicht, wird das Programm selbst nicht mit Administratorrechten ausgeführt. Erst wenn man über Rechtsklick -> Als Administrator ausführen nutzt wird das Programm auch wirklich mit Administratorrechten ausgeführt.
Dafür gibt es in Vista und 7 Integrity Level, verschiedene Sicherheitsstufen. Folgende Level existieren:

  • Trusted Installer
  • System (operating system processes)
  • High (administrators)
  • Medium (non-administrators)
  • Low (temporary Internet files)
  • Untrusted

Auf Deutsch nennen sich die Gruppen etwas anders, hier ist von „Niedrige Verbindlichkeitsstufe“, „Mittlere Verbindlichkeitsstufe“ und „Hohe Verbindlichkeitsstufe“ die Rede.
Alle Gruppen eines Benutzers seht ihr mit „whoami /groups“ in der cmd.
Wenn ihr also eure Gruppen anzeigen lasst und da steht (wahrscheinlich ganz am Ende) „Verbindliche Beschriftung\Mittlere Verbindlichkeitsstufe“ dann habt ihr die cmd normal aufgerufen, nicht als Administrator.
Wird ein Programm mit „Rechtsklick -> Als Administrator ausführen“ gestartet gehört es der Gruppe „Hohe Verbindlichkeitsstufe“ an.

Um mit einem Batch Programm auszulesen, ob ein Programm normal oder Als Administrator ausgeführt wurde, helfen folgende Zeilen:

@echo off
whoami /groups | find "S-1-16-12288" > nul
if errorlevel 1 goto noadmin
echo Programm wurde als Administrator gestartet
pause
goto eof
:noadmin
whoami /groups | find "S-1-16-8192" > nul
if errorlevel 0 echo Programm mit normalen Rechten gestartet
pause
goto eof

adminrechte-mit-cmd-auslesen

php-warnungGlobal Translator 1.2.6 (die derzeit aktuellste Version) hat laut Bloggerkollege Kenny, der hinsichtlich Programmierung in meinen Augen ein kompetenter Ansprechpartner ist, einen Fehler im Code. Der Fehler lässt sich in der Errorlog des Servers nachvollziehen, sucht folgende Zeile:

[Datum] [error] [client IP] PHP Warning: <>is_dir(): open_basedir restriction in effect. File (bla.bla) is not within the allowed path(s): (/Pfad/zu/den/httpdocs:/tmp) in wp-content/plugins/global-translator/translator.php on line 1520

In seinem Blogbeitrag zeigt er auch, wie sich dieser Fehler beheben lässt.
Öffnet die translator.php im Global Translator Pluginverzeichnis oder wählt im WordPress Adminbereich bei Plugins -> Editor das Plugin aus.

In Zeile 1535 (vlt. auch 1520) dürfte es etwa so aussehen:
php“>if ($item != ‚.‘ && $item != ‚..‘ && $item != ’stale‘ && !is_dir($item)){

Wenn nicht, sucht einfach in eurem Editor nach !is_dir($item) (Suchfunktion meist Tastenkombi Strg+F).

ändert es folgendermaßen ab:
php“>if ($item != ‚.‘ && $item != ‚..‘ && $item != ’stale‘ && !is_dir($cachedir . ‚/‘ . $item)){

Aus dem letzten && !is_dir($item)) wird also
&& !is_dir($cachedir . ‚/‘ . $item))

Danke Kenny für den Hinweis 🙂

Die Antwort auf die Frage wurde mir natürlich genau in dem Moment zu geschoben, als ich den Artikel veröffentlicht hatte.
Die Lösung steht hier und ist erschreckend simpel.
„for“ als delimiter einfach ein Tab übergeben, wieso ich da nicht drauf gekommen bin…

for /f "tokens=2* delims=	 " %%a in ('reg query "HKLM\SOFTWARE\SPSS\SPSS for Windows German\15.0\Setup" /v Directory') do set pfad=%%b

So einfach ist es.
Weiterlesen

dateidatum-per-batch-auslesen
Um per Batch herauszufinden, wann eine Datei erstellt, das letzte Mal geöffnet oder geändert wurde, folgende Befehle:

Letzte Änderung:

for /f "delims= " %%a in ('dir c:\spss15\*.exe^|findstr /i /l "spsswin.exe"') do echo %%a

Anderes Beispiel: auf der Suche nach der letzten Änderung von test.bat

for /f "delims= " %%a in ('dir p:\fad\*.bat^|findstr /i /l "test"') do echo %%a

Auch möglich wären:

('dir p:\fad\*.*^|findstr /i /l "test.bat"')
('dir p:\fad\*.bat^|findstr /i /l "test.bat"')
('dir p:\fad\^|findstr /i /l "test"')

Wenn das Ergebnis von „dir“ in Kombination mit „findstr“ mehr als 1 Ergebnis liefert dann spielt mit diesen Variationen um nur die gewollte Datei zu finden.
Ihr könnt natürlich statt zu suchen auch den exakten Pfad vom Benutzer eingeben lassen, mit Übergabe der Datei oder anderen Methoden arbeiten.

Achtung: „for“ nimmt nach „in“ Übergaben in einem Klammerpaar an, in dem wiederum ein Paar einfacher Hochkommata steht. Also

for .... in ( '  befehle  ' )

Das vor der schließenden Klammer wird oft übersehen, wenn davor etwas in „Ausführungsstrichen“ steht.

Das „^“ hinter dem „dir“ Befehl muss nur gesetzt werden, wenn der „dir“ Befehl in der „for“ Schleife verarbeitet wird. Wollt ihr nur diesen Teil (ohne das „for“ Gedöns), dann mit:

dir c:\spss15\*.exe|findstr /i /l "spsswin.exe"

Nun das Erstelldatum:

for /f "delims= " %%a in ('dir c:\spss15\*.exe /t:c^|findstr /i /l "spsswin.exe"') do echo %%a

und der letzte Zugriff:

for /f "delims= " %%a in ('dir c:\spss15\*.exe /t:a^|findstr /i /l "spsswin.exe"') do echo %%a

Wie man sieht, der Parameter „/t“ in „dir“ gibt an, welches Datum ausgegeben wird. Er nimmt die Werte „c“ für Erstelldatum, „a“ für den letzten Zugriff oder „w“ für den letzten Schreibzugriff. Funktioniert nur unter NTFS, mehr Infos durch „dir /?“.

Wollt ihr jetzt nur einen bestimmten Teil der Datums, z.B. nur das Jahr, könnt ihr dieses auch herausfiltern.

Nur das Jahr des Erstelldatums:

for /f "tokens=3 delims=. " %%a in ('dir c:\spss15\*.exe /t:c^|findstr /i /l "spsswin.exe"') do echo %%a

Monat wäre dann logischerweise „tokens=2“ und Tag „tokens=1“.

Erklärungen dazu gern per Comment oder Mail. Hab grad wenig Zeit.
Das hat mich mehr Zeit gekostet als ich dachte, daher gibts hier die Niederschrift.