mimikatz/modules/kull_m_pipe.c

118 lines
3.1 KiB
C

/* Benjamin DELPY `gentilkiwi`
https://blog.gentilkiwi.com
benjamin@gentilkiwi.com
Licence : https://creativecommons.org/licenses/by/4.0/
*/
#include "kull_m_pipe.h"
BOOL kull_m_pipe_server(LPCWCHAR pipeName, HANDLE *phPipe)
{
BOOL status = FALSE;
*phPipe = CreateNamedPipe(pipeName, PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, 1, 0, 0, NMPWAIT_USE_DEFAULT_WAIT, NULL);
if(!(status = (*phPipe && (*phPipe != INVALID_HANDLE_VALUE))))
PRINT_ERROR_AUTO(L"CreateNamedPipe");
return status;
}
BOOL kull_m_pipe_server_connect(HANDLE hPipe)
{
BOOL status = FALSE;
if(!(status = (ConnectNamedPipe(hPipe, NULL) || (GetLastError() == ERROR_PIPE_CONNECTED))))
PRINT_ERROR_AUTO(L"ConnectNamedPipe");
return status;
}
BOOL kull_m_pipe_client(LPCWCHAR pipeName, PHANDLE phPipe)
{
BOOL status = FALSE;
DWORD dwMode = PIPE_READMODE_MESSAGE | PIPE_WAIT;
if(WaitNamedPipe(pipeName, NMPWAIT_USE_DEFAULT_WAIT))
{
*phPipe = CreateFile(pipeName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if(*phPipe && (*phPipe != INVALID_HANDLE_VALUE))
{
if(!(status = SetNamedPipeHandleState(*phPipe, &dwMode, NULL, NULL)))
PRINT_ERROR_AUTO(L"SetNamedPipeHandleState");
}
else PRINT_ERROR_AUTO(L"CreateFile");
}
else PRINT_ERROR_AUTO(L"WaitNamedPipe");
return status;
}
BOOL kull_m_pipe_read(HANDLE hPipe, LPBYTE *buffer, DWORD *size)
{
BOOL status = FALSE;
DWORD szReaded, szBuffer = 0;
BYTE * tmpBuffer = NULL; DWORD szTmpBuffer = 0;
*size = 0;
*buffer = NULL;
do
{
if(*buffer)
{
tmpBuffer = *buffer;
szTmpBuffer = szBuffer;
}
szBuffer += 2048;
if(*buffer = (BYTE *) LocalAlloc(LPTR, szBuffer))
{
if(tmpBuffer)
{
RtlCopyMemory(*buffer, tmpBuffer, szTmpBuffer);
tmpBuffer = (BYTE *) LocalFree(tmpBuffer);
}
if(status = ReadFile(hPipe, *buffer + szTmpBuffer, 2048, &szReaded, NULL))
{
*size = szTmpBuffer + szReaded;
break;
}
}
} while(GetLastError() == ERROR_MORE_DATA);
if(!status)
{
PRINT_ERROR_AUTO(L"ReadFile");
*buffer = (BYTE *) LocalFree(*buffer);
*size = 0;
}
return status;
}
BOOL kull_m_pipe_write(HANDLE hPipe, LPCVOID buffer, DWORD size)
{
BOOL status = FALSE;
DWORD nbWritten;
if(WriteFile(hPipe, buffer, size, &nbWritten, NULL) && (size == nbWritten))
{
if(!(status = FlushFileBuffers(hPipe)))
PRINT_ERROR_AUTO(L"FlushFileBuffers");
}
else PRINT_ERROR_AUTO(L"WriteFile");
return status;
}
BOOL kull_m_pipe_close(PHANDLE phPipe)
{
BOOL status = FALSE;
DWORD flags = 0;
if(*phPipe && (*phPipe != INVALID_HANDLE_VALUE))
{
if(GetNamedPipeInfo(*phPipe, &flags, NULL, NULL, NULL) || (GetLastError() == ERROR_PIPE_NOT_CONNECTED))
{
if(flags & PIPE_SERVER_END)
{
if(!DisconnectNamedPipe(*phPipe))
PRINT_ERROR_AUTO(L"DisconnectNamedPipe");
}
if(status = CloseHandle(*phPipe))
*phPipe = INVALID_HANDLE_VALUE;
else PRINT_ERROR_AUTO(L"CloseHandle");
}
else PRINT_ERROR_AUTO(L"GetNamedPipeInfo");
}
return status;
}