Microsofts Detours Library 2.1 mit BCB?



  • 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: 0x00000000

    Der 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.lib

    Die 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



  • Maverick schrieb:

    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?

    Nein, die sollten eigentlich statisch in deine DLL hineingelinkt sein! detoured.dll dient nur als Marker. Das steht übrigens auch in der Dokumentation; lies die doch einfach mal.

    Maverick schrieb:

    Einstellungen diszgl. wegen "_" voran stellen habe ich in den Projektoptionen nicht gemacht.

    Sollte auch nicht nötig sein.

    Maverick schrieb:

    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

    So habe ich das aber nicht geschrieben. Lies mal genauer 😉

    audacia schrieb:

    Lege einfach ein Library-Projekt an, füge creatwth.cpp, detours.cpp, image.cpp, disasm.cpp und modules.cpp hinzu und erstelle es. [...]

    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.

    Das Library-Projekt kannst du vorzugsweise "detours.lib" nennen 😉

    Und falls es daran scheitern sollte: mit "Library-Projekt" bezog ich mich auf eine statische Bibliothek.



  • Konnte nu alles kompilieren, aber meine Test DLL (bzw. das mit bcb kompilierte Beispiel funzt noch). Da wird der "Nullexport" nicht exportiert.

    Zum anderen wird auch noch witzigerweise die Detours() Funktion exportiert was eigentlich nicht sein sollte 😞

    @audia

    Ich hatte dir vorgestern eine Mail geschrieben, die is wohl scheinbar nicht angekommen oder du hast sie nicht gelesen, ka was zutrifft. Muss hier allerdings noch anmerken das ich den Absendernamen im EMail Client falsch eingestellt hab 😞



  • Maverick schrieb:

    Ich hatte dir vorgestern eine Mail geschrieben, die is wohl scheinbar nicht angekommen oder du hast sie nicht gelesen, ka was zutrifft. Muss hier allerdings noch anmerken das ich den Absendernamen im EMail Client falsch eingestellt hab 😞

    Die ist angekommen, aber ich schaue zzt. nur an Wochenenden, und diesesmal eben erst sonntagabends, nach meinen Mails. Derzeit muß ich für eine etwas responsivere Kommunikation leider das Forum empfehlen 😞



  • Es klappt jetzt.

    Habe das total übersehen mit Statischer Library in der Objektgallerie *schäm*

    Witzig ist aber, dass Antivir die DLL als Malware erkennt 🤡

    €dit

    Naja, ein Problem hab ich jetzt noch.

    Wenn ich das tracetcp Beispiel jetzt kompiliere, fehlt der NullExport.

    Wenn ich dann im tracetcp.cpp das abändere auf

    extern "C" __declspec (dllexport) NullExport()
    

    krieg ich vom Linker:

    [Linker Fehler] Error: Das als public deklarierte Symbol für EXPDEF 'NullExport' wurde nicht in Modul <pfad>\tracetcp\tracetcp.cpp gefunden
    

    Habs direkt bei der Funktion gemacht, aber auch wenn ich es am Anfang deklariere krieg ich die Meldung immer noch.



  • So, muss den Thread nochmal hochholen.

    Also die Lib, die DLL sowie das Tracetcp Beispiel kann ich kompilieren.

    Wenn ich jetzt aber mit Withdll die DLL z.B. in Fireforx lade passiert nichts. Die Beispiel DLL ist mehr oder weniger "Standard", d.h. ich habe daran keine änderungen vorgenommen (Beep() mal aussen vorgelassen).

    Wenn ich die DLL nehme dich ich mit Vc++ 2008 kompiliert habe funktioniert es.
    Es funktioniert auch wenn ich "meine" Detoured.dll" mit der von VC++ austausche. (meine, wenn ich meine mit BCB übersetzte detoured.dll mit der im VC++ Bin Verzeichnis austausche, d.h. ich überschreibe die VC DLL mit meiner BCB DLL).

    Firefox wird via "withdll" geladen. Setdll hab ich noch nicht ausprobiert, gehe aber davon aus das es damit auch nicht funktionieren wird!

    Es sieht so aus als wäre doch noch irgendwo der Hund begraben, fraglich ist wo:

    Die Projekt Files sehen so aus (Inhaltsmässig):
    Detoured.dll:
    - _detoured.cpp
    - _detoured.h (beide umbenannt weil ich das DLL Projekt genauso genannt habe)

    Detours.lib
    - _detoured.h
    - _detours.cpp
    - creatwth.cpp
    - disasm.cpp
    - image.cpp
    - modules.cpp

    tracetcp.dll
    - _detoured.cpp
    - _detoured.h
    - _detours.cpp
    - detours.h
    - syelog.cpp
    - syelog.h
    - detours.lib
    - detoured.lib

    Änderungen an den Dateien hab ich nicht vorgenommen, abgesehen von dem NullExport in der tracetcp.cpp sowie den Export in der (_)detoured.h für den Export von Detoured().

    Den Nullexport für tracetcp habe ich so gemacht:
    extern "C" __declspec (dllexport) __stdcall void NullExport();

    Die DLL ansich exportiert nur den NullExport sowie den CPP Debug Hook.

    Irgendwas hab ich noch falsch gemacht, aber was 😕


Anmelden zum Antworten