IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Adam Black
Člen
Avatar
Adam Black:11.7.2019 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.7.2019 11:12
Avatar
Adam Black
Člen
Avatar
Odpovídá na Adam Black
Adam Black:11.7.2019 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.7.2019 11:39
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Adam Black
Martin Dráb:11.7.2019 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í
+2,50 Kč
Řešení problému
Nahoru Odpovědět
11.7.2019 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.