c ++ - Hooking dll i løbende proces ved hjælp af loadappinit\_dlls registreringsnøgle

Indlæg af Hanne Mølgaard Plasc

Problem



I øjeblikket arbejder jeg på en applikation, hvor jeg skal køre dll i løbende applikation. For at nå dette mål har jeg opdateret LoadAppInit\_DLLs registreringsnøglen til 1 og AppInit\_DLLs er blevet indstillet til dll'ens placering.
Denne fremgangsmåde virker fint, da ansøgningen får åbent dll få injiceret i processen i den ansøgning.


Imidlertid injicerer denne injektionsproces ikke blot dll'en i den ansøgning, som jeg er interesseret i, men den injicerer den til alle de programmer, jeg starter i Windows-operativsystemet. Hvordan kan jeg angive, at denne indsprøjtning kun skal ske for den applikation, som jeg har brug for den til at injicere og ikke for hele applikationen. Jeg leder efter en måde at kende fra dll, hvilken applikation den ringer til og derefter bestemme om den skal læses eller ignorere indlæsningen.

Bedste reference



  Hvordan kan jeg angive, at denne indsprøjtning kun skal ske for den applikation, som jeg har brug for den til at injicere og ikke for hele applikationen.



Ved hjælp af AppInit\_DLLs kan du 't.


Arbejder med registreringsværdien AppInit\_DLLs [23]



  Alle de DLL'er, der er angivet i denne værdi, er indlæst af hvert Microsoft Windows-baseret program, der kører i den aktuelle log-on-session.







  Jeg leder efter en måde at vide fra dll, hvilken applikation den ringer til



En DLL er indlæst i adresseplaceringen af ​​en proces. En DLL kan ringe GetModuleFileName(NULL) for at hente
fuld sti og filnavn for den proces, den er blevet indlæst i.



  og derefter beslutte, om du skal indlæse det eller ignorere indlæsningen.



Normalt giver en DLLs DllMain() adgangspunkt mulighed for, at DLL selektivt afbryder indlæsningen ved at returnere FALSE til meddelelsen DLL\_PROCESS\_ATTACH. AppInit\_DLLs angiver yderligere DLL'er, der anses for nødvendige til succesfuld appinitialisering , ligner statisk-koblede DLL'er, så det tillader ikke DLL'er at vælge selektiv loading. Hvis en AppInit DLL returnerer FALSE, afbrydes hele processen.


Du skal manuelt koble DLL'en til mål appen selv. Du kan gøre det ved enten:



  1. Brug CreateRemoteThread() til at ringe LoadLibrary() inde fra en bestemt proces for at indlæse DLL'en i den samme proces. DLL'ens indtastningspunkt behøver ikke at validere den indlæste proces, da indlæsningsappen allerede har gjort det, når det afgøres, hvilken proces der skal indlæses til DLL'en. [24] [25]


    Denne fremgangsmåde tager dog nogle opsætninger. Du skal bruge VirtualAllocEx() og WriteProcessMemory() til at kopiere DLLs fulde stregstreng i målprocessen, før du derefter kan få fjerntrådsopkaldet LoadLibrary() med den pågældende stregstreng som input. [26] [27]

  2. Brug af SetWindowsHookEx() til at installere en global system-wide hook, der implementeres inden for DLL'en, så DLL'en bliver indlæst i hver kørende proces. [28]


    Forskellen mellem denne fremgangsmåde og brug af AppInit\_DLLs er, at denne tilgang håndteres dynamisk efter hver proces kører og dermed giver DLLen den luksus at selektivt afbryde sin egen indlæsning uden at afslutte hver proces, som den afviser.

  3. Konfiguration af applikationskompatibilitet Toolkit til at indlæse din DLL i de specifikke app (er) du er interesseret i. [29]


Andre referencer 1


Alle DLL'er, der er opført i LoadAppInit\_DLLs registreringsnøglen, vil blive indlæst til alle processer, der er knyttet til user32.dll. Hvis din dll af en eller anden grund ikke kan indlæse (for eksempel - du var returneret FALSE fra DllMainDLL\_PROCESS\_ATTACH) vil processen blive afsluttet. Brug af LoadAppInit\_DLLs selv til debugging er rodet og ret farligt. Måske skal du vælge en anden hooking mekanisme, for eksempel ved hjælp af SetWindowsHookEx