Fråga:
DLL-injektionssökning efter procedurer / variabler
astralmaster
2014-12-16 18:47:16 UTC
view on stackexchange narkive permalink

Jag lär mig grunderna i DLL-injektion och olika tekniker för att uppnå det, som att till exempel använda CreateProcess och LoadLibrary eller helt enkelt att ersätta en .dll i mappen där applikationen injicera i bostäder. Jag kunde utföra några grundläggande uppgifter efter att ha laddat .dll i programmets minnesutrymme som att anropa en MessageBox DLLEntry och några andra. Men hur kan man manipulera med koden för själva applikationen, t.ex. anropa ett visst förfarande som ingår i applikationen, eller helt enkelt ändra en variabel? De flesta handledning jag har läst online diskuterar bara själva injiceringsprocessen, men inte de faktiska manipulationerna med applikationer. Eller åtminstone har jag problem med att hitta den informationen.

Så hur hittar / extraherar du minnesdelarna i applikationen du är intresserad av och sedan ändrar / ändrar dem?

Ett svar:
RoraΖ
2014-12-16 19:23:35 UTC
view on stackexchange narkive permalink

Om du vill använda en funktion i applikationen är bottenlinjen att du behöver veta var den finns. Utan ASLR kan du hårdkoda adressen till funktionen i din DLL och använda en funktionspekare för att anropa den. Om du vill ändra data från en funktion i ett laddat bibliotek måste du ansluta den funktionen och ringa din egen kod för dess funktioner.

Om en applikations funktion ligger på 0x0041A000 kan du skapa en funktion pekare om du känner till all information om funktionen; samtalskonventionen, returvärdet och parametrarna. Anta att det är __stdcall , två VOID * parametrar och returnerar en DWORD.

  typedef DWORD (WINAPI * FunctionType) (VOID * a, VOID * b); DllEntry (...) {FunctionType function = (FunctionType) 0x0041A000; funktion (din_param1, din_param2);}  

Du kan också ansluta den funktionen med hjälp av biblioteket Windows Detours. Återigen skulle du skriva in adressen till den funktion du vill koppla in och skriva din egen version av funktionen. Du måste se till att den returnerar samma typ av värde som den verkliga funktionen för att säkerställa att inget går sönder i samtalsfunktionen. Med GetProcAddress kan du koppla ett funktionsanrop i ett bibliotek snarare än programmets funktion.

Allt detta blir komplicerat med ASLR. Eftersom applikationen kanske inte finns på platsen tror du att den är. Detta svar kan hjälpa till med beräkningarna av vissa avsnitt som bestäms av programmets basadress.

Att ändra globala variabler är samma typ av affär. Du måste hitta deras förskjutning i programmet. Du kan sedan skapa pekare till den minnesadressen för att manipulera den.



Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...