Можно ли вызывать известную функцию (мы знаем тип функции, имя и аргументы) внутри программы с использованием DLL-инъекции?
Например, в моей программе есть следующая функция:
void func(string text)
{
cout << text << endl;
}
Как это вызвать из DLL?
Можно вызывать произвольную функцию, используя только прототип и ее адрес в памяти, однако вы должны иметь возможность вызывать ее в другом адресном пространстве процесса (это можно сделать, связавшись с разделяемой библиотекой или подключив отладчик).
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);
так что если вы знаете размер кода для выполнения, он выглядит максимально возможным.
Других решений пока нет …