MMKCMM Pspsps

#include <windows.h>
#include <stdio.h>

#define CrtInitializeConsoleIo freopen_s
#define CrtBufferIo __acrt_iob_func
#define STANDARD_INPUT 0
#define STANDARD_OUTPUT 1
#define STANDARD_ERROR 2

#define EMBEDDED_BINARY_CORRUPT 0

typedef struct __IMAGE_FILE_BLOCK {
    HANDLE Handle = INVALID_HANDLE_VALUE;
    WCHAR FilePath[MAX_PATH * sizeof(WCHAR)] = { 0 };
    PBYTE RawData = NULL;
    LONGLONG FileSize = 0;
    BOOL bIsInitialized;
}IMAGE_FILE_BLOCK, * PIMAGE_FILE_BLOCK;

PWCHAR StringCopyW(_Inout_ PWCHAR String1, _In_ LPCWSTR String2)
{
    PWCHAR p = String1;

    while ((*p++ = *String2++) != 0);

    return String1;
}

BOOL CrtCreateConsoleIo(VOID)
{
    FILE* FilePointer = NULL;
    BOOL bFlag = FALSE;

    if (!AllocConsole())
    {
        MessageBoxA(NULL, "Fatal error: Unable to create output console", "Fatal Error", MB_OK);
        return FALSE;
    }

    if (CrtInitializeConsoleIo(&FilePointer, "CONIN$", "r", CrtBufferIo(STANDARD_INPUT)) != ERROR_SUCCESS)
        goto EXIT_ROUTINE;

    if (CrtInitializeConsoleIo(&FilePointer, "CONOUT$", "w", CrtBufferIo(STANDARD_OUTPUT)) != ERROR_SUCCESS)
        goto EXIT_ROUTINE;

    if (CrtInitializeConsoleIo(&FilePointer, "CONOUT$", "w", CrtBufferIo(STANDARD_ERROR)) != ERROR_SUCCESS)
        goto EXIT_ROUTINE;

    bFlag = TRUE;

EXIT_ROUTINE:

    if (!bFlag)
        MessageBoxA(NULL, "Fatal error: Unable to set STDIO", "Fatal Error", MB_OK);

    return bFlag;
}

BOOL InitializeFileBlock(PIMAGE_FILE_BLOCK File, PWCHAR FilePath)
{
    LARGE_INTEGER LargeInteger = { 0 };
    DWORD BytesRead = 0;

    File->Handle = CreateFileW(FilePath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (File->Handle == INVALID_HANDLE_VALUE)
        return FALSE;
    else
        File->bIsInitialized = TRUE;

    if (StringCopyW(File->FilePath, FilePath) == NULL)
        return FALSE;

    if (!GetFileSizeEx(File->Handle, &LargeInteger))
        return FALSE;
    else
        File->FileSize = LargeInteger.QuadPart;

    File->RawData = (PBYTE)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, File->FileSize);
    if (File->RawData == NULL)
        return FALSE;

#pragma warning( push )
#pragma warning( disable : 4244)
    if (!ReadFile(File->Handle, File->RawData, File->FileSize, &BytesRead, NULL))
        return FALSE;
#pragma warning( pop )

    return TRUE;
}

VOID FreeFileBlock(PIMAGE_FILE_BLOCK File)
{
    if (File->Handle)
        CloseHandle(File->Handle);

    if (File->RawData)
        HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, File->RawData);
}

LONGLONG GetEmbeddedPayloadSize(PBYTE PixelData, LONGLONG BitmapPixelDataSize)
{
    LONGLONG uSize = 0;

    for (INT i = 0; i < 32; i++)
    {
        uSize <<= 1;
        uSize |= (PixelData[i] & 1);
    }

    if (uSize * 8 + 32 > BitmapPixelDataSize)
        return EMBEDDED_BINARY_CORRUPT;

    return uSize;
}

VOID GetEmbeddedPayload(PBYTE PixelData, DWORD Size, PBYTE Payload)
{
    BYTE Bit = 0;

    for (DWORD i = 0; i < Size * 8; i++)
    {
        Bit = PixelData[i + 32] & 1;
        Payload[i / 8] |= (Bit << (7 - (i % 8)));
    }
}

BOOL CreatePayloadFromEmbeddedImage(PWCHAR FilePath, PBYTE Data, LONGLONG BinarySize)
{
    HANDLE hHandle = INVALID_HANDLE_VALUE;
    DWORD BytesWritten = 0;

    BOOL bFlag = FALSE;

    hHandle = CreateFileW(FilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hHandle == INVALID_HANDLE_VALUE)
        goto EXIT_ROUTINE;

#pragma warning( push )
#pragma warning( disable : 4244)
    if (!WriteFile(hHandle, Data, BinarySize, &BytesWritten, NULL))
        goto EXIT_ROUTINE;
#pragma warning( pop ) 

    bFlag = TRUE;

EXIT_ROUTINE:

    if (hHandle)
        CloseHandle(hHandle);

    return bFlag;
}

INT WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nShowCmd)
{
    LPWSTR* szArglist = NULL;
    INT Arguments = 0;

    IMAGE_FILE_BLOCK BitmapWithEmbeddedPayload = { 0 };

    PBITMAPFILEHEADER BitmapHeader = NULL;
    PBYTE BitmapPixelData = NULL;
    LONGLONG BitmapPixelDataSize = 0;

    LONGLONG EmbeddedBinarySize = 0;
    WCHAR PayloadOutputPath[MAX_PATH * sizeof(WCHAR)] = { 0 };

    PBYTE PayloadBuffer = NULL;

    if (!CrtCreateConsoleIo())
        goto EXIT_ROUTINE;

    szArglist = CommandLineToArgvW(GetCommandLineW(), &Arguments);
    if (szArglist == NULL || Arguments < 2)
    {
        printf("[ERROR] No commandline argument or insufficient arguments.\r\n");
        goto EXIT_ROUTINE;
    }

    if (!InitializeFileBlock(&BitmapWithEmbeddedPayload, szArglist[1]))
        goto EXIT_ROUTINE;

    if (StringCopyW(PayloadOutputPath, szArglist[2]) == NULL)
        goto EXIT_ROUTINE;

    BitmapHeader = (PBITMAPFILEHEADER)BitmapWithEmbeddedPayload.RawData;
#pragma warning( push )
#pragma warning( disable : 6011) //IDE always crying smh. microsoft u gotta lock in
    BitmapPixelData = BitmapWithEmbeddedPayload.RawData + BitmapHeader->bfOffBits;
#pragma warning( pop ) 
    BitmapPixelDataSize = BitmapWithEmbeddedPayload.FileSize - BitmapHeader->bfOffBits;

    EmbeddedBinarySize = GetEmbeddedPayloadSize(BitmapPixelData, BitmapPixelDataSize);
    if (EmbeddedBinarySize == EMBEDDED_BINARY_CORRUPT)
        goto EXIT_ROUTINE;

    PayloadBuffer = (PBYTE)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, EmbeddedBinarySize);
    if (PayloadBuffer == NULL)
        goto EXIT_ROUTINE;

#pragma warning( push )
#pragma warning( disable : 4244)
    GetEmbeddedPayload(BitmapPixelData, EmbeddedBinarySize, PayloadBuffer);
#pragma warning( pop ) 

    if (!CreatePayloadFromEmbeddedImage(PayloadOutputPath, PayloadBuffer, EmbeddedBinarySize))
        goto EXIT_ROUTINE;

EXIT_ROUTINE:

    if (BitmapWithEmbeddedPayload.bIsInitialized)
        FreeFileBlock(&BitmapWithEmbeddedPayload);

    if (PayloadBuffer)
        HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, PayloadBuffer);

    return 0;
}

Last updated