IDE + VM mit allen Instructions

Die VM hat nun wie versprochen 21 Instructions.
Im Laufe der Zeit werden natürlich noch weitere hinzu kommen um die Geschwindigkeit zu erhöhen.

call Adresse ✔
jmp Adresse ✔
jne Adresse ✔
jnl Adresse ✔
jng Adresse ✔
je Adresse ✔
jl Adresse ✔
jg Adresse ✔
cmp eax,Adresse ✔
mov eax,Adresse ✔
add eax,Adresse ✔
sub eax,Adresse ✔
push Adresse ✔
invoke LoadLibary,Adresse ✔
invoke GetProcAddress,Adresse ✔
mov ebx,Adresse ✔
mov ecx,Adresse ✔
add ebx,Adresse ✔
sub ebx,Adresse ✔
add ecx,Adresse ✔
sub ecx,Adresse ✔

Damit lässt sich doch schon einiges realisieren.
Zu downloaden gibt es die Source hier:
http://sourceforge.net/projects/morpheusvm/files/plain%20VM/vm.Asm/download

Aber das ist die kleinste Entwicklung. Viel mehr hat sich die IDE entwickelt, die ebenfalls opensource ist.
Es sind bereits Syntaxhighlighting, ein simpler Syntax-Check und eben die Oberfläche fertig.
Zu downloaden gibt es die Source der IDE hier:
http://sourceforge.net/projects/morpheusvm/files/Morpheus%20IDE%200.1/test.rar/download

Fortschritte der IDE

Nachdem ich die restlichen 7 Instructions nun erfolgreich implementiert habe, mache ich eine kleine Pause und arbeite bei der IDE weiter. Bist jetzt steht das Syntaxhighlighting, Open+Save+Save as File, Registrierung der Dateieendung.
So schaut das Projekt momentant aus:

Jetzt setze ich mich mal an das Projektformat.

Contact our Job department if you are
desperate to get involved.

Die Dokumentation steht

Eine kleine aber feine Neuigkeit.

Ich habe nun eine neue Seite hinzugefügt, welche der Dokumentation dient.
Wer also ein Problem hat sollte diese besuchen.

Die Dokumentation ist unter http://morpheusvm.sourceforge.net/?page_id=40 zu erreichen.

Juhu wir haben Bedingungen

Nachdem ich mir tausende unnötig komplizierte Möglichkeiten überlegt habe, einen Sprung zu handeln, bin ich auf eine einfache und gleichzeitig schnellere Möglichkeit gekommen. Es wird einfach die Adresse des ersten vOP-Codes im Register der VM gespeichert und bei einem Sprung wird im Code die Stelle angegeben. Der Lesbarkeit halber werden hier nicht Adresse angegeben sondern einfach die Stelle des Codes. Das kann man sich wie eine Zeile bei einem Text vorstellen. Also werden hier die Zeilen und nicht die Bytes gezählt. Da jede Instruction 5 Byte besitzt (bis auf das return ,das nur eine 0 ist) wird diese Adresse um 1 reduziert und dann mit 5 multipliziert. Danach wird diese errechnete Adresse auf eax geschrieben ,da wir in eax die Adresse des vOP-Codes speichern.
Derzeit unterstützt die VM 15 Instructions ,welche im Dezimalsystem dargestellt werden (wieder der Lesbarkeit halber).

call Adresse ✔
jmp Adresse ✔
jne Adresse ✔
jnl Adresse ✔
jng Adresse ✔
je Adresse ✔
jl Adresse ✔
jg Adresse ✔
cmp eax,Adresse ✔
mov eax,Adresse ✔
add eax,Adresse ✔
sub eax,Adresse ✔
push Adresse ✔
invoke LoadLibary,Adresse ✔
invoke GetProcAddress,Adresse ✔

Geplant sind noch 7 weitere Instructions.

ret
mov ebx,Adresse
mov ecx,Adresse
add ebx,Adresse
sub ebx,Adresse
add ecx,Adresse
sub ecx,Adresse

Je nach Entwicklung werden auch andere Befehle hinzukommen (wie z.B. mov eax,ebx) um die Geschwindigkeit zu erhöhen.

Jetzt beende ich mal diese 7 Befehle und danach setze ich mich an den Compiler.
Die noch recht klein und simpel gehaltene VM gibt es auch zum Download.
Quellcode
Kompilierte Exe

Die virtuelle MessageBox

Wie vielleicht schon merkbar, steht ein kleiner Teil der VM bereits schon etwas länger. Nun bin ich endlich mal zum Veröffentlichen gekommen. Als Test habe ich eine MessageBox gewählt ,da dies quasi ein Heloworld-Programm ist.
Ich habe bereits folgende Befehle erfolgreich implementiert:

call Adresse
cmp eax,Adresse
mov eax,Adresse
push Adresse
invoke LoadLibary,Adresse
invoke GetProcAddress,Adresse

Mit diesen recht einfachen Befehlen ist mir bereits jeder Funktionsaufruf möglich. Nicht nur aus der WinAPI sondern auch aus fremden DLLs. Mit LoadLibary und GetProcAddress ist es möglich die Adresse der Funktion zu bestimmen und mit einem Call rufen wir die Funktion auf. Die Parameter übergeben wir mit den Push Befehl.

Programme mit solch einen simplen Befehlssatz wären recht eintönig ,da alles immer gleich abläuft und keine Bedingungen gestellt werden können. Um diese bedingten Jumps (jnz,jne,…) zu ermöglichen ,ist es nötig einen eigenen virtuellen ausführbaren Stack zu implementieren. Das ist etwas aufwendiger und genau daran sitze ich gerade.

Unten gibt es dieses Testprogramm zum Downloaden. Ein Blick im Debugger ist zu empfehlen.

Compiled Win32 Binary
Assembler Sourcefile

Hacker und deren Bedeutung

Da ich immer noch mobil unterwegs bin gibt es von mir einen allgemeinen Artikel.
Im letzten Post wurde das Thema Hacker erwähnt und um häufige Missverständnisse zu klären, schreibe ich diesem Artikel.
Von Außenstehenden werden Hacker als IT-Spezialisten angesehen. Das sind sie auch, doch die Medien berichten häufig dass Bank XYZ gehackt wurde oder dass Hacker XYZ mit seinen Virus (der übrigens ein Trojaner ist) Schaden in Millionenhöhe angerichtet hat. Denn wen interessiert es dass der Hacker Linus Towards eines der sichersten Systeme entwickelt hat oder dass Hacker XYZ die heuristische Malware-Erkennung ermöglicht hat? Genau deshalb sind Hacker auch als bösartig verschriehen. Daher will ich Ihnen die Einteilung der Hacker mal ein wenig erläutern.

Gut, böse und dazwischen

Ich Teile Hacker gerne in Whitehats, Blackhats, Greyhats und Scriptkiddies ein. Die Scriptkiddies sind Leute die vom geistigen Alter so weit hinten sind, dass sie einfach nur Macht durch fertige Tools haben wollen. Daher auch der Name Kiddie (Kids = Kinder). Sie beherrschen meist nicht einmal eine Programmiersprache und sollten sie soetwas doch beherrschen ist es meist eine Scriptsprqche bei der ihnen alles abgenommen wird. Diese Gruppe verteilt auch die Malware nur um deren “Macht” zu zeigen. Ich würde sagen dass 90% der Malware im Internet von Scriptkiddies in die Welt gesetzt wurde.
So bevor mir schlecht wird gehe ich zu den Whitehats über. Whitehats sind Hacker die wirklich etwas drauf haben. Ich würde z.B. alle Mitarbeiter eines Antiviren-Unternehmens als Whitehats einstufen. Alle Hats unterscheiden sich lediglich von deren Spezialgebiet und deren Vorhaben. Whitehats haben ein legales Vorhaben und wollen den Usern helfen.
Blackhats haben illegale Vorhaben und wollen aus ihrem Können Geld schöpfen (was sie auch meist machen).
Greyhats sind welche die nicht immer auf der legalen Schiene sind, aber auch den Usern helfen. Greyhats leben nach ihren eigenen Gesetzen mit Moral.

Das war es soweit mit der Eintelung.

Was tuen Hacker? Und wie?

Hacker werden gern als wirre Strebertypen dargestellt die vor bunt blinkenden Shells sitzen und mit ein paar Zeichen Passwörter cracken. Das stimmt genauso wie dass Autos explodieren. Das Ganze schaut in der Realität etwas langweiliger aus. Und dass Hacker wirre Streber sind ist auch nicht wahr. Es gibt unterschiedliche Typen.

Hoffentlich hat das Ihr Bild zu Hackern etwas geändert.

Danksagung an ein Mitglied der Scene

Mit diesem Artikel möchte ich ein sehr kluges und noch dazu nettes Mitglied der so genannten Hacker-Scene danken. Bevor da irgendetwas spekuliert wird kläre ich doch mal evntl. Missverständnisse. Hacker machen nicht nur illegale Sachen und richten noch seltener Schaden an. Ich bewege mich auf völlig legalem Boden und soweit ich weiß tut dies das hier erwähnte Mitglied auch.
Fazit: ich distanziere mich von jeglichen illegalen Aktionen die auf den Namen der Hacker abgewickelt wurden und fördere keines Wegs diese Leute.
Also zurück zu meiner Danksagung. Ich möchte hier Dizzy_D danken, der mir mit seinem Beispiel einer VM und seiner schnellen und klaren Erklärung in ICQ, gezeigt hat wie eine Codevirtualisierung funktioniert.
Wer Interesse hat schaut sich den Artikel auf seinem Blog an.

Morpheus VM ist nun bei SourceForge

Da nun meine erste virtualisierte MessageBox fertig ist und ich diese auch bald veröffentlichen werde, habe ich mein Projekt auf SourceForge.Net registriert.
SourceForge ist eine Webseite die unzählige Opensource-Projekte hostet und somit der Opensource-Community einen enormen Beitrag leistet.
Ich bin für diesen Service enorm dankbar, da er mir es ermöglicht mein Projekt 100% kostenlos zu halten.
Unter http://morpheusvm.sourceforge.net/ werden in Zukunft alle Versionen des Projekts und die dazugehörigen Sourcefiles zum Downloaden angeboten.
Updates werden hier aber trotzdem noch gepostet.

Die oben genannte MessageBox-VM wird entweder morgen oder am Freitag veröffentlicht.

Wenn man die Projektseite besucht fällt einen vieleicht auf, dass nur Windows unterstützt wird. Das ist nur vorübergehend. Sobald die Sprache einsatzbereit ist, werde ich die VM und die dazu gehörigen Headerfiles Linux-kompatibel machen.
Ich entschuldige mich außerdem, dafür dass ich die MessageBox noch nicht heute veröffentliche, aber da ich im Moment mobil unterwegs bin ist das recht schwer.

Das Konzept

Hier will ich den Interessierten einen Einblick in das momentane Grundkonzept von MetaCode geben.

Wie schon im 1. Post erwähnt wird hier eine Virtuelle Maschine zur Ausführung verwendet. Es handelt sich also um eine Codevirtulisierung.

Die VM unterstützt 16 verschiedene Assembler-Befehle wovon jeder 3 verschiedene OP-Codes hat. Es wird hier somit mit eigenen OP-Code gearbeitet. Durch die 3-fache Belegung der Befehle sind bei einer 10 Zeilen langen Anwendung also um die 60 000 verschiedenen Gestalten Möglich (hier wird von V-ASM gesprochen – eine Message-Box hat zum Beispiel 5 Zeilen).

Die VM unterstützt folgende Befehle (aus welchen diverse Funktionen geschrieben werden können):

call Adresse ✔
jmp Adresse ✔
jne Adresse ✔
jnl Adresse ✔
jng Adresse ✔
je Adresse ✔
jl Adresse ✔
jg Adresse ✔
cmp eax,Adresse ✔
mov eax,Adresse ✔
ret
add eax,Adresse ✔
sub eax,Adresse ✔
push Adresse ✔
invoke LoadLibary,Adresse ✔
invoke GetProcAddress,Adresse ✔

Bei den letzten 2 Befehlen handelt es sich um API-Calls welche den Aufruf von Funktionen aus DLLs ermöglichen.
Sowohl die Variabeln als auch die OP-Codes werden im Stack gespeichert. Um das zu veranschaulichen habe ich ein kleines Bild des Stacks (wie man ihn sich vorstellen kann) gemacht.

Ich hoffe das verdeutlicht die Funktionsweise des VM. Geschrieben ist die VM in Assembler und in der erzeugten Executable wird die VM auch gleich inkludiert (somit muss der Anwender keine zusätzlichen Programme herunterladen).

Was ist Morpheus VM?

Morpheus ist eine Programmiersprache die derzeit noch in der Entwicklungsphase steckt. Diese Programmiersprache basiert auf einer VM welche ein Konzept der Metamorphie unterstützt. Diese VM ist allerdings keine VM wie Virtual Box oder VMWare sondern eher eine wie die Java VM. Es geht hier also um eine Codevirtualisierung. Das Projekt wird opensource und ist als reines Experiment geplant.

Sollte jemanden die Metamorphie nicht bekannt sein kann ich hier den Artikel von Wikipedia empfehlen.
Allerdings möchte ich keineswegs ,dass mein Projekt für die Virenherstellung verwendet wird.

Im nächsten Beitrag werde ich das Konzept näher erläutern.