Inline/hook function

0

Witam, chyba gdzies miesiac temu albo i pozniej zwrocilem sie z prosba do was o pomoc w stworzeniu funkcji hook'owej, ktora by po prostu zamieniala kod danej funkcji na kod wlasnej funkcji. Tej pomocy udzielił mi użytkownik MSM, do ktorego kieruje jak najwiekszy ukłon :) Operacja ta opierala sie podawaniu adresu funkcji zamienianej oraz adres tej która tą funkcję oryginalna podmieniała.

Teraz chcialbym uzyskac co nie co inny efekt, a mianowicie: gdy FUNKCJA ORYGINALNA zostanie WYWOLANA i WYKONA WLASNY KOD, to po tej czynnosci ma WYWOLAC FUNKCJĘ, która zostala pod nią przypisana. Taka metoda nazywa sie "inline hook function" albo coś w ten deseń, tyle, że z dodatkiem wlasnego kodu.

Przyklad.

void OryginalnaFunkcja()
{
      printf("Jestem oryginałem i nie dam się podrobić\n");
}

void FunkcjaDodajacaKod()
{
     printf("Jestem funkcją ktora doczepia wlasny kod do innej funkcji\n");
}

int main()
{
      HOOK_FUNCTION(OryginalnaFunkcja,FunkcjaDodajacaKod); //Szablon funkcji (dodawanie wlasnego kodu do oryginalnej funkcji)

      //Wywolanie funkcji oryginalnej
      OryginalnaFunkcja();

      cin.get();
      return 0;
}
W konsoli powinno wypisać:

Jestem oryginałem i nie dam się podrobić
Jestem funkcją ktora doczepia wlasny kod do innej funkcji

Pewnie Od razu powiecie zebym zastosowal dziedzicznosc, ale mi chodzi tu o ingerencje w obcy kod zrodlowy, do ktorego nie mam dostepu. Mam dostep, ale tylko w sposob wspolnej pamieci (Dynamic-Link Library DLL). Czyli operowanie na przestrzeni adresowej. Mam nadzieje, ze mi ktos pomoze to zrobic, dzieki :)

0

skoro potrafisz podstawić się pod jakąś funkcję oryginalną, to podstaw tam funkcję która najpierw wywołuje oryginalną a potem inny kod:

void OryginalnaFunkcja()
{
      printf("Jestem oryginałem i nie dam się podrobić\n");
}

void FunkcjaPodstawiona()
{
     oryginalna_OryginalnaFunkcja();
     printf("Jestem funkcją ktora doczepia wlasny kod do innej funkcji\n");
}

int main()
{
      HOOK_FUNCTION(OryginalnaFunkcja,FunkcjaPodstawiona);

      //Wywolanie funkcji oryginalnej
      OryginalnaFunkcja();
}
0

Nie o to chodzi. To program, ktory ma bezposredni dostep do tej funkcji (oryginalnej) wywoluje ją, niezaleznie ode mnie. Ja po prostu chce to przechwycic i w tym momencie dolozyc wlasny kod - czyli ta druga funkcja.

0

Chain of responsibility:
http://sourcemaking.com/desig[...]chain_of_responsibility/cpp/1

W Win32 API / DLL-kach robi się to bardzo podobnie:
http://www.codeproject.com/KB/DLL/keyboardhook.aspx

0

Tutaj dziedzicznosc sie odzywa, a ja w tym przypadku przeciez nie jestem w stanie tak zrobic, przynajmniej tak mi sie wydaje. Tutaj zapodam kod funkcji MSM'a, lekko przerobiony przeze mnie, by latwiej sie nim poslugiwac. Funkcja ta podmienia kod wykonywalny.

void hook(void *oryg, void *fake)
{
    char tramp[] = {0xB8, 0x00, 0x00, 0x00, 0x00, // mov eax addr (4 * 0x00 = adres funkcji podmieniajacej)
                                     0xFF, 0xE0}; // jmp eax

    DWORD addr_puts = (DWORD)oryg;
    DWORD addr_hook = (DWORD)fake;
    memcpy(tramp + 1,&addr_hook,4); //wciskanie 4 bajtowego adresu do trampoliny (spójrz wyżej, operacja ta zastępuje puste elementy 0x00)

    DWORD old;
        VirtualProtect((void*)addr_puts,7,PAGE_EXECUTE_READWRITE,&old);

        memcpy((void*)addr_puts, tramp,7);
        VirtualProtect((void*)addr_puts,7,old,&old);
}

Przyklad uzycia tej funkcji:

void OryginalnaFunkcja()
{
      printf("Jestem oryginałem i nie dam się podrobić\n");
}

void FunkcjaPodmieniajaca()
{
     printf("Zastapilem oryginalna funkcje\n");
}

int main()
{
      hook(OryginalnaFunkcja,FunkcjaPodmieniajaca);
      OryginalnaFunkcja(); //Wywolanie

      cin.get();
      return 0;
}
Wynik:

Zastapilem oryginalna funkcje

Jak widac, nastapila podmiana. Ja za to chcialbym dolaczyc kod do oryginalnej za posrednictwem drugiej funkcji (czyli to co opisalem w pierwszym poscie). Jak tego dokonac, moze uda sie komus z was przerobic powyzsza funkcje hook(.,.); ? Bardzo bym o to prosil, bo ja sam w stanie nie jestem tego zrobic.

0

Jest ktos w stanie mi w tym watku pomoc, albo ewentualnie przekierowac na forum, gdzie na tego typu sprawach sie znaja?

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