Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] dlsym wrappen



h1web
08-05-2006, 16:17
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.

panzi
08-05-2006, 19:30
Warum nennst du dein dlsym nicht anderrs? Oder was hast du damit vor?

Joghurt
08-05-2006, 22:22
man ldAbschnitt wrap

gcc/g++ kannst du ld-parameter mit -Wl angeben.
Also dann z.B.

gcc mein_test.c -Wl,--wrap,foobar

h1web
09-05-2006, 14:51
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 ?

Joghurt
09-05-2006, 15:40
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)

h1web
09-05-2006, 18:52
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.

Joghurt
09-05-2006, 19:20
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.

h1web
09-05-2006, 21:26
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.

h1web
10-02-2007, 21:16
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;
}