Die schlimmsten Hacks die ihr gemacht habt?

i_hasser

Grand Admiral Special
Mitglied seit
06.06.2002
Beiträge
18.964
Renomée
85
Standort
IO 0x60
Hi

Tja, es gibt ja viele Wege nach Rom. Einige sind zwar lang aber gut ausgebaut, andere sind schön kurz führen aber durch Sümpfe, Moore und Treibsand ;D

Was habt ihr schon so alles verbrochen?

Ich fang einfach mal an - ich hab QBasic mit Assembler verbunden. Aber nicht etwa per Lib, sondern per CALL ABSOLUTE *chatt*

Der Assemblercode lag dabei in einem String :]
 
Das ist ziemlich... unsauber ;)

Irgendwann war ich mal zu Faul in C eine neue struct zu erstellen, musste auf einen Bereich zugreifen in dem verschiedene Datentypen nacheinander kamen.

Also hab ich das ungefähr so gelößt:

1. Wert *( (long int*) ptr)
2. Wert *( (char*) ((long int*) ptr + 1))

usw.

Das sah auch etwas komisch aus *chatt*

Ich hab es auch mal geschafft eine Umrechnungsroutine von LBA in CHS in Assembler zu schreiben, ohne auch nur einen Speicherzugriff zu tätigen. Und das war 16bit Assembler, also nix eax, ebx ...
 
Original geschrieben von intel_hasser
Ich fang einfach mal an - ich hab QBasic mit Assembler verbunden. Aber nicht etwa per Lib, sondern per CALL ABSOLUTE *chatt*

Der Assemblercode lag dabei in einem String :]
Hey, das kommt mir bekannt vor.;D Um bei Visual Basic 6.0 Assembler nutzen zu können, reserviere ich beim Programmstart Speicher, schreibe dort den Code fertig codiert rein und springe das ganze dann mit dem CallWindowProc-API bei Bedarf an.;D Der Trick ist allerdings nicht von mir.
 
ah, ich weiß noch was vom gymi dv-unterricht in einer klassenarbeit.
anstatt in [a..z] oder sowas zu nehmen, habe ich lauter ifs gemacht *chatt*
was suboptimale laufzeit bedeutet, habe ich dann an den eigenen fingern spüren können ;D

jochen 'if if if if if if if if if if if if if if if if if if if if if if if if if if' skyphab
 
Ach ja, die guten alten Zeiten ;D

Wisst ihr wie viele Segmentregister der i386 hat?

6.


Und wisst ihr, wie viele man davon im Realmode braucht?

3.


Das lässt doch Platz für wunderbare Hacks. Wenn man mal kein Register hat wirds eben schnell nach ES geschoben, das haut schon hin. Notfalls kann man auch noch die Indexregister (2) missbrauchen.
 
Original geschrieben von intel_hasser
Das lässt doch Platz für wunderbare Hacks. Wenn man mal kein Register hat wirds eben schnell nach ES geschoben, das haut schon hin. Notfalls kann man auch noch die Indexregister (2) missbrauchen.
Dinge dieser Art sind meine schlimmsten Hacks: Der Mißbrauch von Registern in Assembler. Außerdem hab ich den FPU-Stack zum ablegen von Daten genutzt die ich hernach wieder mit der ALU weiterverarbeitet habe ;D
Und was ich auch schon öfters gebracht habe: Werte, die eigentich mit der ALU berechnet werden sollten mit der FPU durchrechnen, da dies auf einigen Prozessoren (beispielsweise K7) schneller geht - auch eine Sache, für die ich eigentlich gesteinigt gehöre.
 
Ich find's lustig, dass gerade intel_hasser, der sich des öfteren mal über den Programmierstil anderer Leute aufregt, solche düsteren Hacks anwendet...*lol*
 
Das ist alles schon längere Zeit her *sichrausred*


... meine Hacks haben wenigstens Funktioniert (nachdem ich vielleicht 10 Minuten pro Hack debuggt hab *buck*)
 
Danke!

Nochmal wegen meiner CallWindowProc-Methode: Die AMD64-CPUs hat doch dieses NX-Feature, welches mit WinXP SP2 dann auch genutzt wird. Dabei wird ja verhindert, das Daten ausgeführt werden. Dadurch werden einige Programmiertricks unmöglich, z. B. muss am ATL-Framework einiges geändert werden. Ich habe mir gerade die Frage gestellt, ob mein CallWindowProc-Trick dann noch funktioniert. Wahrscheinlich nicht, oder? Hmmm, das ließe sich sicher irgendwie verkraften - bspw. mit dem geposteten Plugin. Allerdings baue ich gerade an einem neuen Hack. Dabei muss ich mit einem jmp-Befehl ein Win-API umleiten (das jmp wird an die Adresse des APIs geschrieben und leitet auf meinen eigenen Code weiter).
Wenn das mit NX eh nicht mehr funzzt, muss ich mir gleich etwas anderes ausdenken. Deshalb wollte ich mal eure Einschätzung der Lage hören.
 
Wenn an der Stelle vorher die WinAPI lag und dein eigener Code auch ausführbar ist gibts da keinerlei Probleme.

Nur solche Sachen wie CALL ABSOLUTE gehen nimmer, aber das gibts eh nur in QBasic.
 
Die schlimmsten Hacks hab ich mittels selbstmodifizierendem Code in Assembler für schnelle Grafikroutinen (VGA mit 16 Farben) unter Turbo-Pascal (DOS) gemacht. Z.B. in einer doppelten Schleife zum Kopieren/Verschieben von rechteckigen Bildschirmausschnitten sind mir die Register ausgegangen und ich musste in der inneren Schleife auf eine variable Bitposition im Speicher rotieren. Z.B. ROR AX,CL war nicht mehr möglich, da das CL-Reg schon anderwertig gebraucht wurde. Also am Anfang der Routine kurz mal den Befehl ROR AX, Nummer an die entsprechende Stelle in den Code gepatcht...
Die Grafikbibliothek ist voll mit solchen Stellen.
Als Student vor 14 Jahren hatte ich halt noch Zeit für solchen Extrem-Optimising Quatsch. ;D

Ciao,
Ray
 
Heute geht sowas garnicht mehr. Der 386er (und alles danach) hat eine Prefetch Queue, die das Ändern von (je nach CPU) ~20 Byte im nachfolgenden Code unwirksam macht.
 
Original geschrieben von intel_hasser
Heute geht sowas garnicht mehr. Der 386er (und alles danach) hat eine Prefetch Queue, die das Ändern von (je nach CPU) ~20 Byte im nachfolgenden Code unwirksam macht.
Mach mal halblang! Das glaubst Du ja wohl selber nicht *zweifel* ???
( :] Es sei denn, der Code zwischen der Stelle, an dem der Patch durgeführt wird und die Patch-Stelle selbst sind weit genug voneinander entfernt ... )

Damals lief das mit einem 386er, dann mit nem 486er unter DOS.
Und der Code funktioniert immer noch in einer DOS-Box unter WinXP mit einem Barton.
 
Ich habe vor 1 1/2 Jahren mit JavaScript ein Exploit gebaut welches ohne Nachfrage Windows Rechner Neustarten ließ.

rgds, Till
 
Original geschrieben von Ray
Mach mal halblang! Das glaubst Du ja wohl selber nicht *zweifel* ???
( :] Es sei denn, der Code zwischen der Stelle, an dem der Patch durgeführt wird und die Patch-Stelle selbst sind weit genug voneinander entfernt ... )

Damals lief das mit einem 386er, dann mit nem 486er unter DOS.
Und der Code funktioniert immer noch in einer DOS-Box unter WinXP mit einem Barton.

Kann sein, dass der Code bei dir weit genug auseinander lag (vor allem Sprünge dürften das Problem umgehen).

Aber ist tatsache so, die Prefetch Queue macht das ändern von ~20 Byte (je nach CPU, beim 486er ist die Queue länger als beim 386er) im nachfolgenden ausgeführten Code unwirksam. Das ist auch die einzige Methode solche Änderungen zu erkennen, indem man einen Codeblock erstellt der sich selbst umändert (zb. vom Hochzählen eines Registers zu einem NOP). Kann natürlich sein, dass die heutigen CPUs eine Erkennungsroutine haben, aber ein paar Befehle vor dem IP sollte man trotzdem nicht ändern - auf dem 486er geht das zu 100% in die Hose ;)
 
da kann ich mich auch noch an was erinnern ;D
habe in Delphi Strings statt in einem 2 Dimensionalen array, in einem invisblen StringGrid gespeichert ;D

das kam davon von nicht erst lernen wollen sondern sofort los coden.
 
Original geschrieben von skfink
da kann ich mich auch noch an was erinnern ;D
habe in Delphi Strings statt in einem 2 Dimensionalen array, in einem invisblen StringGrid gespeichert ;D

das kam davon von nicht erst lernen wollen sondern sofort los coden.

das erinnert mich an zahlreiche unsichtbare memo-felder um logdateien zu schreiben bis ich auf die tatsache gestoßen bin dass stringlisten denselben zweck erfüllen *chatt*
 
Ich musste mal was im Borland C Builder schreiben, das war eine Form in der etwa 30 Eingabefelder nacher eine Zusammengesetzte Variable ergaben, weil son anderes Stück Borland Mist das erwartete.
Naja und weil man in Borland Zusammengesetzte Variablen nicht nach ANSI C Standard angrabschen kann und den Namen der Einegabefelder nicht dynamisch bilden kann, musste ich für jedes Eingabefeld eine Zeile schreiben, wie er die Daten da rausholt, und in die Variable schreibt.

Nur weil Borland es nicht für nötig hält sich an Standards zu halten, musste ich da sonen 30 Zeiler für den Quatsch hinklarren, in ner Schleife wären 5 Zeilen gewesen, wenn überhaupt... und trivialer dazu, und die Fehlersuche danach hätt ich mir auch sparen können.

Ziemlich beschränktes Stück Code allgemein, extrem unflexibel und blähte die wirklich triviale Funktion unnötig zu einem Kothaufen auf :(
...danke Borland, danke an die die Borland benutzen.
 
Ein Hack heist nicht (nur) in andere Systeme einzudringen, sondern auch Code auf... fragwürdige Weise zu gestallten/schreiben *chatt*


95% aller QBasic Programme sind zb. Hacks ;D
 
Hmm wenn ich hacken mit cracken und manipulieren gleichsetze, war der schlimmste Hack den ich jemals gemacht habe die Windows Uhr zurückzustellen um meine Shareware länger verwenden zu können 8)

So gesehen habe ich mit einem Hack (Windoze) gearbeitet :)
 
Zurück
Oben Unten