Эксперт
- Статус
- Оффлайн
- Регистрация
- 12 Июн 2014
- Сообщения
- 994
- Реакции
- 1,209
Код:
/*прототип функции*/
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