windows - Visual C ++ - overstyrer en funktion importeret fra en DLL?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at tilsidesætte en bestemt funktion i kernel32.dll. Er det på en eller anden måde muligt at omdefinere den funktion i et statisk bibliotek og tvinge den eksekverbare til at bruge den i det statiske bibliotek? Jeg antager, at den forskellige forbindelse kunne blive et problem.


Det ville være muligt at tilsidesætte det med min egen brugerdefinerede DLL. Problemet er imidlertid, at DLL'en selv skal linke til kernel32.dll, så det ignorerer min definition af den funktion.


EDIT: Jeg fik det til at fungere med min egen DLL. Når du opbygger det, skal linketidskodegenerering være deaktiveret. Hvad med at forbinde den overstyrede funktion statisk dog?

Bedste reference


Ja, det er ikke noget stort problem. Funktioner defineres som \_\_dllimport, men det angiver ikke hvilket DLL de er importeret fra. Linkeren vælger simpelthen det første importbibliotek, der giver dem. Derfor skal du bare videregive dit bibliotek først . I MSVC skal du deaktivere 'inkludere standardbiblioteker', som de går forud for brugerdefinerede biblioteker.

Andre referencer 1


Hvis jeg forstår dig korrekt, vil du have brugerdefineret adfærd til en Windows API-funktion i kernel32.dll. Hvis ja, skal du koble til Windows API. En måde at gøre dette på er at bruge omkørsler. Haven har ikke prøvet det selv, men her er et link til en CodeProject-artikel - http://www.codeproject.com/Articles/30140/API-Hooking-with-MS-Detours.[6][7]

Andre referencer 2


Hvis din ansøgning allerede eksisterer og ikke kan ændres , så


du kan skrive proxy dll. Dvs. lav din egen dll kaldet kernel32.dll, læg den i applikationskatalog, og få din proxy dll til at give alle funktionsapplikationsbehov. Selvfølgelig skal din brugerdefinerede dll omdirigere alle opkald, som den ikke overstyrer til original kernel32.dll - ved at indlæse original dll ved hjælp af LoadLibrary.


Fordi LoadLibrary er leveret af kernel32 og du er proxying kernel32, skal du sandsynligvis kalde din proxy dll kernel33.dll og patch original exe og lade den indlæse kernel33 i stedet for kernel32.


Hele sagen er smerte, og for at gøre det med succes skal du være mindst bekendt med cli (kommandolinjegrænseflade - cmd.exe på windows) og dumpbin-værktøj. Denne forældede tutorial kan komme i gang. [8]


Alternativt kan du forsøge at bruge dll-injektion eller lignende teknikker. Der er også 'Detours' bibliotek, som jeg ikke har brugt (ikke sikker på hvorfor ville jeg bryde med det, hvis jeg kan lave en proxy dll). [9]


Hvis du har kildekoden adgang til din ansøgning , og kun den specifikke del af programmet har brug for forskellige rutiner ...


Derefter skal du gøre brugerdefineret rutine med det navn du vil have (siger myLoadLibrary). Derefter lav en overskrift, der bruger #define til at omdefinere din rutine. Dvs. noget som #define LoadLibrary myLoadLibrary. Medtag denne header i hver fil, hvor du skal tilsidesætte, og sørg for at den er inkluderet efter <windows.h>.