Реферат: Вызов функции в другом процессе
{
// Такой функции нет
return NULL;
}
// Индекс это ординал минус база
funcIndex = funcOrdinal - export.Base;
}
if ((funcIndex < 0) || (funcIndex >= export.NumberOfFunctions))
{
// Такой функции нет
return NULL;
}
// Читаем адрес
DWORD funcRVA;
ReadProcessMemory(
hProcess,
baseAddress + export.AddressOfFunctions + funcIndex * sizeof(DWORD),
&funcRVA,
sizeof(funcRVA),
NULL);
// Результат это базовый адрес + RVA
return (baseAddress + funcRVA);
}
ПРИМЕЧАНИЕ
Для оптимизации можно было бы сначала скопировать в свой процесс всю секцию экспорта (размер секции хранится в IMAGE_NT_HEADERS::OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size), а потом уже её разбирать. Но, поскольку заметных глазу задержек не возникает, я остановился на текущей реализации.
Пример
В качестве примера я написал три приложения: aggressor.exe, victim.exe и insider.dll. Victim и insider абсолютно пассивны, все действия выполняются aggressor-ом. Aggressor:
запускает victim.exe;
загружает в него insider.dll;