c / c++의 메모리에 있는 주소를 통해 함수를 호출하는 중
함수의 프로토타입과 메모리의 주소에 대한 지식을 고려할 때, 프로토타입과 메모리 주소만 아는 다른 프로세스나 코드 조각에서 이 함수를 호출하는 것이 가능합니까?만약 가능하다면, 코드에서 반품된 타입은 어떻게 처리할 수 있습니까?
현대의 운영 체제에서는 각 프로세스에 고유한 주소 공간이 있으며 주소는 프로세스 내에서만 유효합니다.다른 프로세스에서 코드를 실행하려면 공유 라이브러리를 주입하거나 프로그램을 디버거로 첨부해야 합니다.
다른 프로그램의 주소 공간에 있으면 임의의 주소에서 함수를 호출합니다.
typedef int func(void);
func* f = (func*)0xdeadbeef;
int i = f();
예 - 함수 포인터를 설명하고 있습니다.여기 간단한 예가 있습니다.
int (*func)(void) = (int (*)(void))0x12345678;
int x = func();
프로세스 간에는 작동하지 않을 수 있습니다. 대부분의 운영 체제에서는 프로세스가 서로의 메모리에 액세스할 수 없습니다.
직접 통화가 필요한 경우:
((void(*)(void))0x1234)();
이전의 모든 답변은 훌륭하지만 너무 깁니다.
int i = ((int (*)(void))0xdeadbeef)();
// ========== --> addr of the function to call
// ============= --> type of the function to call
// ========================= --> ... we get a ptr to that fct
// ============================= --> ... and we call the function
대부분의 OP에서는 모든 프로세스에 고유한 메모리가 있기 때문에 그럴 수 없습니다.
샘플 코드: 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;
}
분할 오류를 가져옵니다.
분명히 가능하지만, 제약이 있습니다.각 프로세스에는 다른 프로세스가 간섭할 수 없는 고유한 메모리 블록이 있습니다.자, 여러분은 아실 것입니다, 저는 분명히 가능하다고 썼습니다, 이것은 DLL 주입(또는 코드 주입)을 통해서입니다.
이를 위해 typedef 키워드를 사용할 수 있습니다.답변을 '답변'으로 표시해 주셨고, 상황은 괜찮으신 것 같습니다. 이는 관심 있는 다른 사람에게 공지하는 것일 뿐입니다.
언급URL : https://stackoverflow.com/questions/8915797/calling-a-function-through-its-address-in-memory-in-c-c
'programing' 카테고리의 다른 글
| MySQL - 텍스트 대 CHAR 및 VARCHAR (0) | 2023.10.12 |
|---|---|
| 스프링 부트 내장 Tomcat 로그 (0) | 2023.10.12 |
| JS 내에서 PHP를 사용하는 것은 나쁜 관행입니까? (0) | 2023.10.12 |
| Excel VBA 날짜 형식 (0) | 2023.10.12 |
| MariaDB, CONNECT 엔진 비ASC열 이름으로 II 문자 (0) | 2023.10.12 |