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:
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:
Jak widać, nie musiałem wywoływać funkcji fake'owej, żeby jej instrukcje zostaly wywolane. JAK taki efekt moglbym uzyskac?
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?