[Video Tutorial] Microsoft Detours 1.5 New Video

09/30/2011 23:23 freehuntx#46
Quote:
Originally Posted by MrSm!th View Post
Um genau zu sein, wird sie einmal gehookt und danach wird der Hook immer aufgerufen, anstatt der originalen :p

Dann musst du entweder die Parameter prüfen und so darauf schließen, ob es die gewünschte ist oder du hookst nicht die MessageBoxW, sondern platzierst direkt einen Jump an der entsprechenden Stelle im Programm zu einer Codecave von dir (das geht natürlich nur, wenn sie bekannt ist).

Für letzteres brauchst du keinen Hook o.ô Musst einfach nur die Funktion callen, wo ist das Problem?

Danke für den Vorschlag, ja, kann ich machen.
Ja das muss man aber über asm machen, dachte da gibts nen geschmeidigeren weg mittels hooks.

Tatsächlich weis ich garnicht wie mann denn einfach funktionen eines prozesses callen kann o_O
09/30/2011 23:52 MrSm!th#47
Muss man nicht.

Und Hooks sind eher ungeschickter.

Kleiner Tipp:

Du tust es doch in einem Hook o.ô
Was machst du denn beim Aufruf des Trampolins?
10/01/2011 02:12 freehuntx#48
Quote:
Originally Posted by MrSm!th View Post
Muss man nicht.

Und Hooks sind eher ungeschickter.

Kleiner Tipp:

Du tust es doch in einem Hook o.ô
Was machst du denn beim Aufruf des Trampolins?
Ich verstehe dir Frage nicht ganz.

Bin wahrscheinlich zu müde.

Du meinst wahrscheinlich dass beim aufruf des trampolins, eine function mitsamt parameter übergeben wird oder?
Und ich darüber auch eine function callen könnte.
10/01/2011 23:04 chillakilla123#49
Quote:
Danke für den Vorschlag, ja, kann ich machen.
Thx, das wär echt geil :D:D
12/27/2011 16:41 Mi4uric3#50
Die Frage lässt mich wahrscheinlich wie einen Idioten darstehen, aber ich scheine beim Importieren der detours.h irgendwo einen Fehler gemacht zu haben. (Entwicklungsumgebung: Embarcadero RAD Studio XE2)

Meine Imports sehen so aus:

Das hier ist mein Code (MainWindow.cpp):

Beim Builden der .DLL zeigt mir der Compiler folgenden Fehler an:
Quote:
Originally Posted by Compiler
[ILINK32 Fehler] Error: Nicht auflösbares externes 'DetourFunction' referenziert.

Ich bitte um Hilfe (:
12/27/2011 18:19 MoepMeep#51
An die detour.lib gedacht? ;)

edit: blind ._. hast du :x
12/27/2011 18:26 HardCore.1337#52
hatte mal so ein ähnliches Problem. Probier mal Projekt -> Optionen -> C++Linker -> Mit der Delphi Laufzeit linken auf false zu stellen.

Das hat bei mir oft Probleme gemacht
12/27/2011 18:42 Trollface-#53
Quote:
Originally Posted by Mi4uric3 View Post
Die Frage lässt mich wahrscheinlich wie einen Idioten darstehen, aber ich scheine beim Importieren der detours.h irgendwo einen Fehler gemacht zu haben. (Entwicklungsumgebung: Embarcadero RAD Studio XE2)

Meine Imports sehen so aus:

Das hier ist mein Code (MainWindow.cpp):

Beim Builden der .DLL zeigt mir der Compiler folgenden Fehler an:



Ich bitte um Hilfe (:
Detours 1.5 und Embarcadero C++ Builder wird nichts soweit ich weiß, nimm 2.1 diese funktioniert ganz sicher, hab dir mal die Detours 2.1 hochgeladen sind für Embarcadero C++ Builder extra angepasst.

lg
12/27/2011 21:45 Mi4uric3#54
Quote:
Originally Posted by Trollface- View Post
Detours 1.5 und Embarcadero C++ Builder wird nichts soweit ich weiß, nimm 2.1 diese funktioniert ganz sicher, hab dir mal die Detours 2.1 hochgeladen sind für Embarcadero C++ Builder extra angepasst.

lg
Vielen Dank, das werde ich mal ausprobieren!
Der größte Unterschied (was ich so gelesen habe) ist nur, dass manchmal Doppelpointer benutzt werden, oder?
Naja ich probiers einfach mal ^-^

Okay, also angepasst.. ([ILINK32 Fehler] Error: 'DETOURS.LIB' enthält einen ungültigen OMF-Record, Typ 0x21 (möglicherweise COFF))
12/27/2011 21:51 MrSm!th#55
Man setzt den Detour völlig anders und dazu gehört es auch, einen Doppelpointer zu verwenden, ja.

Soweit ich weiß hat 2.1 aber einige Vorteile, zb. Threadsicherheit.
12/27/2011 22:05 Mi4uric3#56
So ich hab jetzt die neue detours.h & detours.lib (konvertiert) benutzt
Es kommt genau der selbe Fehler.. :/


Ich habe eine weitere Frage:
Es geht mir nicht darum, eine MessageBox zu hooken (das ist nur ein Test), sondern eine Funktion in einem Programm (logisch.).
Aber ich möchte nicht den Start der Funktion hooken, sondern mitten drin.
Wie mach ich das dann mit dem Trampolin?
Muss ich irgendwelche Argumente übergeben, wenn ich die Funktion mitten drin hooke?
12/30/2011 05:28 Nerran#57
Angenommen ich möchte eine Funktion detouren, die folgenden Aufbau hat:
Code:
__declspec(dllexport) int func_type (struct, const char *);
Wie müsste ich da mit dem __declspec und der struct umgehen? Reicht eine "nachgebaute" struct der selben größe oder muss ich 1:1 die Originale verwenden.
12/30/2011 13:48 yihaaa#58
@Mi4uric3: Das mit dem Trampolin dürfe schwierig werden, mach doch einfach eine CodeCave, dass dürfte der einfachste Weg sein. Wenn du mittendrin hookst, dann ist ja dein Funktionpointer nur auf die halbe Funktion.

MfG
12/30/2011 14:43 Akorn#59
Quote:
Originally Posted by Nerran View Post
Angenommen ich möchte eine Funktion detouren, die folgenden Aufbau hat:
Code:
__declspec(dllexport) int func_type (struct, const char *);
Wie müsste ich da mit dem __declspec und der struct umgehen? Reicht eine "nachgebaute" struct der selben größe oder muss ich 1:1 die Originale verwenden.
Als Parameter wird ja nicht die structur selber sondern nur ein Pointer zur Structur übergeben. Wen du aber mit den elementen der structur arbeiten willst Dann solltest du schon wissen wie die structur aufgebaut ist bzw wissen an welchen offset sich das element befindet das du brauchst. Wen du die structur aber nicht brauchst dan kannst du im Detour damit umgehen wie mit einer normalen variable.

Quote:
Originally Posted by Mi4uric3 View Post
Ich habe eine weitere Frage:
Es geht mir nicht darum, eine MessageBox zu hooken (das ist nur ein Test), sondern eine Funktion in einem Programm (logisch.).
Aber ich möchte nicht den Start der Funktion hooken, sondern mitten drin.
Wie mach ich das dann mit dem Trampolin?
Muss ich irgendwelche Argumente übergeben, wenn ich die Funktion mitten drin hooke?
Wen du ein hook setzten willst musst du ja 5bytes (jmp+sprungweite) überschreiben. Nun musst du aber darauf achten das wen der Maschinenbefehl der an der addresse ist an der du hooken willst nun keine 5bytes groß ist sondern z.b. 6 bytes das du nicht nur 5 bytes ins trampolin sicherts sondern 6bytes. Andererseits wen der Maschienenbefehl nur 4bytes groß ist dan must du den nächsten Maschinenbefehl der z.b. 3bytes groß ist mit sichern also im trampolin platz für 7 bytes machen.
Ansonsten müsstest du beim hooken in der mitte einer funktion darauf achten das sich die Stack Pointer verändern können was man beim ansprechen von Parametern und lokalen variablen berücksichtigen sollte.
12/30/2011 21:23 MrSm!th#60
@yihaaa: Blödsinn. Ein Detour ist im Grunde eine Codecave.

Da MS Detours automatisch die zu sichernde Menge an Bytes erkennt brauchst du nichts weiter beim Detour selbst beachten.
Du setzt den Detour einfach auf AdresseDerFunktion+OffsetAnDemDuDenJumpHabenMöchte st.

Was du aber beachten musst, sind eventuelle Stackzugriffe und Register.
Du musst dann auf jeden Fall deine Funktion als naked definieren, damit sie keinen Stackframe erstellt! Außerdem darfst du keine lokalen Variablen verwenden!
Und wenn du die Register brauchst (da man normalerweise mit einem Detour etwas verändern möchte und das Rechnungen/Speicherzugriffe/Funktionsaufrufe hervorruft, braucht man die fast immer) musst du die vorher alle auf dem Stack sichern! (pushad und pushfd)
Wenn du inline ASM nutzt, kannst du auch manuell die Register sichern, die du nutzt und sparst so etwas Rechnerei.
Ach ja und natürlich musst du auf die Parameter auch per inline ASM zugreifen, da du keine Parameter deklarieren solltest (denn der Compiler geht bei der Codegenerierung davon aus, dass die Parameter beim Aufruf an der Stelle sind, an der er sie erwartet, was bei eine Detour mitten in der Funktion aber nicht der Fall sein wird).
Außerdem weiß ich nichtmal, ob das überhaupt ginge, da afaik dafür ein Stackframe benötigt wird, der ja nicht erstellt wird.

Bei __stdcall Funktionen ist das einfach, da greifst du auf eventuelle Parameter mit dem EBP Register zu.
Bei __cdecl Funktionen wirst du, da man mit esp arbeitet, selbst das richtige Offset für die Parameter berechnen müssen (welches durch jedes PUSHen und POPen (auch durch das Sichern der Register) beeinfusst wird).

Quote:
Wen du ein hook setzten willst musst du ja 5bytes (jmp+sprungweite) überschreiben. Nun musst du aber darauf achten das wen der Maschinenbefehl der an der addresse ist an der du hooken willst nun keine 5bytes groß ist sondern z.b. 6 bytes das du nicht nur 5 bytes ins trampolin sicherts sondern 6bytes. Andererseits wen der Maschienenbefehl nur 4bytes groß ist dan must du den nächsten Maschinenbefehl der z.b. 3bytes groß ist mit sichern also im trampolin platz für 7 bytes machen.
Das gilt auch für den Funktionsanfang und ist bei MS Detours belanglos.