Diskuze: C++ - Hledání ukazatele na exportovanou funkci v cizím procesu

Aktivity (2)
Avatar
Adam Black
Člen
Avatar
Adam Black:11. července 11:12

Zdravím,
Jak už název říká, snažím se získat ukazatel na funkci, která je v mono.dll a je exportovaná.
Musím, ale získávat ukazatel na běžicím procesu hry a ne u sebe.
Do hry nechci injectovat další DLLko, které by mi to nějakým způsobem poslalo.
Mám ten kód v c#, ale je špatně napsaný a nesrozumitelný, proto ho tady nebudu dávat.

Jak toto provést?

 
Odpovědět 11. července 11:12
Avatar
Adam Black
Člen
Avatar
Odpovídá na Adam Black
Adam Black:11. července 11:39

Našel jsem implementaci v c#, ta je přehlednější než ta moje.

https://github.com/…lInjector.cs#L499

 
Nahoru Odpovědět 11. července 11:39
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Adam Black
Martin Dráb:11. července 20:55

Pokud víš, o jakou DLL knihovnu se jedná (přímo soubor), nemusíš pro získání adresy hledané funkce shat do cílového procesu. V pohodě stačí, když

  1. načteš knihovnu k sobě (LoadLibraryEx),
  2. zjistíš adresu funkce podle jejího jména či ordinálního čísla (GetProcAddress),
  3. uvolníš knihovnu z paměti (FreeLibrary),
  4. získáš seznam DLL knihoven v cílovém procesu (CreateToolhel­p32Snapshot, Module32First, *Module32Next, **CloseHandle),
  5. najdeš v nich hledanou knihovnu,
  6. od adresy zjištěné v 2) odečteš bázovou adresu získanou z LoadLibraryEx a přičteš k ní bázovou adresu získanou v 5).

Termín bázová adresa zde znamená virtuální adresu v prostoru procesu, na které DLL knihovna začíná. Termín module handle, se kterým se setkáš v dokumentace, je vlastně bázová adresa (jen je potřeba případně vynulovat posledních 12 bitů, protože bázové adresy jsou vždy zarovnány na 4 KB (nebo možná i 64 KB)).

Problém může nastat, pokud je tvoje aplikace 64bitová a ta cílová 32bitová (nebo naopak), protože pak nemůžeš použít krok 1) a celé se to komplikuje. Otázka také je, co pak s tou získanou adresou budeš dělat, když nechceš nic do daného procesu injektovat.

Do závorek jsem dával názvy funkcí Windows API. Ty v C# s jistým syntaktickým cukrem použít jdou, ale pro většinu kroků bys měl najít i přímo ekvivalenty v knihovnách .NETu.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 11. července 20:55
2 + 2 = 5 for extremely large values of 2
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.