[InlineAsm] Trampolina do funkcji

qwertyx

Użytkownik
Dołączył
Grudzień 16, 2011
Posty
2
Witam, nie jestem pewien czy za pomoca assemblera (wstawka assemblerowa w c++) uzyskam taki efekt, ale wlasnie tutaj pewna osoba mnie tu przekierowala. Pewien uzytkownik pomogl mi w stworzeniu cos w tego rodzaju funkcję, tyle, że inline - czyli podmieniała kod w ten sposób, że podczas wywołania funkcji prototypowej była po prostu wywoływana funkcja FAKE'owa, zaś sam kod w prototypie nie był wywoływał.

Na przykładzie:
Kod:
void PrototypeFunction()
{
       printf("I'm a prototype function\n");
}

void FakeFunction()
{
      printf("I'm a fake function\n");
}


void HOOK_FUNCTION(void *prototype, void *fake) //Funkcja ktora ma na celu podmieniac prototypa na fake'ową funkcję
{
	char tramp[] = {0xB8, 0x00, 0x00, 0x00, 0x00, // mov eax addr
                                     0xFF, 0xE0}; // jmp eax

	DWORD addr_puts = (DWORD)prototype;
	DWORD addr_hook = (DWORD)fake;
	memcpy(tramp + 1,&addr_hook,4);

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

int main()
{
      HOOK_FUNCTION(PrototypeFunction,FakeFunction); //Nastepuje podmiana funkcji prototypowej na fake'ową

      Prototype(); //Wywolanie prototypa
      return 0;
}

Kod:
Wynik w konsoli:

"I'm a fake function





Ten temat pisze, bo chcę uzyskać co nie co inny efekt. A mianowicie. W momencie wywolania funkcji prototypowej i ukończenia jej instrukcji, chcialbym dodac na jej koniec wywolanie funkcji fake'owej. Czyli po prostu rozszerzenie funkcji prototypowej o kod funkcji fake'owej:

Przyklad:
Kod:
void PrototypeFunction()
{
       printf("I'm a prototype function\n");
}

void FakeFunction()
{
      printf("I'm a fake function\n");
}

int main()
{
      HOOK_FUNCTION(...); //Wywolanie procedury ktora mialaby na celu rozszerzyc funkcje prototypową o kod funkcji fake'owej (to jest tylko przykład)

      Prototype(); //Wywolanie prototypa
      return 0;
}


Kod:
Wynik w konsoli:

I'm a prototype function
I'm a fake function

Jak widać, nie musiałem wywoływać funkcji fake'owej, żeby jej instrukcje zostaly wywolane. JAK taki efekt moglbym uzyskac?
 

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
Funkcja prototypowa musialaby zmodyfikowac stos w taki sposob aby zamiast adresu powrotu do miejsca wywolania funkcja prototypowa wrocila do funkcji fake`owej.
 

qwertyx

Użytkownik
Dołączył
Grudzień 16, 2011
Posty
2
Teoretycznie to wiadome, ale jak w praktyce. Jak to zrobic, bo szczerze mowiac moje umiejetnosci w assemblerze są znikome. Jak tego dokonac z poziomu c++ ewentulanie wstawka assemblera? Moze ta funkcja co podalem wystarczy zmodyfikowania, dalbys rade to zrobic? Sory, że prosze o tak duzo, ale moja wiedza w tym temacie jest NULL'owa.
 
Do góry Bottom