programing

c / c++의 메모리에 있는 주소를 통해 함수를 호출하는 중

jooyons 2023. 10. 12. 22:42
반응형

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

반응형