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

int ListProcess(PROCESSENTRY32 Processes[])
{
    int p, i = 0;
    HANDLE hSnapShot;

    hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    Processes[i].dwSize = sizeof(PROCESSENTRY32);

    p = Process32First(hSnapShot, &Processes[i++]);

    while(p)
    {
        Processes[i].dwSize = sizeof(PROCESSENTRY32);

        p = Process32Next(hSnapShot, &Processes[i++]);
    }

    return i;
}

int main(void)
{
    DWORD i;
    int len;
    PROCESSENTRY32 Processes[1024];

    len = ListProcess(Processes);

    for(i=0;i<0x4E1C;i++)
    {
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, i);
        int hidden = 1;

        if(hProcess != NULL)
        {
            int j;
            for(j=0;j<len;j++)
            {
                if(Processes[j].th32ProcessID == i)
                {
                    i += Processes[j].cntThreads+2;
                    hidden = 0;
                    break;
                }
            }
            if(hidden)
            {
                HMODULE hModule;
                DWORD dwBytesNeeded;
                TCHAR ProcessName[255];

                if(EnumProcessModules(hProcess, &hModule, sizeof(hModule), &dwBytesNeeded))
                {
                    GetModuleBaseName(hProcess, hModule, ProcessName, sizeof(ProcessName)/sizeof(TCHAR));

                    printf("[+]Process Hidden : %s\n", ProcessName);
                }
            }
        }
    }

    return 0;
}