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; }
Jak widać, nie musiałem wywoływać funkcji fake'owej, żeby jej instrukcje zostaly wywolane. JAK taki efekt moglbym uzyskac?Kod:Wynik w konsoli: I'm a prototype function I'm a fake function


Odpowiedź z Cytatem