![]() |
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:
Die Adressen der beiden Labels kann man via mov eax, offset lblBlockStart bzw. lblBlockEnd ja auslesen.
lblBlockStart:
asm db $EB, $0B; // Jmp +10 -> die Position hinter dem MarkerStart- Text db "MarkerStart" end; lblBlockEnd: asm db $EB, $09 db "MarkerEnd" end; Zum Verschlüsseln reicht ein einfaches:
Delphi-Quellcode:
vollkommen aus.
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); 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 |
AW: Kopierschutz
Wesentlich besser: Deaktiviere bestimmte Features oder schränke sie per Compilerschalter ein. Was nicht da ist, kann man auch nicht cracken.
|
AW: Kopierschutz
Ja, das trifft aber nur bei ner Demoversion bzw. Shareware zu.
|
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. |
AW: Kopierschutz
Eventuell wäre es interessant zu wissen, welche Tools das sind. Dem einen oder anderen kann das sicherlich helfen.
|
AW: Kopierschutz
Richtig sicher gibt es aber nicht
![]() ![]() 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 |
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. |
AW: Kopierschutz
schau mal hier, da hatte ich mal was gepostet.
![]() 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. |
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:
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 ... |
AW: Kopierschutz
Kauf die dir lieber etwas z.B. THEMIDA.
![]() 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. |
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:
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:
|
AW: Kopierschutz
Und wie bekomme ich ein Wasserzeichen in die Exe und wie kann ich es wieder auslesen?
|
AW: Kopierschutz
im phpfurum gab's dazu mal einen Thread
![]() 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. |
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 . |
AW: Kopierschutz
Zitat:
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. |
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 |
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 ![]() 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: |
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. |
AW: Kopierschutz
Zitat:
![]() Zitat:
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:
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. |
AW: Kopierschutz
|
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:
|
AW: Kopierschutz
Zitat:
Zitat:
Zitat:
|
AW: Kopierschutz
Zitat:
Ansonsten: Hacker != Cracker :zwinker: Ein gesundes und frohes Jahr 2011 wünsche ich. |
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. |
AW: Kopierschutz
Zitat:
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 |
AW: Kopierschutz
Zitat:
|
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 |
AW: Kopierschutz
Zitat:
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 |
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:
Ich war ehrlich gesagt etwas Faul und habe nicht den Assemblercode (Quelle: ETG 2.00 engine) übersetzt, sondern nur das beiliegende C Beispiel umgesetzt.
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; 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 |
AW: Kopierschutz
Zitat:
PUSHA und POPA werden übrigens in "echtem Code" (also von Compilern) eher selten eingesetzt, würden also geradezu herausstehen. |
AW: Kopierschutz
Ja, schon klar aber so ein Garbage code in bestimmte Funktionen gebaut, erschwehrt das Lesen im Debugger ungemein.
|
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 22:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz