Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] dlsym wrappen
Hey, habe folgendes Problem:
Ich möchte dlsym wrappen, aber das Problem ist, dass ich dann halt
nicht mehr die Symbole auflösen kann, weil ja mein eigenes dlsym
aufgerufen wird. Kann man vielleicht in dem Programm auf den(Genus?)
PLT zugreifen, um die original dlsym Addresse zu bekommen, damit man
die aufrufen kann ?
Vielen Dank,
h1web.
Warum nennst du dein dlsym nicht anderrs? Oder was hast du damit vor?
man ldAbschnitt wrap
gcc/g++ kannst du ld-parameter mit -Wl angeben.
Also dann z.B.
gcc mein_test.c -Wl,--wrap,foobar
Naja, das ganze soll schon noch dynamisch laufen. Also das ich das mit
der LD_PRELOAD Variable realisieren kann. Hab's nämlich grad getestet,
und da hats nicht funktioniert. Ist das überhaupt möglich ? Oder muss
ich mich da jetzt in das ELF-Format einlesen ?
Wenn ich dich recht verstehe, willst du folgendes:
- eine .so schreiben, die dlsym bereitstellt. Diese dlsym macht ein bisschen was und ruft dann die dlsym der libc auf.
Das ist nicht möglich. Deine Library kann entweder eine dlsym bereitstellen oder auf eine dlsym verweisen. Beides geht offensichtlich nicht.
Du könntest zwar in deiner Library die libc.so per dlopen öffnen und dann die entsprechende Funktion mittels dlsym importieren und aufrufen, aber da du gerade dlsym selbst wrappen willst, geht dieser Workaround nicht...
(Alles AFAICT)
Nunja, unter Windows kann man das machen, weil die originale
Funktion ja nicht berührt wird. Deswegen muss ich unter Windows
nur die Addresse haben, damit ich sie aufrufen kann. Also brauch ich
die Addresse von dem originalen dlsym.
Eben. Und die bekommst du von dlsym... Da du aber dlsym überschreibst, linkt der Linker auch nicht in deinem Programm zur richtigen dlsym, sobald er im ELF-Header eine Referenz auf dlsym findet...
Wie gesagt, für andere Funktionen geht das, aber für dlsym selbst dürfte es schwierig werden (wenn du unter Windows GetProcAddressEx überschreibst, wird es auch schwierig)
Du könntest dir den Source anschauen und dlsym nochmal selbst implementieren...
Kannst du wirklich nicht das zu testende Programm neu kompilieren? Da wäre es mit --wrap alles kein Problem.
Ich werde heute abend aber noch mal ein bisschen drüber nachdenken, vielleicht fällt mir noch was ein.
Naja, unter Windows ist sowas zum Beispiel mit Detour-Hook möglich.
Da überschreibt man einfach ein paar Bytes in der Funktion, damit
sie zur eigenen springt. Kann man unter Linux bei dlsym bestimmt auch
anwenden. Ich werd morgen nochmal ein bisschen probieren, wenn ich
Zeit hab, weil mich das wirklich interessiert. Und achja, neu kompilieren
wäre keine Lösung für mich.
Nacht, h1web.
Sorry wegen bump, aber vielleicht interessiert ja jemanden wie das geht. Hab nämlich eine Lösung gefunden. Man kann das Private Backend der libc benutzen. Da werden mehrere Funktionen exportiert, unter anderem auch dlsym (als __libc_dlsym).
Einfach nur Funktionsprototyp deklarieren und benutzen:
extern void *__libc_dlsym (void *__map, __const char *__name);
void *dlsym(void *handle, const char *symbol)
{
void* result = __libc_dlsym(handle, symbol);
return result;
}
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.