Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Kopierschutz (https://www.delphipraxis.net/157125-kopierschutz.html)

Peter666 30. Dez 2010 16:22

Kopierschutz
 
Hallo allerseits :) Sicherlich werden einige Leute hier ein ähnliches Problem haben, wie ich hier beschreibe: Wer gute Software produziert muss auch damit rechnen dass diese raubkopiert und/oder gecracked wird. Als Entwickler nimmt man das selbstverständlich ziemlich persönlich und es ist denke ich ein Ammenmärchen, dass alle die eine Raubkopie nutzen sich niemals die Software legal erwerben würden.
Wie dem auch seih, in der Regel sollte man nicht zu viel Arbeit in das Entwickeln eines Kopierschutzes stecken, da professionelle Teams nahezu jeden Kopierschutz auf Kurz oder Lang aushebeln.
Aber niemand hat behauptet man sollte es ihnen leicht machen :)
Was waren also meine Schritte bis zu meiner jetzigen Lösung (sieht man von der Webrecherche ab)? Zu allererst kauft man sich einen Exepacker für den es keinen One-Click Unpacker gibt. Gute Beispiele finden sich im Netz, deswegen gehe ich nicht darauf ein.
Der zweite Ansatz ist eine dezentrale Schlüssellogik die nicht auf eine einfache: "If Key=GenerateKey(Nutzerkennung)" hinausläuft. Auch sollte man sowas wie: If Keyeingabe=False then Showmessage('Falscher Schlüssel') tunlichst vermeiden..
Aber dennoch gibt es diverse Codestellen die man gerne unleserlich machen möchte. Mein Ansatz schaut hierfür wie folgt aus:
Man packt einen Marker an den Beginn der zu verschlüsselnden Codezeile und einen an das Ende.

Delphi-Quellcode:
 lblBlockStart:
    asm
     db $EB, $0B; // Jmp +10 -> die Position hinter dem MarkerStart- Text
     db "MarkerStart"
    end;

 lblBlockEnd:
    asm
     db $EB, $09
     db "MarkerEnd"
    end;
Die Adressen der beiden Labels kann man via mov eax, offset lblBlockStart bzw. lblBlockEnd ja auslesen.
Zum Verschlüsseln reicht ein einfaches:

Delphi-Quellcode:
 data:= pointer(StartPosition);
 VirtualProtect(data, EndPosition-StartPosition, PAGE_EXECUTE_READWRITE, @OldProtect);
 // verschlüssele den Data Pointer mit einem Algorithmus
 VirtualProtect(Data, EndPosition-StartPosition, OldProtect, @oldProtect);
vollkommen aus.
Jetzt braucht man nur noch ein Patchtool zu schreiben, dass nach $EB, $0B, "MarkerStart" bzw. dem Endmarker sucht und verschlüsselt das ganze mit dem gleichen Passwort.

Das ganze kann man sicherlich verfeinern, dass bleibt ja jedem selber überlassen..

Hat jemand eventuell noch irgendwelche Ideen, die das Debuggen vermiesen? Ich denke da an Funktionen die in einem separaten Thread aufgerufen werden und nach Debuggern ausschau halten bzw. im Zweifel die Anwendung beenden.
Alles was sich so im Internet befindet ist irgendwie Stand <=2005 :(

Peter

Luckie 30. Dez 2010 16:29

AW: Kopierschutz
 
Wesentlich besser: Deaktiviere bestimmte Features oder schränke sie per Compilerschalter ein. Was nicht da ist, kann man auch nicht cracken.

Peter666 30. Dez 2010 16:38

AW: Kopierschutz
 
Ja, das trifft aber nur bei ner Demoversion bzw. Shareware zu.

Phoenix 30. Dez 2010 18:37

AW: Kopierschutz
 
Das Problem mit dem Exepacker ist, dass ich den in nicht ganz 10 Minuten ausgehebelt habe - das brauchst Du also schon gar nicht zu probieren (sich selbst in Memory entpacken lassen und dann den Prozess-Memory dumpen (da ist das komplette entpackte Programm drin), den richtigen Einsprungspunkt suchen und that's it). Exepacker haben nur einen einzigen Zweck: Speicherplatz auf der Platte oder beim Übertragen durchs Internet zu sparen auf Kosten des RAM bei der Ausführung. Security ist da njiente.

@Verschlüsselung: Nicht ganz falscher Ansatz, das Problem ist, dass man bei der Ausführung solcher Blöcke diese auch während der Ausführung im entschlüsselten Zustand wegdumpen und dann in das binary-Image wieder einfügen kann. Zudem: Ist das Passwort bekannt hat es sich auch ausverschlüsselt.

Holger (von IBExpert) hat auch *lange* sowas versucht und ist jedes mal recht schnell umgangen worden.
Er setzt nun auf Kommerzielle Tools die tatsächlich (bis jetzt) das halten, was sie versprechen.

Die Muhkuh 30. Dez 2010 19:26

AW: Kopierschutz
 
Eventuell wäre es interessant zu wissen, welche Tools das sind. Dem einen oder anderen kann das sicherlich helfen.

mkinzler 30. Dez 2010 19:42

AW: Kopierschutz
 
Richtig sicher gibt es aber nicht
http://www.heise.de/newsticker/meldu...t-1161876.html
http://www.youtube.com/watch?v=4loZG...layer_embedded
Wobei es witzig ist, was Sony hier für ein komplexes System aufbaut und dieses dann durch eine "schludrige" Wahl eines Parameters ( feste/gleiche Zufallszahl) ihre System ad-absurdum führt

brechi 30. Dez 2010 19:55

AW: Kopierschutz
 
If keyEingabe = false
ist sowieso schonmal falsch, es würde
If not KeyEingabe
heißen ;)

Und zu deinem obigen Beispiel, es würde auch nichts bringen. Einen BreakPoint drauf und mann weiß was da eingetragen werden soll. Es bringt dir also 0 selbst wenns im anderen Thread läuft.

cookie22 30. Dez 2010 19:56

AW: Kopierschutz
 
schau mal hier, da hatte ich mal was gepostet.

http://www.delphipraxis.net/150049-l...ml#post1013000

wobei all diese dinge recht nutzlos sind. wenn jemand dein programm cracken will, wird er das auch früher oder später schaffen. eigentlich sollte man keine energie auf sowas verwenden. denn das ammenmärchen stimmt, jemand der gecrackte software benutzt zahlt eh nicht und die ehrlichen user benutzen keine cracks. wenn man deine software nicht cracken kan,n nutzen diese leute halt ein anderes produkt zu dem es cracks gibt.

Assarbad 31. Dez 2010 00:29

AW: Kopierschutz
 
Benutze ein Wasserzeichen in den Binärdateien und mache dies den Kunden bekannt. Kündige ebenfalls an, daß Versionen die irgendwo auftauchen identifiziert und die Urheber des Lecks (eben der jeweilige Kunde) nach Zivilrecht in Regress genommen wird - mache dies Teil des Vertrages.

Ist meiner Meinung nach die einzige effektive Maßnahme.

Alle technischen Maßnahmen scheitern schon an dem grundlegenden Widerspruch:
  1. Dem Kunden wird nicht vertraut
  2. Das Programm muß auf dem System laufen, weswegen Schlüssel oder ähnliches mitgegeben werden muß ...

Besonders absurd wird es wenn sichere kryptographische Maßnahmen benutzt werden, aber dieser Widerspruch dem Entwickler nicht bewußt ist - das ist wie der sprichwörtliche Hausschlüssel unter der Fußmatte. Jeglicher Aufwand auf technischer Ebene ist im besten Falle geeignet Anfänger vom Kopieren abzuhalten und im schlechtesten Falle zahlende Kunden zu verprellen wenn der Kopierschutz spinnt ...

generic 31. Dez 2010 00:31

AW: Kopierschutz
 
Kauf die dir lieber etwas z.B. THEMIDA.
http://www.oreans.com/themida.php
Das kompiliert ASM Code zu anderen CPU Typen.
Das macht das Debuggen schwieriger, da die meisten Programmierer nur einen CPU-Typ beherrschen aber nicht 10.
Und für 149€ bekommst du das nicht selbst nach programmiert.

Assarbad 31. Dez 2010 00:51

AW: Kopierschutz
 
Das Urheberrecht ist ein Gesetz. Wenn ich ein Buch kaufe, kann ich das auch nehmen und es sprichwörtlich kopieren. Die Maßnahmen gegen dieses mein Vorgehen werden aber nicht technischer Natur sein. Es wäre auch reichlich sinnlos für die Verleger den Text zu verschlüsseln, da ich ihn dann nicht lesen könnte. Ich müßte also mindestens den Schlüssel mitgeliefert bekommen, womit ich das Buch dann wiederum unverschlüsselt abtippen und vervielfältigen könnte. Auch ein Vorhängeschloß wäre sinnlos, da ich als Kunde selbstverfreilich darauf bestehen würde beim Kauf einen Schlüssel mitgeliefert zu bekommen. Leider enden hier die Analogien weitgehend, da sich niemand ein Wasserzeichen bei einem Buch gefallen ließe und Kopierer keine perfekten ("bitgenauen") Kopien erstellen. Aber eine Analogie bleibt: das einzig sinnvolle Vorgehen ist, die rechtliche Handhabe. Mit einem eindeutigen Wasserzeichen pro Kunden kann man dies sehr vernünftig realisieren ohne gleichzeitig die zahlende Kundschaft zu verprellen. IDA beweist das sehr eindrucksvoll, wie ich finde.

Zitat:

Zitat von generic (Beitrag 1071352)
Kauf die dir lieber etwas z.B. THEMIDA.
http://www.oreans.com/themida.php

Kann ich nur von abraten.
  1. Wie sicher Themida ist, kann man daran abschätzen, daß gecrackte Versionen benutzt wurden um Malware zu "sichern"
  2. Wegen dem obigen Punkt ist Themida in vielen Heuristiken von AVs hoch angesiedelt. Gibt also, wenn man es als Punktesystem betrachten würde mehr Punkte als diverse andere Merkmale ...
Nicht nur beim AV-Workshop 2008 in Reykjavík wurde davon geredet diverse Packer/Crypter direkt auf die schwarze Liste zu setzen. Themida war ganz oben dabei, soweit ich mich erinnere.

Zitat:

Zitat von generic (Beitrag 1071352)
Das kompiliert ASM Code zu anderen CPU Typen.
Das macht das Debuggen schwieriger, da die meisten Programmierer nur einen CPU-Typ beherrschen aber nicht 10.

Die meisten Programmierer sind auch keine Reverser :mrgreen:

Aber stimmt schon. Man ist immer auf eine Architektur spezialisiert. Andererseits ähneln sich RISC-Architekturen oft genug um Kenntnisse von einer auf eine andere anzuwenden. Und RISC "beherrscht" die Welt :lol:

Zitat:

Zitat von generic (Beitrag 1071352)
Und für 149€ bekommst du das nicht selbst nach programmiert.

Das stimmt allerdings.

Luckie 31. Dez 2010 02:11

AW: Kopierschutz
 
Und wie bekomme ich ein Wasserzeichen in die Exe und wie kann ich es wieder auslesen?

himitsu 31. Dez 2010 03:30

AW: Kopierschutz
 
im phpfurum gab's dazu mal einen Thread
http://phpforum.de/forum/showthread.php?p=1374637

Ob man das nun via PHP macht oder irgendwie anders, ist dabei ja vollkommen egal ... es musß nur irgendwie eine Signatur mit rein und wenn möglich noch eine Prüfmethode, welche die "Echtheit" der Signatur/Exe testet.

Aber auch hier, kann man davon ausgehn, daß dieses kein 100%iger Schutz ist, da der Cracker "einfach" eine andere Signatur in seine Exe einbauen und sie dann weitergeben könnte.

QuickAndDirty 31. Dez 2010 07:20

AW: Kopierschutz
 
Es gibt keinen Kopierschutz! Das liegt daran das Information kopiert werden kann. Aber man kann evtl. sowas wie einen schutz gegen das cracken einbauen. Hilft aber nur gegen wenig ambitionierte Cracker. Hier im Forum haben sich mal 3 Leute einen Wetstreitgeliefert einer hat versucht möglichst sicher das vorhandensein einer seriennummer abzfragen ohne das die stelle entdeckt und gegcrackt werden kann (über verschlüsselung usw.).
Die anderen beiden haben es jedes mal in sehr Kurzerzeit gelöst mit verschiedenen Tools. Ich glaube der Thread wurde gelöscht weil er zu "problematisch" war .

Assarbad 31. Dez 2010 10:06

AW: Kopierschutz
 
Zitat:

Zitat von Luckie (Beitrag 1071357)
Und wie bekomme ich ein Wasserzeichen in die Exe und wie kann ich es wieder auslesen?

Da gibt es dutzende Methoden.

Man könnte beispielsweise in den Linkerprozeß eingreifen und Code innerhalb der EXE verschieben. In der fertigen EXE wäre das dann abgebildet. Man kann das auch schon auf Quellebene machen und mit einem Skript für jeden Kunden eine andere - eindeutige - Anordnung der Routinen erzeugen.

Wasserzeichen können allerlei Formen annehmen, aber sie sind keine Signaturen im klassischen Sinne. Denn eine Signatur kannst du entfernen. Ebenso kann man den Check auf die Signatur entfernen. Wasserzeichen sind sowas wie Steganographie.

Peter666 31. Dez 2010 11:23

AW: Kopierschutz
 
Die einfachste Methode ein Wasserzeichen in eine beliebige Stelle zu setzen ist ein Marker wie im Eingangsthread geschrieben wurde. Ein Tool zum Patchen braucht nur die Binärdatei nach dem Marker zu suchen und in diesen den Code zu schreiben.
Mein Ansatz ist sicherlich nicht unmöglich auseinanderzunehmen, darum geht es mir auch nicht. Aus Erfahrung weiß ich, dass je länger ein Kopierschutz halbwegs sicher ist, desto länger halten sich auch die Käuferzahlen. Selbst wenn es nur 3 Wochen nach einem Release dauert, sind dass immerhin 3 Wochen mehr in denen Kunden die Software kaufen. Ich schreib jetzt nicht um welches Produkt es sich handelt, aber es ist recht beliebt und weltweit im Einsatz. Aufgrund der notwendigen Rückmeldungen (es braucht halt Internet zum vollständigen funktionieren) sehe ich wo die meisten Nutzer herkommen. Vor ein paar Jahren gab es viele Raubkopien im ehemaligen Ostblock und nun sind die meisten IP's aus dem nahen Osten (Iran, Syrien, Ägypten) bzw. leider auch aus Deutschland.

Peter

IBExpert 31. Dez 2010 13:32

AW: Kopierschutz
 
Liste der Anhänge anzeigen (Anzahl: 1)
wir benutzen übrigens auch themida von oreans in IBExpert, und ja, man hat dann
durchaus das ein oder andere Antivirenprogramm gegen sich, aber das waren meistens
AV Programme, von denen ich manchmal noch nie etwas gehört hatte. Wir nutzen
üblicherweise www.virustotal.com zu testen.

Umgekehrt kann man diese Vorgehensweise gegenüber den Kunden auch als Vorteil
verkaufen, weil eine mit themida geschützte Software, bei denen das Kompilat
rauf und runter gegen Viren geprüft wurde, kann auch auf dem Weg zum Kunden
nicht mehr verseucht werden. So manche zweifelhafte Downloadadresse im Internet
ist nur dafür da, etablierte Software mit unerwünschten Schadprogrammen zu
verbreiten.

Wir bekommen regelmäßig Anfragen von irgendwelchen zweifelhaften Downloadportalen,
die unser Produkt natürlich ungefragt mit 5 Sternen bewerten wollen, wenn wir
denn den Download über deren Portal zulassen. Ich hab mir da durchaus mal
Beispiele angesehen und festgestellt, das dort ein Setup einer Software, die
ich auch von der Hersteller Homepage bekommen konnte, immerhin ein paar MB größer
war als die Version vom Hersteller. Was auch immer die da als Wrapper drumherum
bauen weiß ich nicht, interessiert mich auch nicht, aber für die paar MB braucht
ein potentieller Kunde keine dubiosen Downloadmanager.

Unsere EXE Dateien und DLLs verlassen unsere Server aber nur so wie wir das
wollen und die sollen auch immer so bleiben, wie wir die freigeben. Und da
hat Themida eine gute Lösung, weil du egal welches Byte in der EXE veränderst
damit die EXE nicht mehr lauffähig machst.

Die AV Programmhersteller stecken nun mal in einem Dilemma, weil es auf
Betriebssytemebene ein einfaches sein könnte, Verfahren für Softwarehersteller
zu erfinden, mit denen sich binär veränderte Dateien erkennen lassen könnten.

Gibt es aber bei windoofs nicht, jedenfalls nichts relevantes. Wenn sich nun
ein System wie Themida im Markt etabliert, dann ist die Notwendigkeit für
Antivirenprogramme kaum noch gegeben. Was liegt also näher als so eine Software
zu verteufeln?

Im Anhang hab ich noch mal die Präsentation von meiner Ekon Session zu diesem
Thema angehängt, einige hier kannten die ja schon durch persönliche
Anwesenheit :thumb:

brechi 31. Dez 2010 14:00

AW: Kopierschutz
 
Ich versteh deine Logik dahinter nicht:

"Wenn sich nunein System wie Themida im Markt etabliert, dann ist die Notwendigkeit für
Antivirenprogramme kaum noch gegeben."

Du weißt schon, dass teilweise mit Themida selbst Viren/Trojaner etc. geschützt werden.
D.h. aus einem von AVs erkannten Virus kannst du X-Themida Virus Versionen machen die ggf. alle nicht erkannt werden. Ist doch logisch, dass man am einfachsten dann generell als AV-Hersteller einfach Themida-geschützte Dateien als Virus erkennt und sich nicht z.B. wie UPX/ZIP/RAR den Aufwand macht einen Entpacker zu schreiben.
Es ging früher z.B. oft genug, dass man nen Virus genommen hat, den einfach mit unterschiedlichen Stufen von UPX gepackt hat und der wurde nicht mehr erkannt.

Wenn aus einem Programm X eine eindeutige Themida Version Y erstellt werden würde, dann könnte man leicht dafür eine Signatur schreiben. Aber leider kann man zu viele Einstellungen vornehmen in Themida vornehmen...

Und wenns nur darum geht, dass bei einer kleinen Änderung die Exe nicht mehr laufen soll, dann schreibst dir selbst ne Checksum-Routine. Sorry aber das kann man bei Themida auch umgehen, dort schützt eher das Obfuscaten der Funktionen.

Assarbad 31. Dez 2010 14:26

AW: Kopierschutz
 
Zitat:

Zitat von IBExpert (Beitrag 1071431)
[...] mit denen sich binär veränderte Dateien erkennen lassen könnten.

Gibt es aber bei windoofs nicht, jedenfalls nichts relevantes.

Aha? Noch nicht geguckt, oder nicht tief genug geguckt?

Zitat:

Zitat von IBExpert (Beitrag 1071431)
Wenn sich nun ein System wie Themida im Markt etabliert, dann ist die Notwendigkeit für Antivirenprogramme kaum noch gegeben. Was liegt also näher als so eine Software zu verteufeln?

Den müßtest du aber nochmal erklären. Interessiert mich insbesondere weil Themida ja scheinbar meinen Job gefährdet :lol:

Wenn du jetzt mit TPM und Signaturen ala AuthentiCode kämst, würde ich ja noch mitgehen. Aber auch da gibt es Probleme. Wird der Kreis der vertrauenswürdigen Personen zu groß, kann deren Überprüfung nicht mehr so gründlich ablaufen oder wird entsprechend teuer.

Zitat:

Zitat von brechi (Beitrag 1071442)
Ist doch logisch, dass man am einfachsten dann generell als AV-Hersteller einfach Themida-geschützte Dateien als Virus erkennt und sich nicht z.B. wie UPX/ZIP/RAR den Aufwand macht einen Entpacker zu schreiben.

Genaugenommen wird es dann als verdächtig angezeigt. Virus oder Trojaner könnte man ja nur mit entsprechender tieferer Analyse sagen. Da aber gerade Themida besonders häufig von Malware-Autoren benutzt wurde/wird, hat man sich stillschweigend darauf geeinigt eine mit Themida bearbeitete Datei als verdächtig einzustufen.

Und noch kurz zum Vortrag: Dongles können sicher sein, aber die meisten Entwickler meinen, daß sie nur das SDK reinlinken brauchen und dann ihre Software automagisch geschützt ist. Leider liegen sie da falsch ...
Ansonsten ist es doch i.O. wenn ihr damit zufrieden seid und mit den "Nebenwirkungen" leben könnt.

mleyen 31. Dez 2010 17:47

AW: Kopierschutz
 
Zitat:

Zitat von QuickAndDirty (Beitrag 1071367)
Ich glaube der Thread wurde gelöscht weil er zu "problematisch" war .

Hier gabs bestimmt einiges, aber du meinst nicht vllt diesen?
(der is auch interessant)

OldGrumpy 1. Jan 2011 00:08

AW: Kopierschutz
 
Ich kenne das mit Themida zum Schutz der Bösewichte aus eigener Erfahrung. Von einer Software die ich betreue kursiert die letzte Version ohne Wasserzeichen (eben der IDA-Ansatz wie von Assarbad angesprochen) auch als gecrackte Version mit Themida drum rum. Hat mich etwa zwei Stunden gekostet, den laufenden Prozess soweit "aufzumachen" dass ich die geschützte Exe rausziehen konnte um zu schauen was die Jungs alles gepatcht hatten. Rein interessehalber, um zu sehen wieviel Aufwand sie sich gemacht hatten. Und das Resultat war auch zu erwarten: Weg des geringsten Widerstands. Offenbar war die Software sogar gut genug dass in Fernost eine manipulierte Version im Bundle mit Hardware verkauft wurde. Da wurden alle Logos usw. vom Original rausgeschmissen und ein eigenes Logo reingefummelt und das ganze dann als eigene Software verkauft. Im VersionInfo-Block stand sogar noch "unsere" Versionsnummer drin... :) Seitdem das Wasserzeichen drin ist und die Versionen personalisiert zum Download bereit gestellt werden, ist das Thema gegessen. Ab und zu schaue ich noch bei den üblichen Verdächtigen herum aber bis jetzt hat sich noch keiner getraut. Ich mach mir da keine Illusionen über die Dauerhaftigkeit dieses Zustands, aber ich finde es schon interessant. Die gesamte Integration hat allerdings mehr als 149 Euro gekostet, das stimmt :mrgreen:

IBExpert 1. Jan 2011 10:37

AW: Kopierschutz
 
Zitat:

Zitat von Assarbad (Beitrag 1071451)
Zitat:

Zitat von IBExpert (Beitrag 1071431)
[...] mit denen sich binär veränderte Dateien erkennen lassen könnten.

Gibt es aber bei windoofs nicht, jedenfalls nichts relevantes.

Aha? Noch nicht geguckt, oder nicht tief genug geguckt?

Thema digitale Signaturen kenn ich durchaus, unsere Software ist digital signiert, aber was hindert den Hacker daran, die Routinen, in denen wir die Gültigkeit der Signatur prüfen, lahm zu legen? Eine Windows API Call wie WinVerifyTrust in einer Exe zu finden und die Strukturen des Codes drumherum zu analaysieren stelle ich mich als das einfachste vor!

Zitat:

Zitat von Assarbad (Beitrag 1071451)
Zitat:

Zitat von IBExpert (Beitrag 1071431)
Wenn sich nun ein System wie Themida im Markt etabliert, dann ist die Notwendigkeit für Antivirenprogramme kaum noch gegeben. Was liegt also näher als so eine Software zu verteufeln?

Den müßtest du aber nochmal erklären. Interessiert mich insbesondere weil Themida ja scheinbar meinen Job gefährdet :lol:

Ob dein Job im Antivirumfeld durch Themida gefährdet ist wage ich auch zu beweifeln, aber wenn insbesondere Microsoft oder vielleicht sogar Hardwarehersteller wie Intel/AMD sich auf Standards einigen würden, die sich nicht mal eben durch simples bytepatching umgehen lassen, zum Beispiel Signaturprüfung auf Hardwarebasis, dann wäre es für Softwarehersteller einfacher, gewisse Verfahren zu etablieren, die das cracken sicherlich auch nicht unmöglich machen, aber doch deutlich erschweren. Ist aber vielleicht auch zu theoretisch, was ich mir da vorstelle, da bist du sicherlich wesentlich tiefer drin. Ich für meinen Teil möchte mich aber mit deinem Spezialwissen gar nicht messen, sondern habe halt in themida eine für uns ganz brauchbare Lösung gefunden, die scheinbar nicht jeder mit vertretbarem Aufwand umgehen kann und das reicht mir als Anforderung.

Zitat:

Zitat von Assarbad (Beitrag 1071451)
Ansonsten ist es doch i.O. wenn ihr damit zufrieden seid und mit den "Nebenwirkungen" leben könnt.

passender hätte ich das auch nicht zusammenfassen können :thumb:

Assarbad 1. Jan 2011 10:48

AW: Kopierschutz
 
Zitat:

Zitat von IBExpert (Beitrag 1071580)
Thema digitale Signaturen kenn ich durchaus, unsere Software ist digital signiert, aber was hindert den Hacker daran, die Routinen, in denen wir die Gültigkeit der Signatur prüfen, lahm zu legen? Eine Windows API Call wie WinVerifyTrust in einer Exe zu finden und die Strukturen des Codes drumherum zu analaysieren stelle ich mich als das einfachste vor!

Kann man auch "verstecken" den Aufruf. Aber wenn ich es umgehen müßte, würde ich es ohnehin nicht in der EXE selber machen sondern über einen Loader oder ähnliches.

Ansonsten:
Hacker != Cracker :zwinker:


Ein gesundes und frohes Jahr 2011 wünsche ich.

Peter666 1. Jan 2011 22:21

AW: Kopierschutz
 
Ich finde die angetretene Diskussion ja schon nett, aber persönlich sind mir die getesteten Sicherheitstools ein Graus. Halt Kommerz für die breite Masse und somit anfällig für Hacks. Sprich einmal eine Anwendung die so ein Paket nutzt gehackt und schon sind dutzende andere kompromitiert. In den letzten Tagen habe ich mir mal etliche Ansätze im Internet angeguckt und dabei ist mir eines aufgefallen: Es wird an allen Ecken nur mit ganz lauwarmen Wasser gekocht. Sprich: fast jeder Ansatz ist ein feister Clone, eines schon bestehendem.

Ein netter Trick ist zum Beispiel den Programmstart ab $40000 zu überschreiben und somit einem Procdump zu erschweren.

Aphton 2. Jan 2011 02:20

AW: Kopierschutz
 
Zitat:

Zitat von Phoenix (Beitrag 1071284)
Das Problem mit dem Exepacker ist, dass ich den in nicht ganz 10 Minuten ausgehebelt habe - das brauchst Du also schon gar nicht zu probieren (sich selbst in Memory entpacken lassen und dann den Prozess-Memory dumpen (da ist das komplette entpackte Programm drin), den richtigen Einsprungspunkt suchen und that's it). Exepacker haben nur einen einzigen Zweck: Speicherplatz auf der Platte oder beim Übertragen durchs Internet zu sparen auf Kosten des RAM bei der Ausführung. Security ist da njiente.

@Verschlüsselung: Nicht ganz falscher Ansatz, das Problem ist, dass man bei der Ausführung solcher Blöcke diese auch während der Ausführung im entschlüsselten Zustand wegdumpen und dann in das binary-Image wieder einfügen kann. Zudem: Ist das Passwort bekannt hat es sich auch ausverschlüsselt.

Holger (von IBExpert) hat auch *lange* sowas versucht und ist jedes mal recht schnell umgangen worden.
Er setzt nun auf Kommerzielle Tools die tatsächlich (bis jetzt) das halten, was sie versprechen.

Man könnte doch einen Filecrypter basierend auf den RC4-Algorithmus bauen, der ne Keyabfrage hat. Das einzige Problem hierbei wäre eben, dass man jedesmal beim Ausführen der Executable das Passwort eingeben muss, damit es im RAM/bei der Codeausführung richtig entschlüsselt (und evt. entpackt) wird.
Natürlich sollte man da keine Exceptionbehandlung einabeun. Dies würde es umso schwerer machen, da man dann wirklich das Passwort kennen muss.
Übrigens - vielleicht geht das nicht direkt aus dem obrigen Text hervor, aber die Keyabfrage wird in die Executable "reingepflanzt" (Section erstellen, Code einfügen, Einsprungspunkt umbiegen)

Edit: Vor einem Memory dump nach einem erfolgreichen Entschlüsseln hilft das natürlich auch nicht weiter. Aber dem Kunden sollte man glaube ich vertrauen können - in der Annahme, dass sich Cracker nicht die Mühe machen, das Produkt zu kaufen um es dann der breiteren Masse verfügbar machen zu können.

MfG

Assarbad 2. Jan 2011 19:50

AW: Kopierschutz
 
Zitat:

Zitat von Aphton (Beitrag 1071721)
Aber dem Kunden sollte man glaube ich vertrauen können - in der Annahme, dass sich Cracker nicht die Mühe machen, das Produkt zu kaufen um es dann der breiteren Masse verfügbar machen zu können.

Das ist leider eine Fehleinschätzung. Oftmals werden gestohlene Kreditkarten eingesetzt um ein Produkt zu kaufen und es wird danach geleakt. So bspw. schon geschehen bei IDA. Dagegen kann man sich wohl nur schützen indem man nur andere Zahlungsmethoden erlaubt.

rollstuhlfahrer 2. Jan 2011 19:54

AW: Kopierschutz
 
Nun ja, oder man führt eine Aktiverung ein. Leider sieht man schön anhand der am weitesten verbreitesten kostenpflichtigen Software von Microsoft (nämlich das OS Windows), wie man diese Aktivierung wie im Lehrbuch beschrieben umgehen kann. Es fehlt nur noch, dass man eine Anleitung findet, in der steht, dass man in der HOSTS-Datei eine Domain auf 127.0.0.1 umlegt und dann seinen eigenen Windows-Aktivierungsserver startet.

Bernhard

Aphton 2. Jan 2011 21:03

AW: Kopierschutz
 
Zitat:

Zitat von Assarbad (Beitrag 1071848)
Zitat:

Zitat von Aphton (Beitrag 1071721)
Aber dem Kunden sollte man glaube ich vertrauen können - in der Annahme, dass sich Cracker nicht die Mühe machen, das Produkt zu kaufen um es dann der breiteren Masse verfügbar machen zu können.

Das ist leider eine Fehleinschätzung. Oftmals werden gestohlene Kreditkarten eingesetzt um ein Produkt zu kaufen und es wird danach geleakt. So bspw. schon geschehen bei IDA. Dagegen kann man sich wohl nur schützen indem man nur andere Zahlungsmethoden erlaubt.

Uff, das hab ich gar nicht bedacht. Außerdem hielt ich das nur für ein Gerücht und weiters dachte ich mir, dass es, falls es ernsthaft gemacht wird, nur von den aller professionelsten gemacht werden kann. Aber trotzdem, ty for the hint.
In Addendum: Ich kann da echt keinen professionellen Tipp geben außer den 08/15 Kram. Letzendlich ist es immer so, dass alles absolut deterministisch ist, ansonsten müsste es nicht existent sein. Von dem her dürfte kein Sicherheitssystem zu 100% sicher sein (0815), und wie schon gesagt wurde, kann man es nur erschweren (again 0815). Ob es sich lohnt, muss man selber einschätzen.
Und meistens ists viel besser, direkt Experten ran zu lassen, weil die sich Tag täglich damit beschäftigen und bestimmt etwas mehr wissen, als man selbst (otto advanced programmer).

MfG

Peter666 8. Jan 2011 14:31

AW: Kopierschutz
 
Ich habe mich vorhin mal hingesetzt und angefangen einen alten Assemblersource für einen Junk Code Generator zu erstellen. Herausgekommen ist folgendes..

Code:
unit UJunkit;
interface
const
  ETG_MOVRR = $00000001;
  ETG_MOVRC = $00000002;
  ETG_MOVSXZX = $00000004;
  ETG_XCHG = $00000008;
  ETG_LEA = $00000010;
  ETG_TTTRR = $00000020;
  ETG_TTTRC = $00000040;
  ETG_INCDEC = $00000080;
  ETG_NOTNEG = $00000100;
  ETG_TESTRR = $00000200;
  ETG_TESTRC = $00000400;
  ETG_IMUL = $00000800;
  ETG_SHIFT = $00001000;
  ETG_SHxD = $00002000;
  ETG_BSWAP = $00004000;
  ETG_XADD = $00008000;
  ETG_BSx = $00010000;
  ETG_BTx = $00020000;
  ETG_JMPS = $00040000;
  ETG_SEG = $00080000;
  ETG_REP = $00100000;
  ETG_ALL = $001FFFFF;
  ETG_DEFAULT = ETG_TTTRC; // used if no cmds specified

  REG_EAX = $00000001;
  REG_ECX = $00000002;
  REG_EDX = $00000004;
  REG_EBX = $00000008;
  REG_ESP = $00000010;
  REG_EBP = $00000020;
  REG_ESI = $00000040;
  REG_EDI = $00000080;
  REG_ALL = (not REG_ESP) and $FF;
  REG_DEFAULT = REG_EAX; // used if no regs specified

procedure Junk(user_param, cmd_avail, regsrcavail,
  regdstavail: DWORD; out osizeptr: DWORD; ncmds, bufsize: DWORD;
  buf: Pointer);

implementation

type
  TRandomFunc = function(userdata, range: DWORD): DWORD; cdecl;

  TETG_Engine = procedure(
    user_param: DWORD; // user-parameter
    cmd_avail: DWORD; // set of ETG_xxx
    regsrcavail: DWORD; // set of REG_xxx
    regdstavail: DWORD; // set of REG_xxx
    out osizeptr: DWORD; // ptr to generated bufsize
    ncmds: DWORD; // max number of commands
    bufsize: DWORD; // max size of buffer
    buf: Pointer; // ptr to output buffer
    Random: TRandomFunc
    ); cdecl;

const
  ETG_bin: array[0..1139] of byte = (
    $C8, $50, $00, $00, $60, $8B, $7D, $24,
    $FC, $81, $65, $10, $EF, $00, $00, $00,
    $75, $07, $C7, $45, $10, $01, $00, $00,
    $00, $81, $65, $14, $EF, $00, $00, $00,
    $75, $07, $C7, $45, $14, $01, $00, $00,
    $00, $81, $65, $0C, $FF, $FF, $1F, $00,
    $75, $07, $C7, $45, $0C, $40, $00, $00,
    $00, $8B, $C7, $2B, $45, $24, $8B, $4D,
    $18, $89, $01, $83, $C0, $10, $3B, $45,
    $20, $73, $0C, $FF, $4D, $1C, $7C, $07,
    $E8, $05, $00, $00, $00, $EB, $E2, $61,
    $C9, $C3, $C7, $45, $FC, $01, $00, $00,
    $00, $C7, $45, $F8, $08, $00, $00, $00,
    $E8, $E4, $03, $00, $00, $89, $45, $C8,
    $C1, $E0, $03, $89, $45, $C4, $E8, $D1,
    $03, $00, $00, $89, $45, $C0, $C1, $E0,
    $03, $89, $45, $BC, $8B, $45, $14, $23,
    $45, $10, $A9, $0F, $00, $00, $00, $74,
    $13, $B8, $02, $00, $00, $00, $E8, $93,
    $03, $00, $00, $89, $45, $FC, $C1, $E0,
    $03, $89, $45, $F8, $B8, $02, $00, $00,
    $00, $E8, $80, $03, $00, $00, $89, $45,
    $DC, $D1, $E0, $89, $45, $D8, $C1, $E0,
    $02, $89, $45, $D4, $B8, $04, $00, $00,
    $00, $E8, $68, $03, $00, $00, $C1, $E0,
    $03, $89, $45, $D0, $E8, $70, $03, $00,
    $00, $C1, $E0, $03, $89, $45, $CC, $E8,
    $70, $03, $00, $00, $89, $45, $F4, $C1,
    $E0, $03, $89, $45, $E4, $E8, $62, $03,
    $00, $00, $89, $45, $EC, $E8, $5F, $03,
    $00, $00, $89, $45, $F0, $C1, $E0, $03,
    $89, $45, $E0, $E8, $51, $03, $00, $00,
    $89, $45, $E8, $E8, $4E, $03, $00, $00,
    $89, $45, $B8, $C1, $E0, $03, $89, $45,
    $B4, $E8, $40, $03, $00, $00, $89, $45,
    $B0, $B8, $1F, $00, $00, $00, $E8, $0B,
    $03, $00, $00, $96, $46, $8B, $55, $0C,
    $8B, $45, $FC, $D1, $EA, $73, $0E, $4E,
    $0F, $84, $27, $01, $00, $00, $4E, $0F,
    $84, $2D, $01, $00, $00, $D1, $EA, $73,
    $0E, $4E, $0F, $84, $2F, $01, $00, $00,
    $4E, $0F, $84, $36, $01, $00, $00, $D1,
    $EA, $73, $07, $4E, $0F, $84, $32, $01,
    $00, $00, $D1, $EA, $73, $07, $4E, $0F,
    $84, $47, $01, $00, $00, $D1, $EA, $73,
    $07, $4E, $0F, $84, $41, $01, $00, $00,
    $D1, $EA, $73, $0E, $4E, $0F, $84, $44,
    $01, $00, $00, $4E, $0F, $84, $45, $01,
    $00, $00, $D1, $EA, $73, $0E, $4E, $0F,
    $84, $42, $01, $00, $00, $4E, $0F, $84,
    $4C, $01, $00, $00, $D1, $EA, $73, $0E,
    $4E, $0F, $84, $59, $01, $00, $00, $4E,
    $0F, $84, $5F, $01, $00, $00, $D1, $EA,
    $73, $07, $4E, $0F, $84, $5E, $01, $00,
    $00, $D1, $EA, $73, $07, $4E, $0F, $84,
    $60, $01, $00, $00, $D1, $EA, $73, $07,
    $4E, $0F, $84, $62, $01, $00, $00, $D1,
    $EA, $73, $0E, $4E, $0F, $84, $65, $01,
    $00, $00, $4E, $0F, $84, $6E, $01, $00,
    $00, $D1, $EA, $73, $0E, $4E, $0F, $84,
    $70, $01, $00, $00, $4E, $0F, $84, $79,
    $01, $00, $00, $D1, $EA, $73, $0E, $4E,
    $0F, $84, $7F, $01, $00, $00, $4E, $0F,
    $84, $97, $01, $00, $00, $D1, $EA, $73,
    $07, $4E, $0F, $84, $A4, $01, $00, $00,
    $D1, $EA, $73, $07, $4E, $0F, $84, $A0,
    $01, $00, $00, $D1, $EA, $73, $07, $4E,
    $0F, $84, $A3, $01, $00, $00, $D1, $EA,
    $73, $0E, $4E, $0F, $84, $A6, $01, $00,
    $00, $4E, $0F, $84, $B0, $01, $00, $00,
    $D1, $EA, $73, $07, $4E, $0F, $84, $B0,
    $01, $00, $00, $D1, $EA, $73, $0E, $4E,
    $0F, $84, $B7, $01, $00, $00, $4E, $0F,
    $84, $B7, $01, $00, $00, $D1, $EA, $73,
    $07, $4E, $0F, $84, $B3, $01, $00, $00,
    $E9, $BC, $FE, $FF, $FF, $0C, $88, $AA,
    $B0, $C0, $0B, $45, $E4, $0B, $45, $F0,
    $AA, $C3, $0C, $8A, $AA, $B0, $C0, $0B,
    $45, $E0, $0B, $45, $F4, $AA, $C3, $B0,
    $B0, $0B, $45, $F8, $0B, $45, $F0, $AA,
    $E9, $8D, $01, $00, $00, $0C, $C6, $AA,
    $B0, $C0, $EB, $F0, $B0, $0F, $AA, $B0,
    $B6, $0B, $45, $FC, $0B, $45, $D4, $AA,
    $B0, $C0, $0B, $45, $C4, $EB, $D3, $0C,
    $86, $AA, $B0, $C0, $0B, $45, $E0, $0B,
    $45, $E8, $AA, $C3, $0C, $86, $AA, $EB,
    $F1, $B0, $8D, $AA, $B0, $05, $0B, $45,
    $C4, $AA, $E9, $59, $01, $00, $00, $0C,
    $00, $0B, $45, $CC, $AA, $EB, $99, $0C,
    $02, $0B, $45, $CC, $AA, $EB, $9E, $0C,
    $80, $AA, $B0, $C0, $0B, $45, $CC, $0B,
    $45, $F0, $AA, $E9, $32, $01, $00, $00,
    $F7, $45, $14, $01, $00, $00, $00, $0F,
    $84, $2C, $FE, $FF, $FF, $0C, $04, $0B,
    $45, $CC, $AA, $E9, $1A, $01, $00, $00,
    $0C, $FE, $AA, $B0, $C0, $0B, $45, $D4,
    $E9, $60, $FF, $FF, $FF, $B0, $40, $0B,
    $45, $D4, $0B, $45, $C8, $AA, $C3, $0C,
    $F6, $AA, $B0, $D0, $0B, $45, $D4, $E9,
    $49, $FF, $FF, $FF, $0C, $84, $AA, $B0,
    $C0, $0B, $45, $B4, $0B, $45, $B0, $AA,
    $C3, $0C, $F6, $AA, $B0, $C0, $0B, $45,
    $B8, $AA, $E9, $DB, $00, $00, $00, $B0,
    $0F, $AA, $B0, $AF, $AA, $B0, $C0, $0B,
    $45, $C4, $0B, $45, $C0, $AA, $C3, $B0,
    $69, $AA, $E8, $EE, $FF, $FF, $FF, $E9,
    $C4, $00, $00, $00, $0C, $D0, $0B, $45,
    $D8, $AA, $B0, $C0, $0B, $45, $CC, $0B,
    $45, $F0, $AA, $C3, $0C, $C0, $AA, $B0,
    $C0, $0B, $45, $CC, $0B, $45, $F0, $AA,
    $E9, $AD, $00, $00, $00, $B0, $0F, $AA,
    $B0, $A4, $0B, $45, $D4, $AA, $B0, $C0,
    $E8, $05, $00, $00, $00, $E9, $98, $00,
    $00, $00, $B0, $C0, $0B, $45, $BC, $0B,
    $45, $C8, $AA, $C3, $F7, $45, $10, $02,
    $00, $00, $00, $0F, $84, $78, $FD, $FF,
    $FF, $B0, $0F, $AA, $B0, $A5, $0B, $45,
    $D4, $AA, $EB, $DE, $B0, $0F, $AA, $B0,
    $C8, $EB, $DC, $B0, $0F, $AA, $B0, $C0,
    $0B, $45, $FC, $AA, $E9, $E1, $FE, $FF,
    $FF, $B0, $0F, $AA, $B0, $BC, $0B, $45,
    $DC, $AA, $E9, $6E, $FF, $FF, $FF, $B0,
    $0F, $AA, $B0, $BA, $AA, $B0, $E0, $0B,
    $45, $D0, $0B, $45, $C8, $AA, $EB, $42,
    $B0, $0F, $AA, $B0, $A3, $0B, $45, $D0,
    $AA, $EB, $9F, $66, $B8, $EB, $01, $66,
    $AB, $B8, $00, $01, $00, $00, $E8, $33,
    $00, $00, $00, $AA, $C3, $B0, $26, $0B,
    $45, $D0, $AA, $C3, $B0, $64, $0B, $45,
    $DC, $AA, $C3, $B0, $F2, $0B, $45, $DC,
    $AA, $C3, $83, $7D, $FC, $00, $74, $0A,
    $E8, $00, $00, $00, $00, $E8, $00, $00,
    $00, $00, $B8, $00, $01, $00, $00, $E8,
    $02, $00, $00, $00, $AA, $C3, $60, $50,
    $FF, $75, $08, $FF, $55, $28, $83, $C4,
    $08, $89, $44, $24, $1C, $61, $0B, $C0,
    $C3, $B8, $08, $00, $00, $00, $E8, $E3,
    $FF, $FF, $FF, $C3, $8B, $55, $10, $EB,
    $0D, $8B, $55, $14, $EB, $08, $8B, $55,
    $10, $0B, $55, $14, $EB, $00, $E8, $DE,
    $FF, $FF, $FF, $8B, $C8, $83, $7D, $FC,
    $00, $75, $03, $83, $E1, $03, $0F, $A3,
    $CA, $73, $EB, $C3);

var randseed: DWORD;

function MyRandom(userdata, range: DWORD): DWORD; cdecl;
begin
  if range = 0 then result := 0 else
  begin
    randseed := randseed * 214013 + 2531011;
    result := randseed mod range;
  end;
end;

procedure Junk(user_param, cmd_avail, regsrcavail,
  regdstavail: DWORD; out osizeptr: DWORD; ncmds, bufsize: DWORD;
  buf: Pointer);
begin
  randseed := GetTickCount;
  TETG_Engine(@ETG_bin)(user_param, cmd_avail, regsrcavail, regdstavail,
    osizeptr, ncmds, bufsize, buf, MyRandom);
  PAnsiChar(buf)[osizeptr] := #$C3; {ret} inc(osizeptr);
end;
Ich war ehrlich gesagt etwas Faul und habe nicht den Assemblercode (Quelle: ETG 2.00 engine) übersetzt, sondern nur das beiliegende C Beispiel umgesetzt.
Soweit erstellt die Anwendung recht praktischen Datenmüll, wenn ich das wie folgt aufrufe
var
buf: Array[0..2000] of byte;

Junk(
0,
ETG_ALL,
REG_ALL,
REG_EAX or REG_EBX,
bufsize,
1000,
sizeof(buf),
@buf);

Damit man den Code via call auch aufrufen kann, sollte am Ende des Puffers, also bei buf[bufsize] noch ein $C3 (ret) gepackt werden.
Mein Problem ist jedoch folgendes: Wenn ich innerhalb meiner Anwendung etwas wie folgt mache:

db $90,$90...$90

und mit meinem Patchtool in der Exe die Nops durch den Junkcode ersetze, müsste ich doch die Register vorher und hinterher manuell wiederherstellen, oder? Ein einfaches Pusha, popa reicht jedoch in dem Fall nicht. Hat da jemand eventuell eine Idee?

Peter

Assarbad 8. Jan 2011 15:11

AW: Kopierschutz
 
Zitat:

Zitat von Peter666 (Beitrag 1073253)
Damit man den Code via call auch aufrufen kann, sollte am Ende des Puffers, also bei buf[bufsize] noch ein $C3 (ret) gepackt werden.
Mein Problem ist jedoch folgendes: Wenn ich innerhalb meiner Anwendung etwas wie folgt mache:

db $90,$90...$90

und mit meinem Patchtool in der Exe die Nops durch den Junkcode ersetze, müsste ich doch die Register vorher und hinterher manuell wiederherstellen, oder? Ein einfaches Pusha, popa reicht jedoch in dem Fall nicht. Hat da jemand eventuell eine Idee?

Was soll das bringen? Das ist doch dann sehr leicht durchschaubar. Da kann man direkt ein Python oder IDC-Skript für IDA schreiben und es filtern. Selbst ohne Filtern kann ich mir den Stackpointer ja anzeigen lassen.

PUSHA und POPA werden übrigens in "echtem Code" (also von Compilern) eher selten eingesetzt, würden also geradezu herausstehen.

Peter666 8. Jan 2011 16:14

AW: Kopierschutz
 
Ja, schon klar aber so ein Garbage code in bestimmte Funktionen gebaut, erschwehrt das Lesen im Debugger ungemein.

OldGrumpy 8. Jan 2011 18:00

AW: Kopierschutz
 
Ja aber nur so lange bis man via Script den Junk ausgefiltert hat. Wer halbwegs oft mit obfuskiertem Code zu tun hat, macht das aus dem Handgelenk, irgendwann bekommt man auch ein Auge für Junkcode und sieht sehr schnell was Sache ist. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz