[HowTo] Api-Hooking -- Interesse?

Ein HowTo zum API-Hooking?

  • Klar,ich werde es aufjedenfall lesen!

    Abstimmungen: 0 0,0%
  • Knnst du gerne machen,werds aber warscheinlich nicht lesen!

    Abstimmungen: 0 0,0%
  • Unsinn,man braucht dazu kein HowTo.

    Abstimmungen: 0 0,0%
  • Bitte nicht,wer weiß was Kiddies damit anstellen?!

    Abstimmungen: 0 0,0%

  • Anzahl der Umfrageteilnehmer
    0
nd was kann man jetzt dagen tun?
naja, mittels eigener Hooks die Routinen, die zum Injecting genutzt werden, überwachen - oder gleich in den Kernel einsteigen. K.A wie ZA es inzwischen macht, aber Tiny PFW hatte noch "vor kurzem" die ApiHookingMethode drin - sie injezierte in jeden Process eine eigene DLL und hookte die gefährlicheren, so dass sie gefiltert werden konnten. Natürlich konnte das wiederum mit ein bisschen Code umgangen werden *räusper* http://www.google.com/search?hl=de&ie=ISO-8859-1&q=tiny++protections+buha&btnG=Suche&lr=lang_de

Was Kernelhooking angeht: die entsprechenden Treiber müssten ganz vorne "mit dabeisein" . Hat man dabei eine Kleinigkeit übersehen oder falsch implementiert (oder MS verändert bei einem Update etwas an der Struktur oder oder) leidet die Stabilität des Systems darunter.
 
Außerdem kann man testen ob das erste Byte einer Funktion 0xE9 ist ;)
Klappt zwar nicht immer aber immerhin.

Xalon
 
also erstmal, super tut is gut gelungen, erklärt den themenbereich recht ausfuehrlich.. wobei ich mir vorstellen kann, dass fuer nicht-c++-programmierer recht undurchsichtig ist, da ja alles auf deinem code aufbaut
was ich noch anmerken wollte: fuer die befehlslänge kann man auch nen length disassembler benutzen, den man ins progg einbauen kann und der die opcodes/opcodelängen liefert, die am anfang der gehookten funktionen stehen, dann spart man sich das gesocks mit ollydbg und muss die längen nicht hardcoden, was sowieso leicht zu problemen fuehrt, wenn die funktionen bei verschiedenen win-versionen unterschiedlich beginnen (vor allem bei kernel-hooks is da schnell mal die kacke am dampfen..)
hab length-disassembler allerdings bis jetz nur auf assembler gesehen, diverse viren/rootkits benutzen die ja auch (-->LDE32)
ansonsten super arbeit!

mfg
 
Schön das es euch gefällt :)
Zum length disassembler:
Das wär eigentlich auch kein Problem sowas selber zu Coden man muss dem Programm nur
sagen welcher Befehl wie lang ist ;)

Xalon
 
Original von Xalon
:)
Sucht ihr noch nen Artikel für euer HaboMagazin?
Haben wir darüber nicht neulich schonmal im IRC gesprochen? Oder war das jemand anderes?

Mit dem Mag habe ich nichts zu tun, dafür wende dich bitte mal an yp oder tcr (PN oder Mail oder im IRC) So wie ich das neulich verstanden habe, ist eine weitere Ausgabe das Mags allerdings fraglich, aufgrund zu wenig Artikel/Interesse.

Pers. würde ich es begrüßen, wenn enstpr. Artikel im Wiki veröffentlicht werden.
 
[OT]
weitere Ausgabe das Mags allerdings fraglich, aufgrund zu wenig Artikel/Interesse

Vielleicht auch etwas wegen mangelnder Transparanz und fehlender Struktur?

Imho wuerde ein solcher Artikel das ganze mal um 200% aufwerten.


mfg
 
Please Help!

Hat jemand von euch seinen Artikel zufällig abgespeichert? Er ist nämlich spurlos verschwunden. Nicht mal Xalon kommt da noch ran und seine lokale Kopie ist auch nicht mehr aufzutreiben. Für einen Cache im Internet war seine Seite zu kurz online (ich konnte jedenfalls nichts finden). Könnt ihr euren lokalen Browser-Cache mal danach durchsuchen?

Gerade wollte ich ihm die Arbeit abnehmen, und den Artikel ins Wiki übertragen (mit seiner Zustimmung natürlich). Da wird wohl nichts draus^^ Wirklich schade.

Bye, nz
 
Hallo Xalon,

mit Deiner im Tutorial beschriebenen Methode lassen sich nur Funktionen "hooken", die keine Parameter haben (z.B. KERNEL32.GetTickCount()).

Ruf doch mal die "gehookte" MessageBox() von irgendwo im Programm auf, d.h. nicht aus der main().
 
"gehookte" MessageBox() von irgendwo im Programm auf, d.h. nicht aus der main().
das ist mir zwar zuviel C Zeug drin ;) , aber als mögliche Fehlerquelle: sicher dass Dein Compiler STDCALL und nicht CDECL benutzt?

in etwa so sollte ein "allgemeiner" Hook gehen: Hooken, den Code wiederherstellen, an derselben Stelle weitermachen, wo der Hook vorher stand -als ob nichts geschehen wäre (daher braucht man sich auch nicht wirklich darum zu kümmern, was man für Anweisungen mit dem Hook auseinanderreißen könnte ;) ) - und wenn man die RET Adresse manipuliert, kann man ein zweites mal in den Hookcode kommen, um den Hook nochmal zu setzen.

Das war mal für ein Injectme (war ein "einmaliger Hook" und wurde gerade erweitert (auf die Uhr schiel :rolleyes: )) - wie immer hat der Code eine lange Geschichte hinter sich und wurde zig mal aus den älteren Versionen übernommen (daher auch einige unschöne Passagen - denn "never change working code" ;) ). Im wesentlichen sollte es auch auf DLL übertragbar sein (da wird man sich auch keinen Kopf mit der relativen Adressierung machen müssen)

Im Beispiel hookt er die MessageBox API in einer beliebigen "test.exe" und gibt jedesmal eine eigene (zusätliche) MsgBox aus.
 
@CDW:

Deine Vermutung ( __cdecl, __stdcall ) geht in die richtige Richtung. Allerdings soll (muss) das aus dem Tutorial hervorgehen.

Ausserdem darf man niemals "Murpy's Gesetz" ausser Acht lassen :

Der Erste, der Beispielcode verwendet, wird USER32.wsprintfA() hooken wollen.
 
@shodan: Klasse. Danke. Wo hast Du die Seite gefunden?

@merker & CDW: Womöglich könnt ihr dabei helfen, den Artikel zu erweitern, sobald er im Wiki steht? Das wäre wirklich eine große Hilfe für unser Wiki.

Bye, nz
 
Allerdings soll (muss) das aus dem Tutorial hervorgehen.
....
Der Erste, der Beispielcode verwendet, wird USER32.wsprintfA() hooken wollen.
einerseits hast Du recht (manche Sachen hält man für "selbstverständlich" wenn man sich länger mit einer Thematik beschäftigt und vergisst sie zu erwähnen), andererseits muss man imho bei solchen Themen nicht "Computabild hilft" nachmachen - API Hooking ist durchaus ein komplexeres Thema und sollte eigentlich erst in der Theorie verstanden werden, bevor man es praktisch (Code) umsetzt.


den Artikel zu erweitern, sobald er im Wiki steht?
Ich mag kein C und MASM[1] werden wahrscheinlich die meisten nicht lesen können(wollen) ;). Wenn sich jemand bereit erklärt, die Beispiele aus dem Artikel weiterzuführen und zu ergänzen (so dass man keinen MASM/C Missmatch machen muss), werde ich gerne meinen Teil beisteuern.

[1]Es sollte sich niemand von diesem MASM Beispiel abschrecken lassen, da hier noch die relative Adressierung berücksichtigt wird und das ganze eher für "private" Zwecke geschrieben wurde. In einer DLL kann man darauf verzichen und der Assemblyanteil sollte sich auch sehr einschränken lassen. Der Trick mit der "Hookeinsetzung" ist zu dem relativ dreckig geschrieben worden.
 
Zurück
Oben