DLL Injection Sprawdzanie czy wykonywana jest dana funkcja

0

Witam!, czy da się sprawdzić przy pomocy DLL injection o jakim adresie funkcja w programie jest aktualnie wykonywana, tzn zrobić np. pętle sprawdzającą i jeżeli funkcja o adresie X to w osobnym wątku wykonać jakąś akcje? Próbuję napisać bota do prostej gry sieciowej, i chciałbym jakoś przechwytywać wszystkie dane przychodzące i wychodzące od klienta, a monitorowanie Adresu Bufora to średnio dobry pomysł, bo jednak można coś przeoczyć.; może ktoś by miał jakieś wskazówki, jak pozyskać wszelakie dane o graczach itp, bo na razie to próbuje na podst. tych pakietów. Jeszcze drugie pytanie, jak przy pomocy assemblera w c++ (ASM) skopiować wartość Rejestru procesora np. EAX lub ESI do zmiennej w programie np int a; ?? czy da się przy pomocy dll injection wstrzyknąć assembler do funkcji w programie do którego dll'ka została zaaplikowana? tak, aby owy kod równierz wykonywał się podczas wykonywania funkcji?
Dziękuje za pomoc.

1

Robisz inline hooka, poprzez zapisanie jmpa do własnej funkcji w tej funkcji w której chcesz coś wykonywać. I jeśli korzystasz z MSVC to funkcje do której skaczesz możesz napisać tak:

unsigned long g_ulFuncRet = 0x1234567; // Adres rzecz jasna jest istotny, i rzecz jasna jest to adres do pamięci.
void _declspec(naked) func() // declspec(naked) jest konieczny, sprawia on, że funkcja wygląda dokładnie tak jak napisaliśmy, kompilator nie dorzuca nic od siebie. Więc jeśli z funkcji nie wyjdziesz sam, to program załapie crasha bo kompilator nie doda ci retn na koniec.
{
 _asm
 {
  // tutaj wykonujesz nadpisane instrukcje, inaczej może scrashować
  pushad // odłożymy wszystkie rejestry na stos, aby nie było żadnych zmian
  // a np. tutaj możesz sobie wycallować własną funkcje, która jest np. _cdecl, wrzucić argumenty a później wyrównać stos, np:
  push eax // powiedzmy, że wiemy, że w eaxie jest jakaś fajna wartość i chcemy ją mieć w argumencie w funkcji
  call CallenFunc
  add esp, 4 // oczywiście jak odłożyliśmy 4 bajty na stos(push eax), to należy to "zdjąć" ze stosu. Chyba, że funkcja CallenFunc będzie __stdcall (poczytaj o konwencjach wywołania)

  popad // przywrócimy rejestry ze stosu
  jmp g_ulFuncRet // wracamy do właściwego kodu oczywiście.
 }
}

void _cdecl CallenFunc(unsigned long _eax)
{
 printf("eax jest fajny = %X\n", _eax);
}

Więc w praktyce, po co chcesz tworzyć wątek? Nie lepiej w CallenFunc coś fajnego dać?

0

Dzięki! na pewno się przyda, używałem GCC, ale jednak do takich rzeczy pod Windowsem, najlepszy jest MS visual jednak, więc postanowiłem się na niego przerzucić. Ogarniam sobie również MS detours, w końcu kiedyś może napisze tego bota;;

1 użytkowników online, w tym zalogowanych: 0, gości: 1