Czy znając prototyp funkcji i jej adres w pamięci, można wywołać tę funkcję z innego procesu lub jakiegoś fragmentu kodu, który nic nie wie, oprócz prototypu i adres pamięci? Jeśli to możliwe, w jaki sposób można zwrócić zwracany typ w kodzie?Wywołanie funkcji za pośrednictwem jej adresu w pamięci w c/C++
Odpowiedz
W nowoczesnych systemach operacyjnych każdy proces ma własną przestrzeń adresową, a adresy są ważne tylko w procesie. Jeśli chcesz wykonać kod w jakiś inny sposób, albo trzeba wstrzyknąć wspólną bibliotekę lub dołączyć swój program jako debugger.
Gdy jesteś w przestrzeni adresowej innego programu, ten kod wywołuje funkcję w dowolnym adresie:
typedef int func(void);
func* f = (func*)0xdeadbeef;
int i = f();
Dzięki @ R.Martinho dla [lepszego stylu prototypów funkcji typedef] (http://chat.stackoverflow.com/transcript/message/2400130#2400130). Nie wiedziałem nawet, że to działa! – sbi
Bardzo ładne. Ta metoda jest znacznie łatwiejsza niż użycie wbudowanego zespołu, jeśli celem jest również proces C. +1 dla ciebie. –
AFAIK, nie ma sposobu na * zapisanie * pamięci w przestrzeni adresowej innych programów w nowych systemach operacyjnych i powoduje to SEGFAULT. Ale nic nie stoi na przeszkodzie, aby program odczytywał dowolne miejsce w pamięci (stąd ten błąd jest przerażający w OpenSSL, ponieważ można w nim odczytać wszystko z pamięci). Więc, czy możesz wyjaśnić, dlaczego nie mogę uzyskać dostępu do przestrzeni adresowej innego programu i wymagać udostępnionych bibliotek lub debuggera? –
Tak - opisujesz wskaźnik funkcji. Oto prosty przykład;
int (*func)(void) = (int (*)(void))0x12345678;
int x = func();
Prawdopodobnie nie będzie działać między procesami - w większości systemów operacyjnych procesy nie mają dostępu do pamięci drugiej osoby.
W większości OP, każdy proces ma swoją własną pamięć, dzięki czemu można” t.
Przykładowy kod: A.c:
#include <stdio.h>
int r() {return 2;}
int main() {
printf("%p\n",r);
while(1);
}
b.c:
#include <stdio.h>
int main() {
int a,(*b)();
scanf("%p",&b);
a=b();
printf("%d\n",a);
return 0;
}
to uzyskać winy segmentacji.
W C++ możesz uzyskać dostęp do dowolnej lokalizacji pamięci, dla lepszego lub gorszego – dtech
@ddriver: C++ pozwala na dostęp do dowolnej lokalizacji pamięci _virtual_. Jednak wiele systemów operacyjnych nadaje każdemu procesowi własną pamięć wirtualną, dzięki czemu nie mogą one wpływać na siebie nawzajem. Istnieją wywołania specyficzne dla systemu operacyjnego, które można wykonać/wykorzystać w celu wpływania na pamięć innych procesów. –
@ddriver - nie, nie możesz. Można uzyskać dostęp tylko do lokalizacji pamięci, do których dostęp zapewnia system operacyjny. Cały twój program wie, że jest środowiskiem pamięci wirtualnej, w którym działa, co normalnie nie ma żadnego związku z rzeczywistością fizyczną. –
wszystkie poprzednie odpowiedzi są ładne, ale zbyt długo ;-):
int i = ((int (*)(void))0xdeadbeef)();
Nie, były świetne. Z drugiej strony Twoja jest bardzo słaba. Żadnego wyjaśnienia. –
To fajna jedna linijka – BullyWiiPlaza
Kiedy trzeba bezpośredniego połączenia:
((void(*)(void))0x1234)();
- 1. Wywołanie adresu C jako funkcji bez prototypu
- 2. Czy można uzyskać dostęp do zmiennej prywatnej za pośrednictwem jej adresu?
- 3. Pole formularza wstępnego za pośrednictwem adresu URL w html
- 4. Ładowanie dźwięku za pośrednictwem adresu URL Blob nie w Safari
- 5. jQuery przechodzącą wywołanie funkcji za pośrednictwem innej funkcji i kolejność wykonywania
- 6. Wysyłanie wiadomości do klienta za pośrednictwem jej socket.id
- 7. Google Geokodowanie za pośrednictwem funkcji zwrotnej HTTP?
- 8. przypisanie funkcji i wywołanie funkcji w C++?
- 9. Wywołanie funkcji javascript w iframe
- 10. JS wywołanie funkcji w Swift
- 11. Wywołanie funkcji lambda w GDB
- 12. Wywołanie funkcji w jądrze Linuksa
- 13. Wywołanie funkcji w niewłaściwej kolejności
- 14. wywołanie funkcji w łańcuchu znaków
- 15. Wywołanie funkcji w kodzie XAML?
- 16. Wywołanie adresu URL rakiety
- 17. Wskaźnik do funkcji w pamięci ROM
- 18. Wywołanie funkcji w makro Velocity szablonu
- 19. Wywołanie prywatnych funkcji za pomocą NSTimer?
- 20. C++: Wywołanie funkcji członka za pomocą wskaźnika
- 21. Wywołanie funkcji w PowerShell za pomocą ciągu znaków
- 22. Wywołanie funkcji za pomocą wątku w kodzie xcode
- 23. Wywołanie funkcji za pomocą exec zamiast wybierz
- 24. Wytnij ścieżkę folderu z adresu URL za pośrednictwem .htaccess
- 25. Jak zalogować się do Google Apps za pośrednictwem adresu URL?
- 26. Dostęp do adresu pamięci obiektów w rubin ..?
- 27. Dostęp do adresu pamięci w C#
- 28. Python, próbując uzyskać rozszerzenie pliku za pośrednictwem adresu URL
- 29. knitr: wywołanie funkcji ggplot2 w pętli nie jest drukowane, gdy towarzyszą jej niektóre inne funkcje drukowania
- 30. Wywołanie metody po stronie serwera ASP.NET za pośrednictwem jQuery
proces? lub wątek? – Cyan
W C++ nie ma procesów. Musisz określić swoją platformę, jeśli potrzebujesz pomocy. –
Z innego procesu? To bardzo szczególny przypadek. Czy naprawdę tego potrzebujesz? – jalf