Вызов функции через ее адрес в памяти в c / c ++ - PullRequest
26 голосов
/ 18 января 2012

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

Ответы [ 6 ]

48 голосов
/ 18 января 2012

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

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

typedef int func(void);
func* f = (func*)0xdeadbeef;
int i = f();
14 голосов
/ 18 января 2012

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

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

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

4 голосов
/ 03 ноября 2017

Когда вам нужен прямой звонок:

((void(*)(void))0x1234)();
2 голосов
/ 19 июня 2017

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

int i = ((int (*)(void))0xdeadbeef)();
1 голос
/ 18 января 2012

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

это ошибка сегментации.

0 голосов
/ 21 марта 2019

Это определенно возможно, но есть ограничения.Каждый процесс будет иметь свой собственный блок памяти, который не может мешать другим процессам.Теперь, вы заметите, я написал, что это определенно возможно, это происходит посредством внедрения DLL (или внедрения кода).

Мы можем использовать ключевое слово typedef для достижения этой цели.Теперь я вижу, что вы пометили ответ как «Отвечено», и, кажется, у вас все в порядке, это просто уведомление для всех, кого это может заинтересовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...