1
0
mirror of https://github.com/rbmm/SC synced 2026-06-08 17:03:41 +00:00
Files
rbmm 85f5bb52e2 ++
2025-02-03 13:05:09 +02:00

416 lines
9.1 KiB
C++

#include "stdafx.h"
#include "resource.h"
#include "msgbox.h"
#include "../InjLfmACG/inject.h"
#define PAGE_SIZE 0x1000
#define PAGE_ALIGN(Va) ((PVOID)((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
NTSTATUS InjectToSelf(_In_ PCWSTR lpFileName, _Out_ PVOID* pImageBase);
NTSTATUS InjectScACG(
_In_ HANDLE hProcess,
_In_ PCWSTR lpFileName,
_Out_ PVOID* pImageBase,
_Out_ PBOOL StatusFromRemote);
HRESULT OnBrowse(_In_ HWND hwndDlg, _Out_ PWSTR* ppszFilePath)
{
IFileDialog* pFileOpen;
HRESULT hr = CoCreateInstance(__uuidof(FileOpenDialog), NULL, CLSCTX_ALL, IID_PPV_ARGS(&pFileOpen));
if (SUCCEEDED(hr))
{
pFileOpen->SetOptions(FOS_NOVALIDATE | FOS_NOTESTFILECREATE |
FOS_NODEREFERENCELINKS | FOS_DONTADDTORECENT | FOS_FORCESHOWHIDDEN);
static const COMDLG_FILTERSPEC rgSpec[] =
{
{ L"DLL files", L"*.DLL" }, { L"ALL files", L"*"}
};
if (0 <= (hr = pFileOpen->SetFileTypes(_countof(rgSpec), rgSpec)) &&
0 <= (hr = pFileOpen->SetFileTypeIndex(1)) &&
0 <= (hr = pFileOpen->Show(hwndDlg)))
{
IShellItem* pItem;
hr = pFileOpen->GetResult(&pItem);
if (SUCCEEDED(hr))
{
hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, ppszFilePath);
pItem->Release();
}
}
pFileOpen->Release();
}
return hr;
}
HRESULT OnBrowse(HWND hwndDlg, UINT nIDDlgItem)
{
PWSTR pszFilePath;
HRESULT hr = OnBrowse(hwndDlg, &pszFilePath);
if (S_OK == hr)
{
SetDlgItemTextW(hwndDlg, nIDDlgItem, pszFilePath);
CoTaskMemFree(pszFilePath);
}
return hr;
}
CHAR GetWow(SYSTEM_EXTENDED_THREAD_INFORMATION Threads[], ULONG NumberOfThreads)
{
if (NumberOfThreads)
{
PCLIENT_ID ClientId = &Threads->ClientId;
PVOID pv = 0;
do
{
PVOID Win32StartAddress = Threads++->Win32StartAddress;
if (pv < Win32StartAddress)
{
pv = Win32StartAddress;
}
} while (--NumberOfThreads);
if ((ULONG_PTR)pv < MAXLONG)
{
if (!pv)
{
return '#';
}
ClientId->UniqueThread = 0;
HANDLE hProcess;
OBJECT_ATTRIBUTES oa = { sizeof(oa) };
if (0 <= NtOpenProcess(&hProcess, PROCESS_QUERY_LIMITED_INFORMATION, &oa, ClientId))
{
PROCESS_EXTENDED_BASIC_INFORMATION ebi = {};
NTSTATUS status = NtQueryInformationProcess(hProcess, ProcessBasicInformation, &ebi, sizeof(ebi), 0);
NtClose(hProcess);
if (0 <= status)
{
if (!ebi.IsProtectedProcess && !ebi.IsFrozen && !ebi.IsProcessDeleting)
{
return ebi.IsWow64Process ? '*' : ' ';
}
}
}
return '#';
}
return ' ';
}
return '#';
}
void MakeProcessList(HWND hwnd)
{
ComboBox_ResetContent(hwnd);
ULONG cb = 0x80000;
NTSTATUS status;
do
{
status = STATUS_NO_MEMORY;
if (PVOID buf = LocalAlloc(0, cb += 0x1000))
{
if (0 <= (status = ZwQuerySystemInformation(SystemExtendedProcessInformation, buf, cb, &cb)))
{
union {
PVOID pv;
PBYTE pb;
PSYSTEM_PROCESS_INFORMATION pspi;
};
pv = buf;
ULONG NextEntryOffset = 0;
WCHAR sz[0x100];
struct PROCESS_MITIGATION {
PROCESS_MITIGATION_POLICY Policy;
union {
PROCESS_MITIGATION_DYNAMIC_CODE_POLICY dcp;
};
};
PROCESS_MITIGATION m = { ProcessDynamicCodePolicy };
do
{
pb += NextEntryOffset;
if (pspi->UniqueProcessId)
{
CHAR ProhibitDynamicCode = ' ';
if (HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, 0, (ULONG)(ULONG_PTR)pspi->UniqueProcessId))
{
if (0 <= NtQueryInformationProcess(hProcess, ProcessMitigationPolicy, &m, sizeof(m), 0))
{
ProhibitDynamicCode = m.dcp.ProhibitDynamicCode ? '!' : ' ';
}
NtClose(hProcess);
}
if (0 < swprintf_s(sz, _countof(sz),
L"%4x(%4x) %2x %3x %c %c %wZ",
(ULONG)(ULONG_PTR)pspi->UniqueProcessId,
(ULONG)(ULONG_PTR)pspi->InheritedFromUniqueProcessId,
pspi->SessionId,
pspi->NumberOfThreads,
GetWow(pspi->Threads, pspi->NumberOfThreads),
ProhibitDynamicCode,
&pspi->ImageName))
{
int i = ComboBox_AddString(hwnd, sz);
if (0 <= i)
{
ComboBox_SetItemData(hwnd, i, pspi->UniqueProcessId);
}
}
}
} while (NextEntryOffset = pspi->NextEntryOffset);
}
LocalFree(buf);
}
} while (status == STATUS_INFO_LENGTH_MISMATCH);
}
struct __declspec(uuid("178167bc-4ee3-403e-8430-a6434162db17")) WebPlatStorageCom;
struct __declspec(uuid("0d67d0a5-4736-4a43-b642-e77f2105b3e2")) IWebPlatStorageCom : public IUnknown
{
virtual HRESULT STDAPICALLTYPE GetRPCEndpoint(PWSTR*) = 0;
};
void StartWebPlat(HWND hwnd)
{
HRESULT hr;
IWebPlatStorageCom* pWebCom;
if (0 <= (hr = CoCreateInstance(__uuidof(WebPlatStorageCom), 0,
CLSCTX_LOCAL_SERVER | CLSCTX_ENABLE_AAA, IID_PPV_ARGS(&pWebCom))))
{
PWSTR psz;
if (0 <= pWebCom->GetRPCEndpoint(&psz))
{
CustomMessageBox(hwnd, psz, L"WebPlatStorage", MB_ICONINFORMATION);
CoTaskMemFree(psz);
}
pWebCom->Release();
}
}
void ShowResult(HWND hwnd, NTSTATUS status, void* hmod, BOOL bRemote = FALSE)
{
if (status)
{
ShowErrorBox(hwnd, status, bRemote ? L"Remote" : L"Local");
}
else
{
WCHAR sz[64];
if (bRemote)
{
swprintf_s(sz, _countof(sz), L"base=%p", hmod);
CustomMessageBox(hwnd, sz, L"Remote Load !", MB_ICONINFORMATION);
}
else
{
PLDR_DATA_TABLE_ENTRY ldte;
if (0 <= LdrFindEntryForAddress(hmod, &ldte))
{
swprintf_s(sz, _countof(sz), L"base=%p size=%x", hmod, ldte->SizeOfImage);
CustomMessageBox(hwnd, ldte->FullDllName.Buffer, sz, MB_ICONINFORMATION);
}
}
}
}
VOID load(HWND hwnd, HWND hwndEdit)
{
if (ULONG len = GetWindowTextLengthW(hwndEdit))
{
NTSTATUS status = STATUS_NO_MEMORY;
void* hmod = 0;
if (PWSTR psz = new WCHAR[++len])
{
if (GetWindowTextW(hwndEdit, psz, len))
{
if (BST_CHECKED == SendDlgItemMessageW(hwnd, IDC_CHECK1, BM_GETCHECK, 0, 0))
{
status = InjectToSelf(psz, &hmod);
}
else
{
status = STATUS_INVALID_CID;
int i = (int)SendDlgItemMessageW(hwnd, IDC_COMBO1, CB_GETCURSEL, 0, 0);
if (0 <= i)
{
CLIENT_ID cid{};
if (cid.UniqueProcess = (HANDLE)SendDlgItemMessageW(hwnd, IDC_COMBO1, CB_GETITEMDATA, i, 0))
{
HANDLE hProcess;
OBJECT_ATTRIBUTES oa = { sizeof(oa) };
if (0 <= (status = NtOpenProcess(&hProcess, PROCESS_ALL_ACCESS, &oa, &cid)))
{
PROCESS_EXTENDED_BASIC_INFORMATION ebi = {};
if (0 <= (status = NtQueryInformationProcess(hProcess, ProcessBasicInformation, &ebi, sizeof(ebi), 0)))
{
if (ebi.IsFrozen || ebi.IsProcessDeleting)
{
status = STATUS_PROCESS_IS_TERMINATING;
}
else if (
#ifdef _WIN64
!
#endif // _WIN64
ebi.IsWow64Process)
{
BOOL StatusFromRemote = FALSE;
status = InjectScACG(hProcess, psz, &hmod, &StatusFromRemote);
ShowResult(hwnd, status, hmod, StatusFromRemote);
if (hmod && !status)
{
RemoteUnloadDll(hProcess, hmod);
}
len = 0;
}
else
{
status = STATUS_IMAGE_MACHINE_TYPE_MISMATCH;
}
}
NtClose(hProcess);
}
}
}
}
}
delete[] psz;
}
if (len)
{
ShowResult(hwnd, status, hmod);
if (0 <= status)
{
LdrUnloadDll(hmod);
}
}
}
}
void OnInitDialog(HWND hwnd)
{
HICON hi;
if (0 <= LoadIconWithScaleDown((HINSTANCE) & __ImageBase, MAKEINTRESOURCEW(1),
GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), &hi))
{
SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hi);
}
SendDlgItemMessageW(hwnd, IDC_CHECK1, BM_SETCHECK, BST_CHECKED, 0);
NONCLIENTMETRICS ncm = { sizeof(NONCLIENTMETRICS) };
if (SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0))
{
ncm.lfStatusFont.lfQuality = CLEARTYPE_QUALITY;
ncm.lfStatusFont.lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
wcscpy(ncm.lfStatusFont.lfFaceName, L"Courier New");
if (HFONT hFont = CreateFontIndirect(&ncm.lfStatusFont))
{
SendDlgItemMessageW(hwnd, IDC_COMBO1, WM_SETFONT, (WPARAM)hFont, 0);
}
}
}
INT_PTR CALLBACK DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_COMMAND:
switch (wParam)
{
case IDOK:
load(hwnd, GetDlgItem(hwnd, IDC_EDIT1));
break;
case IDCANCEL:
EndDialog(hwnd, lParam);
break;
case MAKEWPARAM(IDC_BUTTON1, BN_CLICKED):
OnBrowse(hwnd, IDC_EDIT1);
break;
case MAKEWPARAM(IDC_CHECK1, BN_CLICKED):
EnableWindow(GetDlgItem(hwnd, IDC_COMBO1), BST_UNCHECKED == SendMessageW((HWND)lParam, BM_GETCHECK, 0, 0));
break;
case MAKEWPARAM(IDC_COMBO1, CBN_DROPDOWN):
MakeProcessList((HWND)lParam);
break;
}
break;
case WM_NOTIFY:
if (IDC_SYSLINK1 == wParam)
{
PNMLINK p = (PNMLINK)reinterpret_cast<PNMLINK>(lParam);
switch (p->hdr.code)
{
case NM_CLICK:
SetFocus(0);
StartWebPlat(hwnd);
break;
}
}
break;
case WM_INITDIALOG:
OnInitDialog(hwnd);
break;
}
return 0;
}
void ep(void*)
{
BOOLEAN b;
RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE, TRUE, FALSE, &b);
if (0 <= CoInitializeEx(0, COINIT_APARTMENTTHREADED|COINIT_DISABLE_OLE1DDE))
{
DialogBoxParamW((HINSTANCE)&__ImageBase, MAKEINTRESOURCEW(IDD_DIALOG1), 0, DlgProc, 0);
CoUninitialize();
}
ExitProcess(0);
}