| Autor |
Beitrag |
LonghornUser
      
Beiträge: 796
|
Verfasst: Mo 02.02.04 16:09
Hallo.
Ich habe mal eine Frage:
Die Erstellung von Cracks ist in letzter Zeit bei meinem Programm stark angewachsen. Anscheinend ist mein Mechanismus Dreck  (Die Wahrheit ist, ich habe keinen, Ich habe nur für jeden Buchstaben eine Key-Phrase eingefügt) Kennt jemand einen wirklich guten Mechanismus, mit dem er gute Erfahrungen gemacht hat ? (d.h. dass der key auf den namen bezogen ist)
Hoffe auf schnelle Antwort. Danke.
Ciao
|
|
Raphael O.
      
Beiträge: 1596
VS 2013
|
Verfasst: Mo 02.02.04 16:34
sind es keygeneratoren, die erscheinen oder Cracks, die die exe-datei ersetzen??
in zweiterem Fall läge dein Problem nicht am Passworterstellungsprozess sondern am sonstigen Quelltext...
du solltest dir mal verschiedene verschlüsselungsverfahren ansehn.. (ich kenn mich da nicht aus, gab hier im Forum aber shcon öfters Beiträge, die das behandelten... ->mal nach verschlüsselung suchen  )
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Mo 02.02.04 18:22
Das ist es ja. Es sind keygens. Sie lesen einfach aus, wie der Key generiert wird und schon gehts
Nee, ich bräuchte einfach einen Verschlüsselungsmech.
Mit welchem gibts da positive Erfahrungen ?
edit: Oder weiß einer
1.) wie das sog. "Delphi Encryption Compendium" funktioniert ?
2.) eine gute Encryption-Komponente ?
Ciao LHUser
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Di 03.02.04 12:26
Also einen funktionierenden Key-Gen hab ich dir damals auch schon gebaut...!
1) Ja, ich weiß wie das DEC "funktioniert"
2) ja -> das DEC!
Wo hast du denn deine Probleme mit dem DEC?
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Di 03.02.04 14:36
Ja. Stimmt  Könntest du mir dann sagen, wie ich einfach mit dem DEC bewerkstelligen kann, dass ich ein Edit und ein Memo habe. In das Edit <Name> kommt der Name und in das Memo dann der erzeugte Key (aus dem Namen. Das ist alles. Mehr brauche ich net. Mit DEC für einen in Sachen Verschlüsselung unerfahrenen Coder scheinbar unmöglich.
Könntest du mir da ma ne kleine Abfolge posten, wie man das macht, weil blicke durch den Wulst an Komponenten nicht durch.
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Di 03.02.04 21:45
Also beim DEC ist ein riesengroßes Demo dabei, dass so ziemlich alle Möglichkeiten mit dem DEC zu arbeiten zeigt...!
Außerdem wie willst du aus dem Namen den Key erzeugen? Mit welchem Algo? Im DEC ist jedem Algo eine eigene Klasse gewidmet über die man den Algo ganz einfach verwenden kann...!
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
raven_22
      
Beiträge: 95
Win XP pro
D7 Enterprise
|
Verfasst: Do 12.02.04 11:24
Ich lach mich hier fast schlapp.
Schon mal dran gedacht, dass hier vielleicht auch mal ein kleiner, gelangweilter Cracker ins Forum schauen könnte ?
Wo möglich schreibst du noch als nächsten, welschen Mechanismus du verwenden willst.
Du vergisst wohl die wichtigste Regel ?
Wenn du willst dass etwas wirklich halbwegs sicher ist, dann Code es von Grund auf selber.
Und benutze keine bereits bekannten Verfahren.
Lass deiner Phantasie freien lauf und schreibe eine Routine, die halbwegs sicher Keys ausspuckt.
Diese Routine, solltest du aber nicht in eine externe Datei oder DLL exportieren.
Bau sie ganz tief in den Programmcode ein.
Außerdem solltest du eines der zahlreichen EXE-Komprimierung und Verschlüsselungstools nutzen.
Auch hier gilt, benutze eines das nicht so bekannt ist.
So braucht der Cracker erstmal etwas zeit, um dieses Verschlüsselungsverfahren zu umgehen.
Natürlich ist kein Verschlüsselungsverfahren absolut sicher, die meisten sind schon länger bekannt.
Demzufolge gibt es auch schon Entschlüsselungssoftware.
Hast du deine EXE überhaupt verschlüsselt ?
Wenn nicht, bist du selber schuld !
Ich würde vielleicht das folgende machen.
Das zu schützende Programm, in eine EXE packen und mit einem Tool verschlüsseln.
Anschließen würde ich eine weitere EXE erzeugen, die nur für die Key-Abfrage und so ist.
Diese zweite EXE, würde ich mit einem anderen Verfahren verschlüsseln.
Zum Schluss könnte man dann noch die erste EXE in der zweiten EXE verstecken.
Dass ganze dürfte für einen Cracker dann so lange dauern, dass er keinen Bock mehr hat.
Sollte dieses Verfahren auch nicht ausreichen, hätte ich noch paar andere Möglichkeiten.
Für den Key, gibt es auch viele Möglichkeiten.
Beispielsweiße könnte man denn Key so generieren, dass alle Zeichen aus dem der Key besteht, eine bestimmte Checksumme bilden müssen.
Ist diese Checksumme nicht im entsprechenden Bereich, so ist der Key ungültig.
Wenn du deine Key´s selber überprüfen willst, dann schreibe ein kleines Brutal Force Programm.
Damit kannst du schauen, wie lange es dauert und ob dein Verfahren gut genug ist.
Brutal Force ist eine sehr verbreitete Angriffsart, bei der einfach alle möglichen Kombinationen durchprobiert werden.
Gruß raven 
_________________ ---_-= raven_22 =-_---
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Do 12.02.04 11:40
Also deine Tipps sind auch nicht unbedingt das wahre..! Eine Exe zu crypten oder zu patchen bringt ziemlich wenig, mit den richtigen Tools ist dieser Schutz innerhalb von Minuten übergangen..
Und warum sollten keine bekannten Algorithmen verwendet werden?
Die einzige Möglichkeit einen halbwegs sicheren Schutz zu entwickeln ist mit Hilfe von polymorphem Code am besten in Kombination einer polymorphen Verschlüsselung... (Hagen hat dazu mal was in der Delphi-Praxis gepostet)
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
raven_22
      
Beiträge: 95
Win XP pro
D7 Enterprise
|
Verfasst: Do 12.02.04 12:02
Danke für diesen Hinweis !
Besagte Tools, sind mir auch nicht wirklich fremd.
Warum sollte man keine bekannten Algorithmen verwenden ?
Ist doch ganz einfach, umso bekannter, umso einfacher ist der Algorithmus zu knacken oder zu umgehen.
Polymorphe Verschlüsselung, darüber hab ich doch schon was gelesen.
Werde ich mir mal genauer anschauen, klingt interessant.
Gruß raven 
_________________ ---_-= raven_22 =-_---
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Do 12.02.04 12:10
Bekannte Algorithmen sind nicht unbedingt einfacher zu knacken oder zu umgehen..! Ganz im Gegenteil.. es gibt nichts sichereres als einen lang bekannten Algorithmus dessen Sicherheit schon x-mal geprüft wurde und der noch immer als sicher gilt! Ein gutes Beispiel: Blowfish - der Algorithmus ist schon ziemlich alt, aber dennoch hat er bis jetzt alle noch so gründlichen Kryptanalysen überstanden.. die einzig Möglichkeit ihn zu knacken ist eine Brute-Force-Attacke die man bei jeder Verschlüsselung (ausgenommen One-Time-Pad) anwenden kann, allerdings ist das eben auch die ineffizienteste Attacke überhaupt und bei einer vernünftigen Schlüssellänge daher auch absolut unrealistisch..!
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
raven_22
      
Beiträge: 95
Win XP pro
D7 Enterprise
|
Verfasst: Do 12.02.04 12:42
OK, ich gebe mich geschlagen.
Du hast ja Recht, ist mir auch bekannt.
Ich meine aber mit Verschlüsselung, die Tools mit den man seine EXE verschlüsseln kann.
Also UPX und wie sie nicht alle heißen !
Dass eine Brute-Force-Attacke nicht sonderlich effektiv ist, ist ja allgemein bekannt.
Genau gesagt, ist es sehr Zeitraubend und öde.
Passwortlisten sind da schon schneller, aber auch nicht das Gelbe vom Ei.
Die beste Methode ist sicher, wenn man sich den Algorithmus vornimmt.
Algorithmus identifizieren, Arbeitsweiße herausfinden und so weiter.
Nicht dass ich schon derartiges gemacht hätte, ich informiere mich nur so.
Schließlich sollte ein Proger wissen, wogegen er sich schützen sollte und wie.
Gruß raven 
_________________ ---_-= raven_22 =-_---
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Do 12.02.04 13:01
Naja, also mit Algo identifizieren, Arbeitsweise herausfinden etc kommst du bei Algorithmen wie Blowfish, IDEA, Rijandel und sonstige auch nicht weit, das haben schon wesentlich klügere Köpfe als du versucht und sind gescheitert..!
Sofern der Schlüssel schlecht gewählt wurde hilft eventuell noch eine Wörterbuch-Attacke, aber sonst gibts nix mehr...
Aber normale symetrische Verschlüsselungsmechanismen die auf einem Schlüssel basieren bringen in so einem Fall auch nciht viel, da ja der Schlüssel in der Exe gespeichert werden muss wodurch das ganze schon wieder wesentlich einfacher zum knacken wird..! Daher auch das was ich vorher geschrieben hab - polymorpher Code kombiniert mit polymorpher Verschlüsselung... ist aber ein ziemlich heftiges Thema!
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
raven_22
      
Beiträge: 95
Win XP pro
D7 Enterprise
|
Verfasst: Do 12.02.04 14:06
Vielen Dank, dass du mein Interesse an polymorphen Codes und polymorpher Verschlüsselung geweckt hast.
Das ist ein sehr interessanten Thema, hast du paar URL´s oder so ?
Ich habe mich mal kurz auf folgender Seite informiert.
homepages.fh-giessen.../Stadelmann/text.htm
Es ist scheinbar nicht so kompliziert, wie es an Anfang klingt.
Polymorph, sagt ja eigentlich schon alles aus.
Du scheinst dich ja ziemlich gut auszukennen, mit derartigen Themen.
Woher hast du dein Wissen, hast du dich nur aus Interesse informiert ?
Gruß raven 
_________________ ---_-= raven_22 =-_---
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Do 12.02.04 19:39
Links kann ich dir leider keine anbieten...
ich beschäftige mich schon seit längerer Zeit mehr mit dem Thema Kryptographie, daher kenn ich mich auf dem Gebiet auch halbwegs aus (hab auch dementsprechend ein paar Bücher)...
Auf das Thema polymorphe Codes bin ich gestoßen als ich angefangen hab mich eingehender mit ASM zu beschäftigen, allerdings ist es sehr schwer Informationen zu diesem doch eher komplexen Thema zu finden...
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
obbschtkuche
Gast
Erhaltene Danke: 1
|
Verfasst: Do 12.02.04 20:49
Dazu hab ich mal eine Klasse geschrieben (angefangen):
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153:
| unit ModCode;
interface
uses Windows, SysUtils;
const EXE_START = $00400000; SRC_START = $00401000; SRC_END = $7fffffff; BUFMAX = 65536;
type PDataArray = ^TDataArray; TDataArray = array[0..BUFMAX-1] of byte;
TModMyself = class private fProcess: DWORD; function ReadBufferFromMemory(address: DWORD; var Data: TDataArray): DWORD; public constructor Create(Process: DWORD); overload; constructor Create; overload;
function Find(data: pointer; length: DWORD): DWORD; overload; function Find(data: string): DWORD; overload; function WriteBuffer(address: DWORD; const buffer; length: DWORD): boolean; function WriteByte(address: DWORD; data: byte): boolean;
function ReadByte(address: DWORD): byte; function ReadWord(address: DWORD): word; function ReadDWord(address: DWORD): DWORD; function ReadBuffer(address: DWORD; const buffer; length: DWORD): DWORD; end;
implementation
function TModMyself.Find(data: pointer; length: DWORD): DWORD; var CurrentAddress: DWORD; BytesRead: DWORD; memdata: TDataArray; i, j: DWORD; begin result := 0;
if length > BUFMAX then exit;
CurrentAddress := SRC_START; repeat BytesRead:=ReadBufferFromMemory(CurrentAddress, memdata); if BytesRead = 0 then exit; if BytesRead > (BUFMAX - length) then dec(BytesRead, length); for i := 0 To BytesRead-1 do if CompareMem(@MemData[i], data, length) then begin result := CurrentAddress + i; exit; end; inc(CurrentAddress, BytesRead); until CurrentAddress>=SRC_END; end;
constructor TModMyself.Create(Process: DWORD); begin inherited Create; fProcess := Process; end;
constructor TModMyself.Create; begin inherited; fProcess := GetCurrentProcess; end;
function TModMyself.Find(data: string): DWORD; begin result := Find(@data[1], length(data)); end;
function TModMyself.ReadBuffer(address: DWORD; const buffer; length: DWORD): DWORD; begin ReadProcessMemory(fProcess, pointer(address), @buffer, length, result); end;
function TModMyself.ReadBufferFromMemory(address: DWORD; var Data: TDataArray): DWORD; begin ReadProcessMemory(fProcess, pointer(address), @Data[0], BUFMAX, result); end;
function TModMyself.ReadByte(address: DWORD): byte; var count: dword; begin ReadProcessMemory(fProcess, pointer(address), @result, 1, count); end;
function TModMyself.ReadDWord(address: DWORD): DWORD; var count: dword; begin ReadProcessMemory(fProcess, pointer(address), @result, 4, count); end;
function TModMyself.ReadWord(address: DWORD): word; var count: dword; begin ReadProcessMemory(fProcess, pointer(address), @result, 2, count); end;
function TModMyself.WriteBuffer(address: DWORD; const buffer; length: DWORD): boolean; var count: cardinal; oldprotect:dword; begin VirtualProtect(pointer(address), length, PAGE_EXECUTE_READWRITE, @oldprotect); WriteProcessMemory(fProcess, pointer(address), @buffer, length, count); VirtualProtect(pointer(address), length, oldprotect, @oldprotect); result := count = length; end;
function TModMyself.WriteByte(address: DWORD; data: byte): boolean; var count: cardinal; oldprotect:dword; begin VirtualProtect(pointer(address), 1, PAGE_EXECUTE_READWRITE, @oldprotect); WriteProcessMemory(fProcess, pointer(address), @data, sizeof(data), count); VirtualProtect(pointer(address), sizeof(data), oldprotect, @oldprotect); result := count = 1; end;
end. |
Dann musst du dir noch eine Markierung setzen. z.B.:
Delphi-Quelltext 1: 2: 3: 4: 5:
| asm jmp @@foo DB $12, $74, $A7, $2C, $7D, $C7, $3E @@foo: end; |
das jmp @@foo dient dazu dass der code auf jeden Fall übersprungen wird, sonst würde das ganze mit 100%iger wahrscheinlichkeit schiefgehen.
mit Find() kannst du die Markierung dann wiederfinden (in diesem Fall: modmyself.find(#$12#$72#$A7...);
und mit modmyself.WriteByte(modmyself.find(), wert);
wenn du z.B. eine Bedingung bei einer if-anweisung umkehren willst:
(z.B:)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| function test2(a: byte): integer; begin if a = 0 then begin asm jmp @@foo DB $12, $74, $A7, $2C, $7D, $C7, $3E @@foo: end; result := 1; end else result := 2; end; |
dann findest du zuerst die Markierung und kannst danach die Bedingung umkehren:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| var pos: integer;
...
with TModMyself.Create do try pos := find(#$12#$74#$A7#$2C#$7D#$C7#$3E); if ReadByte(pos-4) = $74 then WriteByte(pos-4, $75) else WriteByte(pos-4, $74); finally free; end; |
oder der Weg ohne die Markierung: (hier wird die Position von Test2 im code genutzt und von da ausgegangen)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| with TModMyself.Create do try pos := dword(@test2)+$11; if ReadByte(pos-4) = $74 then WriteByte(pos-4, $75) else WriteByte(pos-4, $74); finally free; end; |
Hierbei wird dir in jedem Fall das CPU-Fenster behilflich sein. Am besten setzt du einen Brakepoint auf die Stelle die du ändern willst und drückst dann [STRG]+[ALT]+[C]
// Edit:
mit fremden Prozessen hab ichs noch nicht getestet
|
|
rizla
      
Beiträge: 417
Erhaltene Danke: 2
XP
FPC mit Lazarus
|
Verfasst: Fr 23.07.04 09:58
Vegesst Softice nicht!
Damit kann jeder den erzeugten Key für den Namen einfach rausfischen ;) (aka serialfishing)
jeder software schutz ist *LEIDER* auch auszuhebeln <sic>
*rizla*
|
|
raziel
      
Beiträge: 2453
Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
|
Verfasst: Fr 23.07.04 13:58
| rizla hat folgendes geschrieben: | | Vegesst Softice nicht! |
| rizla hat folgendes geschrieben: | Damit kann jeder den erzeugten Key für den Namen einfach rausfischen (aka serialfishing) |
Nicht zwingend. Denn wenn man den Key hasht und diesen Hash mit einem vorhergehashten Keyhash verha... äähhh vergleicht, dann hat man "nur" den Hash und keinen Key -> Patchen.
| rizla hat folgendes geschrieben: | | jeder software schutz ist *LEIDER* auch auszuhebeln <sic> |
dito. Die Frage ist nur: Wie aufwendig ist es und lohnt sich der Aufwand?
raziel
_________________ JSXGraph
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Fr 23.07.04 14:18
| Zitat: | | Nicht zwingend. Denn wenn man den Key hasht und diesen Hash mit einem vorhergehashten Keyhash verha... äähhh vergleicht, dann hat man "nur" den Hash und keinen Key -> Patchen. |
Mit einem Keyhash vergleichen ist ja noch schön und gut, aber meist sollen doch nicht nur einer sondern tausende Keys gültig sein. Willst du die Hashes aller Schlüssel mit herumschleppen?
Cu,
Udontknow
|
|
rizla
      
Beiträge: 417
Erhaltene Danke: 2
XP
FPC mit Lazarus
|
Verfasst: Fr 23.07.04 14:20
Titel: und wie siehts aus mit
sagen wir der hash des real key steht in eax und der "vorgehashte" wert in dx, was hält jemanden davon ab, den neu gehashten wert = dem "vorgehashten" wert zu setzen ?
beim cmp eax, edx kommt dann eh ein zero raus und alles war wieder umsonst ;)
für's prog ist es dann im grunde egal, denn beide werte sind gleich und damit <serial_correct = true>
<sic>
gruß rizla
Edit: sorry, natürlich nicht dx sondern edx.. ach ja, 32bit..
Moderiert von Udontknow: Beiträge zusammengefasst.
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Fr 23.07.04 14:26
Es ging ja momentan um das Erzeugen eines Keygens, daß natürlich auch gekrackt werden kann, ist klar.
Cu,
Udontknow
|
|
|