You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
286 lines
6.0 KiB
286 lines
6.0 KiB
#include <windows.h>
|
|
#include <winioctl.h>
|
|
#include <stdio.h>
|
|
#include <malloc.h>
|
|
#include <Shlwapi.h>
|
|
|
|
#include <ntddsac.h>
|
|
|
|
#include <sacapi.h>
|
|
|
|
typedef struct _BYTEWISE_UUID {
|
|
|
|
ULONG a;
|
|
USHORT b;
|
|
USHORT c;
|
|
UCHAR e[8];
|
|
|
|
} BYTEWISE_UUID, *PBYTEWISE_UUID;
|
|
|
|
|
|
int htoi(
|
|
char *c
|
|
)
|
|
{
|
|
unsigned int result;
|
|
|
|
(void) sscanf( (char *) c, "%x", &result );
|
|
|
|
return result;
|
|
}
|
|
|
|
ULONG
|
|
AtoGUID(
|
|
IN WCHAR *s,
|
|
OUT GUID *g
|
|
)
|
|
/*
|
|
|
|
Description:
|
|
|
|
translate the given string representation of a GUID into a real GUID.
|
|
|
|
expected string format:
|
|
|
|
37a9b260-525d-11d6-870c-806d6172696f
|
|
|
|
Args:
|
|
|
|
s - the string to translate
|
|
g - on success, the returned guid
|
|
|
|
Return:
|
|
|
|
1 - success
|
|
0 - true
|
|
|
|
*/
|
|
{
|
|
ULONG l;
|
|
PBYTEWISE_UUID p;
|
|
ULONG x;
|
|
ULONG y;
|
|
|
|
l = wcslen(s);
|
|
|
|
if (l != (16*2 + 4)) {
|
|
return 0;
|
|
}
|
|
|
|
p = (PBYTEWISE_UUID)g;
|
|
|
|
x = 0;
|
|
y = 0;
|
|
|
|
RtlZeroMemory(p, sizeof(BYTEWISE_UUID));
|
|
|
|
p->a |= htoi((char *)&s[y++]) << 28;
|
|
p->a |= htoi((char *)&s[y++]) << 24;
|
|
|
|
p->a |= htoi((char *)&s[y++]) << 20;
|
|
p->a |= htoi((char *)&s[y++]) << 16;
|
|
|
|
p->a |= htoi((char *)&s[y++]) << 12;
|
|
p->a |= htoi((char *)&s[y++]) << 8;
|
|
|
|
p->a |= htoi((char *)&s[y++]) << 4;
|
|
p->a |= htoi((char *)&s[y++]) << 0;
|
|
|
|
// skip -
|
|
y++;
|
|
|
|
p->b |= htoi((char *)&s[y++]) << 12;
|
|
p->b |= htoi((char *)&s[y++]) << 8;
|
|
|
|
p->b |= htoi((char *)&s[y++]) << 4;
|
|
p->b |= htoi((char *)&s[y++]) << 0;
|
|
|
|
// skip -
|
|
y++;
|
|
|
|
p->c |= htoi((char *)&s[y++]) << 12;
|
|
p->c |= htoi((char *)&s[y++]) << 8;
|
|
|
|
p->c |= htoi((char *)&s[y++]) << 4;
|
|
p->c |= htoi((char *)&s[y++]) << 0;
|
|
|
|
// skip -
|
|
y++;
|
|
x = 0;
|
|
|
|
p->e[x] |= htoi((char *)&s[y++]) << 4;
|
|
p->e[x] |= htoi((char *)&s[y++]) << 0; x++;
|
|
|
|
p->e[x] |= htoi((char *)&s[y++]) << 4;
|
|
p->e[x] |= htoi((char *)&s[y++]) << 0; x++;
|
|
|
|
// skip -
|
|
y++;
|
|
|
|
p->e[x] |= htoi((char *)&s[y++]) << 4;
|
|
p->e[x] |= htoi((char *)&s[y++]) << 0; x++;
|
|
|
|
p->e[x] |= htoi((char *)&s[y++]) << 4;
|
|
p->e[x] |= htoi((char *)&s[y++]) << 0; x++;
|
|
|
|
p->e[x] |= htoi((char *)&s[y++]) << 4;
|
|
p->e[x] |= htoi((char *)&s[y++]) << 0; x++;
|
|
|
|
p->e[x] |= htoi((char *)&s[y++]) << 4;
|
|
p->e[x] |= htoi((char *)&s[y++]) << 0; x++;
|
|
|
|
p->e[x] |= htoi((char *)&s[y++]) << 4;
|
|
p->e[x] |= htoi((char *)&s[y++]) << 0; x++;
|
|
|
|
p->e[x] |= htoi((char *)&s[y++]) << 4;
|
|
p->e[x] |= htoi((char *)&s[y++]) << 0; x++;
|
|
|
|
//
|
|
|
|
wprintf(L"s = %s, g = %06x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\r\n",
|
|
s,
|
|
p->a,
|
|
p->b,
|
|
p->c,
|
|
p->e[0],
|
|
p->e[1],
|
|
p->e[2],
|
|
p->e[3],
|
|
p->e[4],
|
|
p->e[5],
|
|
p->e[6],
|
|
p->e[7]
|
|
);
|
|
|
|
return 1;
|
|
}
|
|
|
|
int _cdecl wmain(int argc, WCHAR **argv)
|
|
{
|
|
SAC_CHANNEL_OPEN_ATTRIBUTES Attributes;
|
|
SAC_CHANNEL_HANDLE SacChannelHandle;
|
|
int c;
|
|
|
|
//
|
|
// Configure the new channel
|
|
//
|
|
RtlZeroMemory(&Attributes, sizeof(SAC_CHANNEL_OPEN_ATTRIBUTES));
|
|
|
|
Attributes.Type = ChannelTypeVTUTF8;
|
|
|
|
wnsprintf(
|
|
Attributes.Name,
|
|
SAC_MAX_CHANNEL_NAME_LENGTH+1,
|
|
L"Spoofer"
|
|
);
|
|
wnsprintf(
|
|
Attributes.Description,
|
|
SAC_MAX_CHANNEL_DESCRIPTION_LENGTH+1,
|
|
L"Spoofer"
|
|
);
|
|
Attributes.Flags = 0;
|
|
Attributes.CloseEvent = NULL;
|
|
Attributes.HasNewDataEvent = NULL;
|
|
|
|
//
|
|
// Open the Hello channel
|
|
//
|
|
if (SacChannelOpen(
|
|
&SacChannelHandle,
|
|
&Attributes
|
|
)) {
|
|
printf("Successfully opened new channel\n");
|
|
} else {
|
|
printf("Failed to open new channel\n");
|
|
goto cleanup;
|
|
}
|
|
|
|
//
|
|
// tweak the sac channel handle to have the guid we specified at the
|
|
// command prompt
|
|
//
|
|
printf("driverhandle = %p\r\n", SacChannelHandle.DriverHandle);
|
|
{
|
|
ULONG x;
|
|
PBYTEWISE_UUID p;
|
|
|
|
p = (PBYTEWISE_UUID)&(SacChannelHandle.ChannelHandle);
|
|
|
|
wprintf(L"g = %06x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\r\n",
|
|
p->a,
|
|
p->b,
|
|
p->c,
|
|
p->e[0],
|
|
p->e[1],
|
|
p->e[2],
|
|
p->e[3],
|
|
p->e[4],
|
|
p->e[5],
|
|
p->e[6],
|
|
p->e[7]
|
|
);
|
|
|
|
}
|
|
|
|
AtoGUID(argv[1], &(SacChannelHandle.ChannelHandle));
|
|
|
|
printf("driverhandle = %p\r\n", SacChannelHandle.DriverHandle);
|
|
{
|
|
ULONG x;
|
|
PBYTEWISE_UUID p;
|
|
|
|
p = (PBYTEWISE_UUID)&(SacChannelHandle.ChannelHandle);
|
|
|
|
wprintf(L"g = %06x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\r\n",
|
|
p->a,
|
|
p->b,
|
|
p->c,
|
|
p->e[0],
|
|
p->e[1],
|
|
p->e[2],
|
|
p->e[3],
|
|
p->e[4],
|
|
p->e[5],
|
|
p->e[6],
|
|
p->e[7]
|
|
);
|
|
|
|
}
|
|
|
|
//
|
|
// Write to the Hello Channel
|
|
//
|
|
{
|
|
PWCHAR String = L"Hello, World!\r\n";
|
|
|
|
if (SacChannelVTUTF8WriteString(
|
|
SacChannelHandle,
|
|
String
|
|
)) {
|
|
printf("Successfully printed string to channel\n");
|
|
} else {
|
|
printf("Failed to print string to channel\n");
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
// Wait for user input
|
|
//
|
|
getc(stdin);
|
|
|
|
//
|
|
// Close the Hello Channel
|
|
//
|
|
if (SacChannelClose(&SacChannelHandle)) {
|
|
printf("Successfully closed channel\n");
|
|
} else {
|
|
printf("Failed to close channel\n");
|
|
}
|
|
|
|
cleanup:
|
|
|
|
return 0;
|
|
|
|
}
|
|
|