Подтвердить что ты не робот

Вызов функции через ее адрес в памяти в c/С++

Учитывая знание прототипа функции и ее адреса в памяти, можно ли вызвать эту функцию из другого процесса или некоторого фрагмента кода, который ничего не знает, кроме прототипа и адреса памяти? Если возможно, как вернуть возвращаемый тип в код?

4b9b3361

Ответ 1

В современных операционных системах каждый процесс имеет свое собственное адресное пространство, и адреса действительны только в процессе. Если вы хотите выполнить код в каком-то другом процессе, вам нужно либо вставить общую библиотеку, либо прикрепить свою программу в качестве отладчика.

Как только вы находитесь в другом адресном пространстве программы, этот код вызывает функцию с произвольным адресом:

typedef int func(void);
func* f = (func*)0xdeadbeef;
int i = f();

Ответ 2

Да - вы описываете указатель на функцию. Вот простой пример:

int (*func)(void) = (int (*)(void))0x12345678;
int x = func();

Вероятно, он не будет работать между процессами - в большинстве операционных систем процессы не имеют доступа к каждой другой памяти.

Ответ 3

В большинстве 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;
}

это приведет к ошибке сегментации.

Ответ 4

Все предыдущие ответы хороши, но слишком долго;-):

int i = ((int (*)(void))0xdeadbeef)();

Ответ 5

Если вам нужен прямой вызов:

((void(*)(void))0x1234)();