Вызов функции из DLL

Можно ли вызывать известную функцию (мы знаем тип функции, имя и аргументы) внутри программы с использованием DLL-инъекции?

Например, в моей программе есть следующая функция:

void func(string text)
{
cout << text << endl;
}

Как это вызвать из DLL?

1

Решение

Можно вызывать произвольную функцию, используя только прототип и ее адрес в памяти, однако вы должны иметь возможность вызывать ее в другом адресном пространстве процесса (это можно сделать, связавшись с разделяемой библиотекой или подключив отладчик).

typedef int func(void);
func* f = (func*)0xabcd123;
int i = f(); // execute

Однако я попытался также скопировать код в исполняемую часть памяти и запустить его примерно так:

  char code[] = {0x55,0x48,0x89,0xe5,0x89,0x7d,0xfc,0x48,0x89,0x75,
0xf0,0xb8,0x2a,0x00,0x00,0x00,0xc9,
0xc3,0x00};    // it is just compiled: return  42
// (with prologue, etc)
void *buf;

/* copy code to executable buffer */
buf = mmap (0,sizeof(code),PROT_READ|PROT_WRITE|PROT_EXEC,
MAP_PRIVATE|MAP_ANON,-1,0);
memcpy (buf, code, sizeof(code));

/* run code */
int i = ((int (*) (void))buf)();
printf("the code returned: %d\n", i);

так что если вы знаете размер кода для выполнения, он выглядит максимально возможным.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector