Hvis du vet adressen til funksjonen din i DLL, kan du ringe på "C" -språk via en funksjonspeker. La oss lage et eksempel:
Anta at du har en funksjon som er bosatt i en DLL kalt "notExportedFunc" med signaturen
int notExportedFunc (int a, int b);
Du kan kalle det som i følgende hovedprogram:
typedef int notExportedFunc (int a, int b); int main () {HANDLE h = LoadLibrary (L "mydll.dll"); // Bildebaseadresse, kan endres ved hvert anrop hvis (h == 0) {printf ("Kan ikke laste mydll.dll \ n"); retur -1; } int funcOffset = 0x11560; // fra linkerkartet int funcAddress = (int) h + funcOffset; notExportedFunc * f = (notExportedFunc *) (funcAddress); int resultat = f (3, 4); printf ("Resultat =% d \ n", resultat);}
I koblingskartet ser de aktuelle oppføringene slik ut:
0000: 00000000 ___ImageBase 10000000 < === Linker Forslag
0001: 00000000 __enc $ textbss $ begin 10001000 Ikke relevant her
0001: 00010000 __enc $ textbss $ end 10011000 Ikke relevant her
0002: 00000560? notExportedFunc @@ YAHHH @ Z 10011560 f dllmain.obj
ImageBase-adressen returneres av "LoadLibrary (" mydll.dll ")" -anropet. Du bør være oppmerksom på at denne adressen vanligvis endres ved hver samtale til LoadLibrary, på grunn av ASLR (Address Space Layout Randomization). Derfor må adressen til notExportedFunc ikke hentes direkte fra linkerkartet, men må beregnes. I vårt eksempel er forskyvningen 0x11560, som må legges til adressen som returneres av LoadLibrary.
Resten av programmet er vanlig "C" -funksjonsanrop via en funksjonspeker.
Det kan være mulig å automatisere dette videre, men eksemplet viser forhåpentligvis den generelle mekanikken for å ringe private funksjoner i en DLL.