Microsofts Detours Library 2.1 mit BCB?
-
Hi,
hat schon wer erfolgreich die Lib mit BCB benutzt? Ich kann die Lib zwar mit Coff2omf konvertieren, wenn ich aber dann im Projekt die detours.lib und detoured.lib sowie die detours.h einbinde und dann z.b. als Funktionstest die "DetourAttach" Routine aufrufe bekomm ich vom Linker folgende Fehlermeldung:
[Linker Fehler] Error: Ungelöste externe 'DetourAttach' referenziert von <Pfad zum Projekt>\DEBUG_BUILD\UNIT1.OBJ
Die Libs hab ich via
coff2omf -v -lib:ms detoured.lib detoured_o.lib
coff2omf -v -lib:ms detours.lib detours_o.libkonvertiert. Nennenswert währe wohl evtl noch ich die Lib mit Visual C++ 2008 Express kompiliert habe. VC6 hab ich leider nicht
Könnte das evtl. jemand für mich kompilieren der beide Compiler hat?
Die Lib in Version 2.1 gibt es hier: http://research.microsoft.com/Research/Downloads/Details/d36340fb-4d3c-4ddd-bf5b-1db25d03713d/Details.aspx
Alternativ wäre es auch klasse wenn jemand die Lib schon so umgestrickt hat damit sie mit dem BCB genutzt werden kann, aber das muss man dann letztendlich sehen ob das wer gemacht hat. Klasse wär es jedenfalls
Danke schon mal
-
Haste auch die lib mit in das Projekt aufgenommen?
-
VergissEs schrieb:
Haste auch die lib mit in das Projekt aufgenommen?
Das steht eigentlich im ersten Post.
-
Weiss den wirklich keiner was? Muss sich doch wer finden lassen
-
Schon mal mit IMPLIB probiert?
-
Nein noch nicht, mein erster Versuch:
<pfad>)\src\lib>implib -a neu.lib detoured.lib
Borland Implib Version 3.0.22 Copyright (c) 1991, 2000 Inprise Corporation
Error detoured.lib: unknown file type<pfad>\src\lib>
Man braucht wohl noch ein DEF File:
<pfad>\src\bin>impdef -a test.def detoured.dll
Borland Impdef Version 3.0.22 Copyright (c) 1991, 2000 Inprise Corporation
<pfad>\src>implib -a final.lib test.def
Borland Implib Version 3.0.22 Copyright (c) 1991, 2000 Inprise Corporation
Name: 'test' Ext: '.dll' Base: 0x00000000
Name: 'DETOURED.DLL' Ext: '.dll' Base: 0x00000000Der Linkerfehler kommt immer noch, vermutlich hab ich was falsch gemacht?
-
Naja, schade das sich keiner beteiligen kann. Werde jetzt einfach die DLL in VC 2008 Express machen, andere wahl habe ich ja nicht.
-
Maverick schrieb:
<pfad>)\src\lib>implib -a neu.lib detoured.lib
IMPLIB konvertiert nicht COFF-Libraries - das macht man, wie du weißt, mit COFF2OMF -, sondern erstellt aus den von der DLL exportierten Funktionen eine Import-Library. Versuche es dementsprechend mal mit
IMPLIB -a -c detoured_bcc.lib detoured.dll
.
Ob und inwiefern die erstellte Datei deinen Anforderungen genügt oder auch nicht genügt, kannst du übrigens sehr gut mithilfe von TDUMP diagnostizieren.
-
Interessant ist jetzt allerdings - was ich gerade gesehen habe - das die DLL kaum Exporte hat
Die Libs haben folgende grösse:
14.07.2008 21:17 1.822 detoured.lib
14.07.2008 21:17 201.872 detours.libDie DLL:
14.07.2008 21:17 4.096 detoured.dll
-
Maverick schrieb:
14.07.2008 21:17 4.096 detoured.dll
4 KB? Sicher, daß beim Erstellen der DLL nichts schiefging?
-
Nein, weil die Beispiel funktionieren.
-
Beeindruckend.
Funktioniert der Ansatz mit IMPLIB denn?
-
Scheinbar nicht.
Würde das ja am liebsten mit BCB kompilieren aber da gibt es diverse Probleme mit der deklaration von Funktionen etc. Ich habs inzwischen aufgegeben.
-
Die DLL selbst mit dem C++Builder zu kompilieren dürfte nicht ohne weiteres machbar sein, da sie sehr MSVC-spezifisch ist. Aber die Importe sollten sich auch im BCB verwenden lassen.
-
Nun habe ich selbst einen Fall, in dem ich Detours einsetze, und ich stelle fest, daß ich meine Vermutung relativieren muß: Detours läßt sich wunderbar mit dem C++Builder übersetzen.
Lege einfach ein Library-Projekt an, füge creatwth.cpp, detours.cpp, image.cpp, disasm.cpp und modules.cpp hinzu und erstelle es. Dabei erhältst du einige Warnungen, und zumindest zwei davon sollten dich zu einer kleinen Änderung veranlassen: nämlich stehen einige nicht suffizierte 64-Bit-Integer-Konstanten im Code, die eine Integer-Overflow-Warnung verursachen. Hänge bei den beiden Konstanten einfach "ULL" an, um sie als unsigned long long zu markieren.
Analog kannst du auch die detoured.dll erstellen, indem du ein neues DLL-Projekt anlegst, detoured.cpp hinzufügst und in detoured.cpp und detoured.h die Funktion Detoured() um extern "C" und __declspec (dllexport) erweiterst.
-
So, musste in der detours.h das hier rausnehmen:
Zeile 360 - 374
#if (_MSC_VER < 1299) #include <imagehlp.h> typedef IMAGEHLP_MODULE IMAGEHLP_MODULE64; typedef PIMAGEHLP_MODULE PIMAGEHLP_MODULE64; typedef IMAGEHLP_SYMBOL SYMBOL_INFO; typedef PIMAGEHLP_SYMBOL PSYMBOL_INFO; static inline LONG InterlockedCompareExchange(LONG *ptr, LONG nval, LONG oval) { return (LONG)::InterlockedCompareExchange((PVOID*)ptr, (PVOID)nval, (PVOID)oval); } #else #include <dbghelp.h> #endif
dann noch die "dbghelp.h" wieder inkludiert, sonst hätte es in der modules.cpp eine Fehlermeldung gegeben bei einer Funktiondeklarierung. (Zeile 118)
in Detours.cpp sowie disasm.cpp
#define DETOURS_X86
hinzugefügt.
Warnungen hab ich die hier bekommen: (nehme mal an das sind die die du gemeint hast?):
[C++ Warnung] creatwth.cpp(431): W8012 Vergleich von signed- und unsigned-Werten [C++ Warnung] detours.cpp(417): W8098 Ungültige mehrstellige Zeichenkonstante [C++ Warnung] detours.cpp(451): W8056 Überlauf in mathematischem Integer-Ausdruck [C++ Warnung] detours.cpp(452): W8056 Überlauf in mathematischem Integer-Ausdruck [C++ Warnung] detours.cpp(1189): W8012 Vergleich von signed- und unsigned-Werten [C++ Warnung] detours.cpp(1283): W8098 Ungültige mehrstellige Zeichenkonstante [C++ Warnung] detours.cpp(1290): W8098 Ungültige mehrstellige Zeichenkonstante [C++ Warnung] detours.cpp(1291): W8098 Ungültige mehrstellige Zeichenkonstante [C++ Warnung] detours.cpp(1292): W8098 Ungültige mehrstellige Zeichenkonstante [C++ Warnung] detours.cpp(1293): W8098 Ungültige mehrstellige Zeichenkonstante [C++ Warnung] detours.cpp(1354): W8012 Vergleich von signed- und unsigned-Werten [C++ Warnung] image.cpp(776): W8012 Vergleich von signed- und unsigned-Werten [C++ Warnung] image.cpp(954): W8012 Vergleich von signed- und unsigned-Werten [C++ Warnung] image.cpp(970): W8012 Vergleich von signed- und unsigned-Werten [C++ Warnung] image.cpp(1118): W8012 Vergleich von signed- und unsigned-Werten [C++ Warnung] image.cpp(1276): W8012 Vergleich von signed- und unsigned-Werten [C++ Warnung] image.cpp(1658): W8012 Vergleich von signed- und unsigned-Werten [C++ Warnung] image.cpp(1889): W8012 Vergleich von signed- und unsigned-Werten [C++ Warnung] modules.cpp(491): W8012 Vergleich von signed- und unsigned-Werten [C++ Warnung] modules.cpp(542): W8012 Vergleich von signed- und unsigned-Werten
Ansonsten wurd die DLL erzeugt. Muss morgen dann testen ob sie auch funktioniert.
Auf jedenfall ein dickes danke
-
Maverick schrieb:
in Detours.cpp sowie disasm.cpp
#define DETOURS_X86
hinzugefügt.
Stimmt, das vergaß ich zu erwähnen. Aber die Fehlermeldung ist ja recht eindeutig.
Maverick schrieb:
Warnungen hab ich die hier bekommen: (nehme mal an das sind die die du gemeint hast?):
Genau die. Zumindest die beiden Überlauf-Warnungen würde ich beheben wie oben vorgeschlagen.
Maverick schrieb:
Ansonsten wurd die DLL erzeugt. Muss morgen dann testen ob sie auch funktioniert.
Wie ich bei näherer Betrachtung feststellte, ist die eigentliche Funktionalität gar nicht in der DLL - die lediglich als Marker dient -, sondern in der statischen Bibliothek. Kein Wunder, daß IMPLIB und COFF2OMF nicht helfen konnten.
Bei mir funktioniert es nun jedenfalls ohne Probleme.
-
Die Integer-Überläufe motzt er ja hier an: (detours.cpp Zeile 451 + 452)
PDETOUR_TRAMPOLINE pHi = (PDETOUR_TRAMPOLINE) ((pbTarget < (PBYTE)0xffffffff80000000) ? pbTarget + 0x7ff80000 : (PBYTE)0xfffffffffff80000);
Aber welche Konstanten muss ich dann wie ändern? Du hast zwar geschrieben das ich ULL voranstellen muss aber so ganz hab ich das nicht geschnallt (also welche konstanten das betrifft).
Die sind ja etwas weiter oben deklariert: (Zeile 417 - 422)
const ULONG DETOUR_REGION_SIGNATURE = 'Rrtd'; const ULONG DETOUR_REGION_SIZE = 0x10000; const ULONG DETOUR_TRAMPOLINES_PER_REGION = (DETOUR_REGION_SIZE / sizeof(DETOUR_TRAMPOLINE)) - 1; static PDETOUR_REGION s_pRegions = NULL; // List of all regions. static PDETOUR_REGION s_pRegion = NULL; // Default region.
Die DLL funktioniert. Habe allerdings nur das "tracetcp" Beispiel ausprobiert.
€dit:
Nachdem du dich ja schon etwas damit beschäftigt hast: Wie müsste ich das den machen damit ich die detoured.dll in die statische Lib einbinden kann? So braucht man ja 2 DLLs. Meine damit ich von 2 DLLs auf 1 reduzieren kann.
Vor allem hab ich noch eines nicht begriffen:
Im "samples" Verzeichnis ist ja ein DLL Injecter dabei ("withdll"), hier muss man allerdings den Pfad zur detoured.dll angeben. Habe allerdings meinen "eigenen" Injecter der mit einer anderen API Hook DLL tadellos funktioniert."withdll" setzt allerdings voraus das man den Prozess damit startet damit die Hook DLL sowie der Marker geladen wird. In meinem Fall geht das allerdings nicht da mein Targetprocess von einem anderen Process gestartet wird, so muss ich mit meinem eigenen Injecter auf den Process warten damit ich die DLL injezieren kann.
Den Code von "withdll" hab ich mir schon angesehen. Hier wird scheinbar (?) die detoured.dll irgendwie geladen bevor die Hook DLL injeziert wird. Leider hab ich da den Code noch nicht ganz verstanden damit ich verstehen kann, wie ich meinen eigenen Injecter erweitern muss. Alternativ könnte man die detoured.dll einfach ins Windows System Verzeichnis kopieren, sauber wäre es aber nur bedingt.
-
Maverick schrieb:
Die Integer-Überläufe motzt er ja hier an: (detours.cpp Zeile 451 + 452)
PDETOUR_TRAMPOLINE pHi = (PDETOUR_TRAMPOLINE) ((pbTarget < (PBYTE)0xffffffff80000000) ? pbTarget + 0x7ff80000 : (PBYTE)0xfffffffffff80000);
Aber welche Konstanten muss ich dann wie ändern? Du hast zwar geschrieben das ich ULL voranstellen muss aber so ganz hab ich das nicht geschnallt (also welche konstanten das betrifft).
Ich schrieb 'suffizieren', nicht 'präfizieren'
0xffffffff80000000ull
Maverick schrieb:
Nachdem du dich ja schon etwas damit beschäftigt hast: Wie müsste ich das den machen damit ich die detoured.dll in die statische Lib einbinden kann? So braucht man ja 2 DLLs. Meine damit ich von 2 DLLs auf 1 reduzieren kann.
Wie kommst du an zwei DLLs? detoured.cpp wird zu einer DLL kompiliert, aber aus dem Rest solltest du doch eine statische Bibliothek gemacht haben!?
Maverick schrieb:
Hier wird scheinbar (?) die detoured.dll irgendwie geladen bevor die Hook DLL injeziert wird.
Nicht ganz. withdll benutzt das Detours-API, uimdie Import-Tabelle des Prozesses so zu verändern, daß einerseits detoured.dll, also der Marker, andererseits die von dir angegebene DLL beim Start vom PE-Loader dazugelinkt werden.
Wenn die Anwendung, in die du eingreifen willst, schon läuft, bleibt dir in der Tat nichts anderes übrig, als deine DLL auf einem der üblichen Wege zu injizieren.
-
audacia|off schrieb:
0xffffffff80000000ull
Huch, nun gehts
audacia|off schrieb:
Wie kommst du an zwei DLLs? detoured.cpp wird zu einer DLL kompiliert, aber aus dem Rest solltest du doch eine statische Bibliothek gemacht haben!?
Na ganz einfach: Meine DLL + detoured.dll
audacia|off schrieb:
Wenn die Anwendung, in die du eingreifen willst, schon läuft, bleibt dir in der Tat nichts anderes übrig, als deine DLL auf einem der üblichen Wege zu injizieren.
Hmm, also wenn ich die detoured.dll in das Windoof System Verzeichnis kopier, und dann meine DLL in den Zielprozess injeziere funktioniert es. Scheinbar lädt meine DLL dann die DLL wegen den Detours Funktionen?
Ich hab bei dem erstellen der detoured.dll wohl irgend einen Fehler gemacht bzw. etwas übersehen? Wenn ich das "tracetcp" mit dem BCB kompilieren will, krieg ich Fehler vom Linker:
[Linker Fehler] Error: Ungelöste externe 'DetourRestoreAfterWith' referenziert von <pfad>\DEBUG_BUILD\TRACETCP.OBJ [Linker Fehler] Error: Ungelöste externe 'DetourTransactionBegin' referenziert von <pfad>\DEBUG_BUILD\TRACETCP.OBJ [Linker Fehler] Error: Ungelöste externe 'DetourUpdateThread' referenziert von <pfad>\TRACETCP\DEBUG_BUILD\TRACETCP.OBJ [Linker Fehler] Error: Ungelöste externe 'DetourAttach' referenziert von <pfad>\TRACETCP\DEBUG_BUILD\TRACETCP.OBJ [Linker Fehler] Error: Ungelöste externe 'DetourTransactionCommit' referenziert von <pfad>\TRACETCP\DEBUG_BUILD\TRACETCP.OBJ [Linker Fehler] Error: Ungelöste externe 'DetourDetach' referenziert von <pfad>\TRACETCP\DEBUG_BUILD\TRACETCP.OBJ
Die LIB hab ich natürlich eingebunden, habe aber jetzt gesehen das man scheinbar 2 Libs importieren muss, da die die o.g. Exports in der detours.lib drin stehen, aber nicht in der detoured.lib. Ist wohl der Grund warum der Linker das nicht findet.
Einstellungen diszgl. wegen "_" voran stellen habe ich in den Projektoptionen nicht gemacht.
Also die detoured.dll hab ich erstellt wie von dir geschrieben, d.h. das Projekt enthält:
- creatwth.cpp
- detoured.cpp
- detoured.h
- detours.cpp
- detours.h
- disasm.cpp
- image.cpp
- modules.cpp