Forum: PC-Programmierung Unterschied Hooken und patchen


von Unterschied (Gast)


Lesenswert?

Kann mir jmd den unterschied zw hooken und patchen erklären?

von c-hater (Gast)


Lesenswert?

Unterschied schrieb:

> Kann mir jmd den unterschied zw hooken und patchen erklären?

Hooken ist: du klinkst deinen Code an irgendeiner Schnittstelle ein. 
Patchen ist: du manipulierst direkt den Zielcode.

von Eins N00B (Gast)


Lesenswert?

In Ergänzung zu obiger Antwort: Beim Hooken ist das üblicherweise vom 
Entwickler so beabsichtigt, beim Patchen nicht.

von Johannes S. (Gast)


Lesenswert?

Man könnte ja auch einen Hook patchen.

von Eins N00B (Gast)


Lesenswert?

Die Definitionsversuche treffen ja dann trotzdem zu, man muss sie nur 
beide anwenden :)

Ach ja: Patchen hat sonst noch mindestens zwei weitere Bedeutungen in 
der IT von denen ich weiß, sollte man vieleich auch nochmal erwähnen.

von A. S. (Gast)


Lesenswert?

Patch (engl. Pflaster): Pflaster um einen Fehler zu beheben (Wunde 
bedecken, etwas zusammenpflastern)

Hook (engl. Haken oder einhängen): Einhängen eines Codes irgendwo. Zum 
Beispiel einen Zusatzcode in einen Interrupt. Meist nicht zur 
Fehlerbehebung, sondern als Erweiterung. Und praktisch nur, wenn es über 
einen Funktionsaufruf in der Sprache hinaus geht. Also das Aufrufen 
einer Funktion in einer ISR ist KEIN Hook. Das umleiten eines 
Interruptvektors und nachträgliches Aufrufen der ursprünglichen Routine 
schon eher.

von Voodoopriester (Gast)


Lesenswert?


von c-hater (Gast)


Lesenswert?

Eins N00B schrieb:

> In Ergänzung zu obiger Antwort: Beim Hooken ist das üblicherweise vom
> Entwickler so beabsichtigt

Darauf würde ich nicht wetten...

Sprich: das kann so sein, wenn eben die "Schnittstelle" vom Entwickler 
genau dafür vorgesehen war. Es kann aber auch durchaus ungewollt 
passieren. An allen anderen "Schnittstellen"...

Und: es kann sogar an dafür vorgesehenen Schnittstellen unerwünschte 
Hooks geben. Typisch sind da z.B. root kits, die installieren sowas. Die 
machen das, um den Kern der Sache zu verbergen. Gegenüber aller 
regulären Tools, die eben diese regulären Schnittstellen verwenden.

von Eins N00B (Gast)


Lesenswert?

A. S. schrieb:
> Patch (engl. Pflaster): Pflaster um einen Fehler zu beheben (Wunde
> bedecken, etwas zusammenpflastern)

Oder die Funktionalität zu verändern.

> Hook (engl. Haken oder einhängen): Einhängen eines Codes irgendwo. Zum
> Beispiel einen Zusatzcode in einen Interrupt. Meist nicht zur
> Fehlerbehebung, sondern als Erweiterung. Und praktisch nur, wenn es über
> einen Funktionsaufruf in der Sprache hinaus geht. Also das Aufrufen
> einer Funktion in einer ISR ist KEIN Hook.

Das würde ich so pauschal nicht stehen lassen. ZB:
1
void user_function(void) __attribute__((weak)) {}
2
3
void isr_handler(void) {
4
    user_function();
5
}

In dem Fall wäre user_function() schon ein Hook für mein Verständnis.

> Das umleiten eines
> Interruptvektors und nachträgliches Aufrufen der ursprünglichen Routine
> schon eher.

Und das wäre für mich ein Patchen der ISR-Tabelle.

c-hater schrieb:
> Sprich: das kann so sein, wenn eben die "Schnittstelle" vom Entwickler
> genau dafür vorgesehen war. Es kann aber auch durchaus ungewollt
> passieren. An allen anderen "Schnittstellen"...

Aber ist das dann noch die Nutzung eines Hooks oder eine andere Methode, 
Code zu injizieren? Beispiel: die Nutzung von LD_LIBRARY_PRELOAD unter 
Linux, um Programmen eine alternative Implementation von Systemaufrufen 
unterzuschieben (zB ein anderes open, um hardcoded Dateipfade zu ändern) 
würde ich zB auch nicht als Hook bezeichnen, obwohl das sogar eine 
definierte Schnittstelle ist.

> Und: es kann sogar an dafür vorgesehenen Schnittstellen unerwünschte
> Hooks geben. Typisch sind da z.B. root kits, die installieren sowas. Die
> machen das, um den Kern der Sache zu verbergen. Gegenüber aller
> regulären Tools, die eben diese regulären Schnittstellen verwenden.

Patchen die nicht Systembibliotheken, um sich zu verstecken? Patchen in 
dem Sinne, dass sie (unter Windows) die Funktionalität einiger 
System-DLLs abändern? Ich wüsste nicht, dass es dafür 
Hook-Schnittstellen gibt. Und selbst wenn: Patches sind wohl das besser 
versteck, sonst könnte der Virenscanner ja einfach die registrierten 
Hooks durchegehen oder sowas.

von A. S. (Gast)


Lesenswert?

Eins N00B schrieb:
> In dem Fall wäre user_function() schon ein Hook für mein Verständnis.

Nach der Beschreibung im verlinkten Wikipedia-Artikel (zitiert aus 
"Einschubmethoden") hast Du sicher recht.

Das ist für mich aber eher ein Callback, Rückruffunktion, API. Meine 
Auffassung von Hook war früher, dass man sich irgendwo einhängt, wo es 
nicht explizit designed, aber möglich war.

von Georg (Gast)


Lesenswert?

A. S. schrieb:
> dass man sich irgendwo einhängt, wo es
> nicht explizit designed, aber möglich war.

Möglich sollte es immer sein, wenn man hardwarenah programmiert - man 
ersetzt z.B. 3 Befehle durch einen Sprungbefehl, führt diese 3 nach dem 
zusätzlichen Code aus und springt an die Absprungstelle plus 3 zurück.

Üblich, aber so hat sich der Designer das ganz sicher nicht vorgestellt.

Georg

von foobar (Gast)


Lesenswert?

Das Verb "hooken" gibt's im Informatiksprachgebrauch nicht.  Wenn das 
jemand im Zusammenhang mit Computern benutzt, weiß man, dass er weder 
von Computern noch von Golf Ahnung hat.

von Eins N00B (Gast)


Lesenswert?

A. S. schrieb:
> Das ist für mich aber eher ein Callback, Rückruffunktion, API. Meine
> Auffassung von Hook war früher, dass man sich irgendwo einhängt, wo es
> nicht explizit designed, aber möglich war.

Ein Callback bzw. eine Rückruffunktion wird in meinem Verständnis 
hingegen als Funktionsobjekt/-zeiger übergeben, meistens per Parameter. 
Interessant, wie das so auseinanderlaufen kann.

Ich kann deine Interpretation des Begriffs durchaus nachvollziehen und 
auf eine Art erscheint es mir sogar die logischere, wenn man von dem 
Begriff aus kommt. Wenn man von dem Konzept ausgeht, lande ich wieder 
bei meiner ☺ .

foobar schrieb:
> Das Verb "hooken" gibt's im Informatiksprachgebrauch nicht.  Wenn
> das
> jemand im Zusammenhang mit Computern benutzt, weiß man, dass er weder
> von Computern noch von Golf Ahnung hat.

Das halte ich für etwas voreilig und ziemlich arrogant (scheint in 
diesem Forum aber recht verbreitet zu sein; siehe Justage vs 
Kalibrierung).

von c-hater (Gast)


Lesenswert?

Eins N00B schrieb:

> Patchen die nicht Systembibliotheken, um sich zu verstecken?

Meist nicht. Wäre zuviel Aufwand.

> Ich wüsste nicht, dass es dafür
> Hook-Schnittstellen gibt.

Doch die gibt es natürlich. Es sind einfach die "Einsprünge" 
(Funktionszeiger) der DLLs. Die biegt der Angreifer einfach auf eigenen 
Code um und filtert entweder die Parameter oder das Ergebnis oder beides 
und ruft zwischendurch den tatsächlich adressierten Code auf.

Und das funktioniert natürlich unter Linux ganz genauso, auch wenn dort 
DLLs nicht DLL heißen. Das Prinzip ist dasselbe: irgendwo im Adressraum 
des Prozesses gibt es eine Tabelle von Funktionszeigern. Die kann man 
manipulieren und auf eigenen Code umlenken.

> Und selbst wenn: Patches sind wohl das besser
> versteck, sonst könnte der Virenscanner ja einfach die registrierten
> Hooks durchegehen oder sowas.

Looser. Virenscanner benutzen was? Die u.U. bereits manipulierten 
Interfaces des Systems...

Genau das ist der Witz: es gibt keine vollständige Code-Sicherheit. Die 
Angreifer manipulieren und versuchen, die Manipulation bestmöglich zu 
verbergen, die Verteidiger machen aber im Prinzip exakt dasselbe. Mal 
gewinnt der, mal der.

Das Problem ist: es genügt, wenn der Angreifer einmal gewonnen hat. Dann 
kann er den Verteidiger dauerhaft Kacken schicken und zwar so, dass 
niemand INNERHALB des Systems es bemerken kann. Ist dann nur ein Frage 
des Aufwands auf Angreifer-Seite. Die muss dann sicherstellen, dass der 
Verteidiger für den Benutzer jederzeit immer hübsche plausible Meldungen 
liefert, die sinngemäß besagen, dass alles in Ordnung wäre...

Der einzige Weg, sowas zu finden, ist die Analyse von AUSSERHALB des 
Systems.

von bashooka (Gast)


Lesenswert?

Wo ist eigenltich der Unterschied zwischen Hook und Interceptorpattern?
Das müsste doch das selbe sein oder?

von Sheeva P. (sheevaplug)


Lesenswert?

Unterschied schrieb:
> Kann mir jmd den unterschied zw hooken und patchen erklären?

Der Thread hat es bereits angedeutet, aber...

Nun, letztlich geht es in allden Fällen darum, das Verhalten einer 
Software zu verändern. Dazu gibt es viele Möglichkeiten; die einfachste 
und vermutlich gebräuchlichste ist, ihren Quelltext zu verändern, indem 
ein Patch appliziert wird.

Aus dem traditionellen UNIX- und Linux-Umfeld kennen Entwickler daher 
die zwei Programme diff(1) und patch(1): das Erste sieht sich zwei (die 
alte und die neue) Versionen des Quellcodes einer Software an und 
erstellt daraus eine Datei, die oft ebenso "Patch" genannt wird. Diese 
Datei kann dann verschickt werden, und andere Entwickler können ihre 
alte Version der Software mit dem Programm patch(1) und der betreffenden 
Datei auf den neuen Stand bringen. Diese Technik wurde früher häufig in 
Entwicklerteams genutzt, und heute basieren so ziemlich alle SCM-Systeme 
wie CVS, Subversion und Git auf diesem Prinzip -- im Wesentlichen geht 
es dabei um die Synchronisierung verschiedener Versionsstände von 
Quellcode. Ein Patch ist immer vom Entwickler intendiert und erwünscht.

Ein Hook hingegen ist eine Veränderung des Programmverhaltens zur 
Laufzeit und kann vom Entwickler vorgesehen sein, und das ist auch die 
Regel. Dazu hat der  Entwickler meistens bewußt an einer oder mehreren 
bestimmten Stellen seines Programms Möglichkeiten eingebaut, andere oder 
zusätzliche Funktionen aufzurufen. Ein Hook ist üblicherweise vom 
Entwickler so vorgesehen. Ein Beispiel im Linux-Kernel wäre das (zum 
Glück unbekannte) Modul "binfmt_misc".

Davon zu unterscheiden ist ein Callback: auch der verändert das 
Laufzeitverhalten eines Programms, ist aber auf jeden Fall vom 
Entwickler vorgesehen. Dabei geht es üblicherweise darum, daß eine 
bereits in dem Programm vorhandene Funktion als Funktionszeiger 
übergeben und dann aufgerufen wird. Denk zum Beispiel an einen 
Taschenrechner, der addieren, subtrahieren, multiplizieren und 
dividieren kann: abhängig vom eingegebenen mathematischen Symbol wird 
die korrekte mathematische Operation für Deine Eingaben ausgeführt. 
Ansonsten ist ein Callback eher dazu geeignet, die richtige Funktion an 
der richtigen Stelle aufzurufen.

Dann gibt es noch den Begriff des "Monkey Patching". "Patch" ist hier an 
sich nicht ganz das richtige Wort, denn auch dabei geht es im 
Wesentlichen um eine Veränderung des Laufzeitverhaltens einer konkreten 
Instanz eines Programms. Ein gutes Beispiel für diese Technik ist das 
Programm valgrind(1); es ersetzt die Systemaufrufe zur Allokation und 
Deallokation von Arbeitsspeicher (malloc(3), free(3), new, delete, 
placement-new und placement-delete) durch seine Versionen mit 
eingebauten Speicherchecks.


Letztlich fürchte ich allerdings, daß Deine Frage hier in diesem Forum 
ein wenig deplatziert ist. Die meisten Entwickler haben allenfalls -- 
über ihr SCM-System -- mit Patches zu tun. Diese Aussage betrifft nicht 
nur Embedded-Entwickler, vor allem aber genau diese! Denn auf einem 
Mikrocontroller kannst Du in der Regel keine dieser Techniken mit 
Ausnahme von Callbacks implementieren... ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.