Kan callback-functie niet worden gekoppeld?

Ik haakte een paar functies in mijn code en het werkte tot op de dag van vandaag behoorlijk code en toen kwam ik een bug tegen vanwege terugbelfunctie.

Laten we zeggen..

Als ik zoiets doe

puts("Hi!\n");

werkt goed. Ik kan dit hooken.

Maar als ik dit doe ...

typeof(puts) *fptr = puts;
fptr("Hi \n");

Haken werkt niet?

Ik gebruik OSX env en zoek naar symbolen om te kunnen haken. Kan iemand mij voorstellen wat er mis is met terugroepfuncties en wat ik zou moeten doen om het algoritme aan te halen?

EDIT: Ik heb wat meer foutopsporing gedaan, voor het geval als met de volgende informatie iedereen die een mening kan geven.

Ik denk dat dit een bron van problemen kan zijn?

bool Hook(const char *name, void *impl) {
    ...   
    void **EntryInAdressTable = find(name);
    if(EntryInAdressTable) {
        *EntryInAdressTable = impl;
    }
}
 ...
}

Dus wat hier gebeurt is, ik verander de ingang in de adrestabel voor het bijbehorende symbool met mijn implementatie en de in mijn implementatie noem ik de oorspronkelijke functie.

Dus mijn gok is: als we de callback-functie gebruiken, betekent dit dat we rechtstreeks naar het functie-adres hebben verwezen zonder door de adrestabel te gaan en dat is waarom de methode hooked niet wordt aangeroepen.

Heb ik gelijk met deze? Zo ja, kan iemand mij een oplossing voorstellen?

3
Ik denk dat je de term hooking misbruikt. Overhevelen betekent in het algemeen een normale oproep onderscheppen en vervangen door die van jou.
toegevoegd de auteur JosephH, de bron
ik denk dat je typedef wilt en niet type. lees deze stackoverflow.com/questions/4295432/typedef-function-pointer
toegevoegd de auteur madmik3, de bron
Nou, eigenlijk gaat mijn vraag over hooken en zo dacht ik, ik kan ook C ++ -oplossing gebruiken.
toegevoegd de auteur MacGeek, de bron
Hier met hooking wil ik gewoon dat mijn functie wordt uitgevoerd vóór de feitelijke.
toegevoegd de auteur MacGeek, de bron
Ik zoek naar symbolen die zijn verkregen door _dyld_get_image_header en zoek vervolgens naar mijn tekenreeks .. in dit geval _puts.
toegevoegd de auteur MacGeek, de bron
Ik ken typedef. typeof is slechts een snelle manier om de callback-functie te krijgen.
toegevoegd de auteur MacGeek, de bron
Ik heb de vraag bijgewerkt met mijn bevindingen. Laat me weten hoe je er over denkt.
toegevoegd de auteur MacGeek, de bron
Welk mechanisme gebruikt u om de functie te "haken"?
toegevoegd de auteur Nemo, de bron
Verbinden met welke omgeving?
toegevoegd de auteur Oliver Charlesworth, de bron
@Mac: Hooking kan een aantal dingen betekenen, afhankelijk van de context.
toegevoegd de auteur Oliver Charlesworth, de bron
typeof in C ++? 0_o, ziet eruit als C# -code
toegevoegd de auteur Mr.Anubis, de bron
@ Mr.Anubis typeof is een GCC-extensie voor C en C ++.
toegevoegd de auteur user142019, de bron

2 antwoord

Als we inhaken door te kijken naar de symbolentabel en het functieadres te vervangen, werkt het corresponderende met symboolinvoer zolang als we een functieaanroep doen met behulp van symboolinvoer in de symbolentabel. Als we het functie-adres direct gebruiken (callback-functie), zal het niet werken.

0
toegevoegd

Ervan uitgaande dat u LD_PRELOAD gebruikt om uw functies te haken, is de aanwijzer vermoedelijk gebonden aan de versie waarvan de linker weet wanneer u een link koppelt, in puts . de standaardbibliotheek, en wordt niet opgeheven wanneer uw voorgeladen bibliotheek tot stand komt. Ik kan geen manier bedenken om dit te omzeilen.

0
toegevoegd
Ik neem geen pointer naar puts. Ik neem een ​​symbool "_puts". Dan zoek ik naar commando's en probeer ik te achterhalen of deze string aanwezig is.
toegevoegd de auteur MacGeek, de bron
Ik heb de vraag bijgewerkt met mijn bevindingen. laat me weten hoe je er over denkt
toegevoegd de auteur MacGeek, de bron