Подведи собственные итоги года совместно с YOUGAME и забери ценные призы! Перейти

[C++] Удаленный вызов функции

Эксперт
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
994
Реакции
1,209
Код:
Expand Collapse Copy
/*прототип функции*/
typedef int (WINAPI* MessageBoxAFn)(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption, UINT uType);

/*параметры для передачи*/
struct data_t
{
    uintptr_t uAddress;
    char szMessage[128];
    char szTitl[128];
};


/*Функцияф для удаленного вызова */
DWORD WINAPI MyFunction(LPVOID lpParam)
{
    auto pData = reinterpret_cast<data_t*>(lpParam);
    auto oMessageBoxA = reinterpret_cast<MessageBoxAFn>(pData->uAddress);
    oMessageBoxA(nullptr, pData->szMessage, pData->szTitl, MB_OK);
    return 0;
}

bool testRemote(HANDLE hProc)
{

    if (!hProc || hProc == INVALID_HANDLE_VALUE)
    {
        printf_s("Error:: Hahdle acsess");
        return false;
    }

    auto pData = std::make_unique<data_t>();
    auto hUser32 = ::LoadLibraryA("User32.dll");

    if (!hUser32)
    {  
        printf_s("Error:: Found handle module");
            return false;
    }

    pData->uAddress = reinterpret_cast<uintptr_t>(GetProcAddress(hUser32, "MessageBoxA"));


    if (!pData->uAddress)
    {
        printf_s("Error:: Get adress");
        return false;
    }

    //заполняем структуру
    strcpy_s(pData->szMessage, "Status::Отлично!");
    strcpy_s(pData->szTitl, "Test::Call");


    /*выделяем память*/
    auto pShellcode = VirtualAllocEx(hProc, 0, 50, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    auto pDataAddress = VirtualAllocEx(hProc, 0, sizeof(*pData.get()), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);

    /*записываем данные*/
    WriteProcessMemory(hProc, pShellcode, &MyFunction, 50, nullptr);
    WriteProcessMemory(hProc, pDataAddress, pData.get(), sizeof(*pData.get()), nullptr);
    /*создаем тред в контексте удаленного процесса*/
    auto hThread = CreateRemoteThread(hProc, nullptr, 0, (LPTHREAD_START_ROUTINE)pShellcode, pDataAddress, 0, nullptr);
   
    /*ожидаем завершения*/
    WaitForSingleObject(hThread, INFINITE);
    /*"обнуляем" выделенную память*/
    VirtualFreeEx(hProc, pDataAddress, 0, MEM_RELEASE);
    VirtualFreeEx(hProc, pShellcode, 0, MEM_RELEASE);

    /*закрываем хендл*/
    CloseHandle(hThread);


    return true;
}

передаем дескриптор нужного процесса функции: testRemote
 
или воспользоваться ntdll!RtlRemoteCall
 
Назад
Сверху Снизу