Nano Hash - криптовалюты, майнинг, программирование

Получить описание процесса

Как вы знаете, между именем процесса и его описанием есть некоторая разница, например, dwm.exe описание процесса Desktop Window Manager

Я могу проверить имя процессов с помощью этого кода:

#include <windows.h>
#include <TlHelp32.h>
#include <Winternl.h>

typedef NTSTATUS (NTAPI *NTQUERYINFORMATIONPROCESS)(
    IN HANDLE ProcessHandle,
    IN PROCESSINFOCLASS ProcessInformationClass,
    OUT PVOID ProcessInformation,
    IN ULONG ProcessInformationLength,
    OUT PULONG ReturnLength OPTIONAL
    );

int main()
{
    PEB Peb = {0};
    DWORD dwSize = 0;
    DWORD dwPID = 0;
    HANDLE hProcess = NULL;
    HANDLE hProcessSnap = NULL;
    WCHAR PsPath[MAX_PATH] = {0};
    WCHAR wszProcName[20] = L"dwm.exe"; //Desktop Window Manager
    PROCESSENTRY32 PsEntry32 = {0}; 
    PROCESS_BASIC_INFORMATION PsBasicInfo = {0};    
    RTL_USER_PROCESS_PARAMETERS RtlUserPsParams = {0};
    NTQUERYINFORMATIONPROCESS NtFunction = NULL;


    if((hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)) != INVALID_HANDLE_VALUE)
    {
        PsEntry32.dwSize = sizeof(PROCESSENTRY32);

        if(!Process32First(hProcessSnap, &PsEntry32))
        {
            CloseHandle(hProcessSnap);
            return FALSE;
        }

        do
        {
            if(lstrcmpiW(PsEntry32.szExeFile, wszProcName) == 0)
            {
                hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, PsEntry32.th32ProcessID);

                if(hProcess != INVALID_HANDLE_VALUE)
                {
                    NtFunction = (NTQUERYINFORMATIONPROCESS)GetProcAddress(LoadLibraryW(L"ntdll.dll"), "NtQueryInformationProcess");

                    if(NtFunction)
                    {
                        if(NtFunction(hProcess, ProcessBasicInformation, &PsBasicInfo, sizeof(PROCESS_BASIC_INFORMATION), &dwSize) == ERROR_SUCCESS)
                        {
                            ReadProcessMemory(hProcess, PsBasicInfo.PebBaseAddress, &Peb, sizeof(PEB), (SIZE_T*)&dwSize);
                            ReadProcessMemory(hProcess, Peb.ProcessParameters, &RtlUserPsParams, sizeof(RTL_USER_PROCESS_PARAMETERS), (SIZE_T*)&dwSize);
                            ReadProcessMemory(hProcess, RtlUserPsParams.ImagePathName.Buffer, PsPath, RtlUserPsParams.ImagePathName.Length, (SIZE_T*)&dwSize);
                            dwPID = PsEntry32.th32ProcessID;
                        }
                    }
                    CloseHandle(hProcess);
                }                           
            }
        }while(Process32Next(hProcessSnap, &PsEntry32));

        CloseHandle(hProcessSnap);
    }

    return 0;
}

теперь я хочу проверить описание процессов

Можно ли получить описание всех процессов по одному и проверить их?

18.11.2017

  • вам нужно получить полный путь к процессу с помощью запроса SystemProcessIdInformation с NtQuerySystemInformation или с помощью открытого процесса и запроса GetProcessImageFileName, а затем вам нужно прочитать информацию о версии исполняемого файла - описание файла. а по поводу NtQueryInformationProcess - нужна ссылка с ntdll.lib вместо звонка LoadLibrary (почему не GetModuleHandle ??) и GetProcAddress. однако, если вы все равно выберете сделать это - это нужно сделать только один раз, но не в цикле 18.11.2017
  • @RbMm спасибо за ваш комментарий, я использую GetProcessImageFileName, но теперь как я могу прочитать информацию о версии исполняемого файла? Я использую GetFileVersionInfo и VerQueryValue, но вывод информации был DWORD и невыгодным... 18.11.2017
  • вы можете использовать недокументированный API SHGetFileDescriptionW экспортируется из shlwapi.dll как порядковый номер 348. поэтому нужно использовать GetProcAddress(LoadLibraryW(L"shlwapi"), (PCSTR)348) и вызывать SHGetFileDescriptionW(L"***", L"\\StringFileInfo\\040904e4\\FileDescription", 0, szDesc, &chDesc); или искать его реализацию - как он вызывает VerQueryValue для L"\\StringFileInfo\\%04X%04X\\FileDescription" 18.11.2017
  • @RbMm Спасибо, проблема была в том, что мне нужно позвонить VerQueryValue один раз для \\VarFileInfo\\Translation и один раз для \\StringFileInfo\\%04X%04X\\FileDescription 21.11.2017
  • Вы знаете, что удаление вопроса после получения ответа не приветствуется. Вы сделали это один раз и сами описали это как ошибку. Почему ты все же сделал это снова? 17.12.2018

Ответы:


1

Для получите путь к модулю вместо вашего метода PEB, после того как я:

GetFileVersionInfoSizeA(), чтобы получить размер структуры версии

GetFileVersionInfoA(), чтобы получить данные из этой структуры в локальный массив символов.

VerQueryValue() с "\ VarFileInfo\Translation", чтобы получить кодовые страницы языка.

Затем я перебираю кодовые страницы разных языков, чтобы создать строку подблока, необходимую для следующего запроса.

Затем я использую VerQueryValue() с правильной кодовой страницей языка, вставленной внутрь подблока, и сохраните результат в другом массиве символов.

Затем мы выводим эту строку на консоль.

#include <iostream>
#include <string>
#include <Windows.h>
#include <TlHelp32.h>
#include <strsafe.h>

#pragma comment(lib,"Version.lib")

std::string GetModulePath(std::string moduleName, DWORD procId)
{
    std::string path;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procId);
    if (hSnap != INVALID_HANDLE_VALUE)
    {
        MODULEENTRY32 modEntry{};
        modEntry.dwSize = sizeof(modEntry);
        if (Module32First(hSnap, &modEntry))
        {
            do
            {
                if (!_stricmp(modEntry.szModule, moduleName.c_str()))
                {
                    path = modEntry.szExePath;
                    break;
                }
            } while (Module32Next(hSnap, &modEntry));
        }
    }
    CloseHandle(hSnap);
    return path;
}

std::string GetFilePath(std::string procName)
{
    std::string path;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnap != INVALID_HANDLE_VALUE)
    {
        PROCESSENTRY32 procEntry;
        procEntry.dwSize = sizeof(procEntry);

        if (Process32First(hSnap, &procEntry))
        {
            do
            {
                if (!_stricmp(procEntry.szExeFile, procName.c_str()))
                {
                    path = GetModulePath(procName, procEntry.th32ProcessID);
                    break;
                }
            } while (Process32Next(hSnap, &procEntry));

        }
    }
    CloseHandle(hSnap);
    return path;
}

struct LANGANDCODEPAGE {
    WORD wLanguage;
    WORD wCodePage;
};

int main()
{
    std::string path = GetFilePath("notepad++.exe");

    DWORD verSize = GetFileVersionInfoSizeA(path.c_str(), 0);

    char* data = new char[verSize]{ 0 };

    GetFileVersionInfoA(path.c_str(), 0, verSize, data);

    UINT length;
    LANGANDCODEPAGE* lpTranslate;

    VerQueryValue(data, "\\VarFileInfo\\Translation", (LPVOID*)&lpTranslate, &length);

    char SubBlock[50]{ 0 };

    for (unsigned int i = 0; i < (length / sizeof(struct LANGANDCODEPAGE)); i++)
    {
        HRESULT result = StringCchPrintf(SubBlock, 50,
            TEXT("\\StringFileInfo\\%04x%04x\\FileDescription"),
            lpTranslate[i].wLanguage,
            lpTranslate[i].wCodePage);

        char* description = new char[0x100]{ 0 };

        UINT length2;
        VerQueryValue(data, SubBlock, (LPVOID*)&description, &length2);

        std::cout << description << "\n";
    }

    getchar();
    return 0;
}

Должен запускаться от имени администратора и тестироваться только на x86.

11.11.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..