Вопрос Как найти адрес нужной функции из dll в удаленном процессе


yum

Пользователь
Форумчанин
Регистрация
30.11.2023
Сообщения
47
Репутация
5
Как я могу получить адрес функции из длл , которая импортирована в удаленном процессе.
Я вот так получаю саму dll

C++:
HMODULE GetDllModule(HANDLE hProcess)
{
    HMODULE hMods[1024];
    DWORD cbNeeded;
    unsigned int i;

    if (EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
    {
        for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
        {
            TCHAR szModName[MAX_PATH];
 
            if (GetModuleBaseNameW(hProcess, hMods[i], szModName,
                sizeof(szModName) / sizeof(TCHAR)))
            {
                if (wcscmp(szModName, L"name.dll") == 0) {
                    return hMods[i];
                }
            }
        }
    }

    DWORD dwError = GetLastError();
    printf("[!] EnumProcessModules failed with error code %d\n", dwError);

    return NULL;
}

Зная имя функции в этой длл, и имея дескриптор длл из удаленного процесса, как я могу получить адрес этой функции удаленного процесса
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 085
Репутация
8 208
Зная имя функции в этой длл, и имея дескриптор длл из удаленного процесса, как я могу получить адрес этой функции удаленного процесса
Нужно получить смещение, относительно базового адреса.

Вот базовый адрес длл ты нашел GetDllModule.

А вот со смещением, тут сложнее, по идеи есть функция GetProcAddress которая как-раз находит смещение относительно базового адреса (Это как-раз адрес функции).

Но т.к. происходит работа удаленного процесса, пока могу только предложить такой костыль:

Сначала используй GetProcAddress с локально загруженной копией DLL, чтобы получить относительный адрес функции внутри модуля. Это даст смещение функции от начала модуля.
Затем прибавь это смещение к базовому адресу модуля в удалённом процессе, который получился ранее. Это даст абсолютный адрес функции в контексте удалённого процесса.

Вот наверное что-то такое:

C:
FARPROC GetRemoteProcAddress(HMODULE hRemoteModule, LPCSTR lpProcName) {
    HMODULE hLocalModule = LoadLibrary(TEXT("name.dll")); // Получение базового адреса нужной длл, в текущем процессе
    FARPROC lpLocalFunc = GetProcAddress(hLocalModule, lpProcName); //Получение смещения до нужной функции в текущем процессе
    FARPROC lpRemoteFunc = (FARPROC)((LPBYTE)hRemoteModule + ((LPBYTE)lpLocalFunc - (LPBYTE)hLocalModule)); //Получение адреса функции в удаленном процессе
    FreeLibrary(hLocalModule);
    return lpRemoteFunc;
}

Параметры:
  1. HMODULE hRemoteModule: Это базовый адрес модуля (DLL) в памяти удалённого процесса, этот адрес можно получить с помощью функции GetDllModule.
  2. LPCSTR lpProcName: Это имя функции, адрес которой нужно найти в модуле.
 

yum

Пользователь
Форумчанин
Регистрация
30.11.2023
Сообщения
47
Репутация
5
Нужно получить смещение, относительно базового адреса.

Вот базовый адрес длл ты нашел GetDllModule.

А вот со смещением, тут сложнее, по идеи есть функция GetProcAddress которая как-раз находит смещение относительно базового адреса (Это как-раз адрес функции).

Но т.к. происходит работа удаленного процесса, пока могу только предложить такой костыль:

Сначала используй GetProcAddress с локально загруженной копией DLL, чтобы получить относительный адрес функции внутри модуля. Это даст смещение функции от начала модуля.
Затем прибавь это смещение к базовому адресу модуля в удалённом процессе, который получился ранее. Это даст абсолютный адрес функции в контексте удалённого процесса.

Вот наверное что-то такое:

C:
FARPROC GetRemoteProcAddress(HMODULE hRemoteModule, LPCSTR lpProcName) {
    HMODULE hLocalModule = LoadLibrary(TEXT("name.dll")); // Получение базового адреса нужной длл, в текущем процессе
    FARPROC lpLocalFunc = GetProcAddress(hLocalModule, lpProcName); //Получение смещения до нужной функции в текущем процессе
    FARPROC lpRemoteFunc = (FARPROC)((LPBYTE)hRemoteModule + ((LPBYTE)lpLocalFunc - (LPBYTE)hLocalModule)); //Получение адреса функции в удаленном процессе
    FreeLibrary(hLocalModule);
    return lpRemoteFunc;
}

Параметры:
  1. HMODULE hRemoteModule: Это базовый адрес модуля (DLL) в памяти удалённого процесса, этот адрес можно получить с помощью функции GetDllModule.
  2. LPCSTR lpProcName: Это имя функции, адрес которой нужно найти в модуле.
Оооо точно, можно так сделать , спасибо
 
Верх Низ