Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 19.12.2011
Сообщений: 96

Проверить файл на исполняемость PE

02.09.2016, 16:57. Показов 1996. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер, помогите с алгоритмом вывода все исполняемых файлов ( провера исполняемости PE)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.09.2016, 16:57
Ответы с готовыми решениями:

Вопрос по cgi-bin и исполняемость pl
В директории cgi-bin есть pl файл, который работает с dll библиотекой и который отлично выполняется из командной строки. А вот через http...

Файл: Как можно проверить файл на пустоту и на конец файла?
Как можно проверить файл на пустоту? Или как можно узнать что ты в конце файла?

Файл: проверить файл на корректность данных с точностью до строки
Имеется текстовый файл Product. Необходимо проверить файл на корректность данных с точностью до строки Если строка в файле в неправильном...

12
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
02.09.2016, 19:35
Как проверить соответствие файла PE-формату без запуска
3
1 / 1 / 0
Регистрация: 19.12.2011
Сообщений: 96
05.09.2016, 12:50  [ТС]
Добрый день, помогите реализовать проверку файла на исполняемость.
Сделал поиск только exe файлов, нужно открывать каждый файл, читать первые 2 байта, сравнивать с 0x4D и 0x5A, если совпадают, то файл PE. потом закрыть файл и выводить в консоле. У меня проблема с реализацией, кто может помочь?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<windows.h>
#include<iostream>
 
using namespace std;
int main()
{
    WIN32_FIND_DATAW wfd;
    HANDLE const hFind = FindFirstFileW(L"C:\\Windows\\*.exe", &wfd);
    setlocale(LC_ALL, "");
    if (INVALID_HANDLE_VALUE != hFind)
    {
        do
        {
            std::wcout  << &wfd.cFileName[0]  << std::endl;
      } while (NULL != FindNextFileW(hFind, &wfd));
 
        FindClose(hFind);
    }
    system("pause"); 
    return 0;
}
0
05.09.2016, 13:23
 Комментарий модератора 
vasadisim, не дублируйте темы.
0
 Аватар для garry_neuznik
11 / 11 / 9
Регистрация: 04.09.2016
Сообщений: 41
05.09.2016, 19:13
C++
1
2
3
4
5
6
7
8
9
10
WCHAR szFileName[] = L"vmmap.exe";
    CHAR buf[2];
    HANDLE h; h = CreateFile(szFileName, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
    if(h!=INVALID_HANDLE_VALUE) {
        ReadFile(h, buf, 2, 0, 0);
 
        if (buf[0] == 'M' && buf[1] == 'Z') cout << "PE!" << endl;
        else cout << "Not PE" << endl;
    }
    else cout << "error";
0
 Аватар для Alex xelA
100 / 38 / 20
Регистрация: 27.02.2016
Сообщений: 135
06.09.2016, 08:28
Будет считать исполняемыми файлами любые файлы, начинающиеся с символов MZ (документы, конфиги и т.д.).

Когда-то давно написал такое:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include "StdAfx.h"
 
#define NTHEADER(DOSHeader)     reinterpret_cast<IMAGE_NT_HEADERS*>(reinterpret_cast<ULONG_PTR>(DOSHeader) + ((DOSHeader)->e_lfanew))
 
size_t exeCount = 0;
 
void SearchForExecutables(char* _Path)
{
    char searchPath[MAX_PATH];
    strcpy(searchPath, _Path);
 
    size_t pathLen = strlen(searchPath);
 
    if (searchPath[pathLen - 1] != '*')
    {
        if (searchPath[pathLen - 1] != '\\')
        {
            if (pathLen < sizeof(searchPath) / sizeof(searchPath[0]) - 2)
            {
                searchPath[pathLen++] = '\\';
                searchPath[pathLen] = 0;
            }
            else printf_s("Too big path to use (%zu B): "%s"\n", pathLen, searchPath);
        }
 
        searchPath[pathLen++] = '*';
        searchPath[pathLen] = 0;
    }
 
    WIN32_FIND_DATA findData;
    RtlZeroMemory(&findData, sizeof(findData));
 
    HANDLE finder = FindFirstFileA(searchPath, &findData);
 
    if (finder != INVALID_HANDLE_VALUE)
    {
        do
        {
            if (strcmp(findData.cFileName, ".") && strcmp(findData.cFileName, ".."))
            {
                sprintf(searchPath, "%s\\%s", _Path, findData.cFileName);
 
                if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
                {
                    //printf_s("[DBG] Processing "%s"...\n", findData.cFileName);
 
                    HANDLE file = CreateFileA(searchPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
 
                    if (file != INVALID_HANDLE_VALUE)
                    {
                        LARGE_INTEGER fileSize;
                        RtlZeroMemory(&fileSize, sizeof(fileSize));
 
                        if (GetFileSizeEx(file, &fileSize))
                        {
                            if (fileSize.QuadPart > 0)
                            {
                                size_t fileDataSize = 8192;
 
                                if (static_cast<size_t>(fileSize.QuadPart) < fileDataSize)
                                    fileDataSize = static_cast<size_t>(fileSize.QuadPart);
 
                                BYTE* fileData = new BYTE[fileDataSize];
                                
                                if (fileData)
                                {
                                    RtlZeroMemory(fileData, fileDataSize);
 
                                    DWORD dataRead = 0;
                                    
                                    if (ReadFile(file, fileData, fileDataSize, &dataRead, NULL))
                                    {
                                        if (dataRead >= sizeof(IMAGE_DOS_HEADER))
                                        {
                                            IMAGE_DOS_HEADER* dosHeader = reinterpret_cast<IMAGE_DOS_HEADER*>(fileData);
 
                                            if (dosHeader->e_magic == IMAGE_DOS_SIGNATURE)
                                            {
                                                if (dosHeader->e_lfanew != 0)
                                                {
                                                    IMAGE_NT_HEADERS* ntHeader = NTHEADER(dosHeader);
 
                                                    if (ntHeader->Signature == IMAGE_NT_SIGNATURE)
                                                        printf_s("  > [%zu] File is executable: ["%s"]\n", exeCount++, searchPath);
                                                    //else printf_s("   > Not valid NT signature (%08X). File is not Win32 executable.\n", ntHeader->Signature);
                                                }
                                                //else printf_s("   > Not valid NT header address (%08X). File is not Win32 executable.\n", dosHeader->e_lfanew);
                                            }
                                            //else printf_s("   > Not valid DOS signature (%02X). File is not executable.\n", dosHeader->e_magic);
                                        }
                                        //else printf_s("   > Not enough info read for PE header (%zu B read; %zu B is minimum needed size). File is probably not executable.\n", dataRead, sizeof(IMAGE_DOS_HEADER));
                                    }
                                    else printf_s(" > Error reading file (%zu/%zu B): [%08X] ["%s"]\n", fileDataSize, static_cast<size_t>(fileSize.QuadPart), GetLastError(), searchPath);
 
                                    delete[] fileData;
                                }
                                else printf_s(" > Error allocating %zu B of memory for PE header: [%08X] ["%s"]\n", fileDataSize, GetLastError(), searchPath);
                            }
                        }
                        else printf_s(" > Error getting the file size: [%08X] ["%s"]\n", GetLastError(), searchPath);
 
                        CloseHandle(file);
                    }
                    else printf_s(" > Error opening the file: [%08X] ["%s"]\n", GetLastError(), searchPath);
                }
                else SearchForExecutables(searchPath);
            }
        }
        while (FindNextFileA(finder, &findData));
 
        DWORD findNextFileError = GetLastError();
 
        if (findNextFileError != ERROR_NO_MORE_FILES)
            printf_s("  > Error getting the next file: [%08X]\n", findNextFileError);
 
        FindClose(finder);
    }
    else printf_s(" > Error getting the first file: [%08X]\n", GetLastError());
}
 
int main(int _Argc, char** _Argv)
{
    SetConsoleTitleA("ExeDetector");
 
    void* fsRedirectionData = NULL;
    Wow64DisableWow64FsRedirection(&fsRedirectionData);
 
    char startPath[MAX_PATH];
 
    if (_Argc < 2)
    {
        printf_s("Specify the path to start with:\n");
 
        gets_s(startPath);
    }
    else strcpy_s(startPath, _Argv[1]);
 
    printf_s("Using path: "%s"\n", startPath);
 
    SearchForExecutables(startPath);
 
    Wow64RevertWow64FsRedirection(fsRedirectionData);
 
    getchar();
    return 0;
}
1
1 / 1 / 0
Регистрация: 19.12.2011
Сообщений: 96
07.09.2016, 16:09  [ТС]
Alex xelA, ваш код при компиляции выводит 161 ошибку

Добавлено через 2 часа 33 минуты
garry_neuznik, посмотрите в чем ошибка, те файлы которые исполняемые он пишет что не PE
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#define FindFirstFile
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    WIN32_FIND_DATA fd;
    CHAR buf[2];
        WCHAR szFileName[] = FindFirstFile(L"c:\\*", &fd);
        HANDLE hFind;
        hFind = CreateFile(szFileName, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
    do
    {
        if (hFind!== INVALID_HANDLE_VALUE)
            cout << "Net diska"; else
        {
            ReadFile(hFind, buf, 2, 0, 0);
 
            if (buf[0] == 'M' && buf[1] == 'Z') cout << "PE!" << endl;
            else cout << "Not PE" << endl;
        };
        wcout << fd.cFileName << "\n";
        cout << "\n";
    } while (FindNextFile(hFind, &fd));
    FindClose(hFind);
 
    system("pause");
    return 0;
}
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
07.09.2016, 17:13
Цитата Сообщение от vasadisim Посмотреть сообщение
читать первые 2 байта, сравнивать с 0x4D и 0x5A, если совпадают, то файл PE
  • исполняемый PE-файл может не иметь сигнатуры MZ
  • исполняемый MZ-файл может не быть PE (LE/LX/NE)
0
1 / 1 / 0
Регистрация: 19.12.2011
Сообщений: 96
07.09.2016, 19:09  [ТС]
Вот написал код, но он пишет что exe файлы не PE структуры, помогите разобраться и указать на ошибки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    WIN32_FIND_DATA fd;
    //Начать поиск всех файлов в корне диска C:
    HANDLE hFind = FindFirstFile(L"c:\\*", &fd);
    CHAR buf[2];
    do
    {
        // Если ошибка поиска(например, нет диска С):
        if (hFind == INVALID_HANDLE_VALUE) cout << "error";
        else
        {
            ReadFile(hFind, buf, 2, 0, 0);
            if (buf[0] == 'M' && buf[1] == 'Z') cout << "PE!" << endl;
            else cout << "Not PE" << endl;
        }        
        // Вывести имя файла или папки на экран:
        wcout << fd.cFileName << "\n";
        // Перевод на новую строку (для вывода след. файла):
        cout << "\n";
        // Найти следующий файл, удовлетворяющий условиям поиска. Если файл найден, повторить цикл:
    } while (FindNextFile(hFind, &fd));
    // Завершить поиск:
    FindClose(hFind);
    // Ожидание нажатия любой клавиши (чтобы не закрылось окно):
    system("pause");
    return 0;
}
0
 Аватар для Alex xelA
100 / 38 / 20
Регистрация: 27.02.2016
Сообщений: 135
07.09.2016, 19:15
Цитата Сообщение от vasadisim Посмотреть сообщение
Alex xelA, ваш код при компиляции выводит 161 ошибку
Ошибки случайно не вида "не знаю что такое HANDLE"?. Мой код полностью рабочий и проверен.
0
1 / 1 / 0
Регистрация: 19.12.2011
Сообщений: 96
07.09.2016, 20:15  [ТС]
Alex xelA,
Миниатюры
Проверить файл на исполняемость PE  
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
07.09.2016, 22:02
Alex xelA, у Вас форум сожрал часть слешей в printf.

vasadisim, переключите проект на использование многобайтовой кодировки и добавьте в шапку кода Alex xelA:

C++
1
2
#include <windows.h>
#include <stdio.h>
ну и м.б.

C++
1
#define _CRT_SECURE_NO_WARNINGS
Хотя у меня дальше по коду валится на printf при разборе size_t спецификатором %zu - ошибка "incorrect format specifier". Воспользовался другим типом, хоть это и неправильно. Не знаю, почему так. Выглядит, будто студия не знает о таком. У меня VS 2013, а как сделать чтобы понимала?
0
1 / 1 / 0
Регистрация: 19.12.2011
Сообщений: 96
08.09.2016, 18:10  [ТС]
Dragokas, я решил остановиться на своем варианте. Осталось реализовать вывод размера файла и задание каталога через консоль

Добавлено через 55 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <io.h>
#include <stdlib.h>
#include <windows.h>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    WIN32_FIND_DATA fd;
    // Начать поиск всех файлов в корне диска C:
    HANDLE hFind = FindFirstFile(L"c:\\*", &fd);
    char buf[2];
    do
    {
        // Если ошибка поиска(например, нет диска С):
        if (hFind == INVALID_HANDLE_VALUE) std::cout << "error";
        else
        {
            std::wstring path = L"c:";
            path += fd.cFileName;
            HANDLE hFile = CreateFile(path.c_str(), GENERIC_READ, NULL, NULL, OPEN_EXISTING, NULL, NULL);
            if (hFile == INVALID_HANDLE_VALUE)
            {
                CloseHandle(hFile);
                continue;
            }
            DWORD nRead;
            BOOL res = ReadFile(hFile, buf, 2, &nRead, NULL);
            if (buf[0] == 'M' && buf[1] == 'Z') std::cout << "PE!" << std::endl;
            else std::cout << "Not PE" << std::endl;
            CloseHandle(hFile);
        }
        // Вывести имя файла или папки на экран:
        std::wcout << fd.cFileName << "\n";
        //Перевести дату создания из времени по Гринвичу в локальное время:
        FileTimeToLocalFileTime(&fd.ftCreationTime, &fd.ftCreationTime);
        // Выполнить конвертирование из FILETIME в SYSTEMTIME:
        SYSTEMTIME st;
        if (FileTimeToSystemTime(&fd.ftCreationTime, &st) == TRUE)
        {
            // Вывести дату на экран:
            cout << st.wDay << "-" << st.wMonth << "-" << st.wYear  << " " << st.wHour << ":" << st.wMinute << ":" << st.wSecond << " ";
        };
           // Вывести размер файла на экран:
        
        
        // Перевод на новую строку (для вывода след. файла):
        std::cout << "\n";
        std::cout << "\n";
        std::cout << "\n";
        // Найти следующий файл, удовлетворяющий условиям поиска. Если файл найден, повторить цикл:
    } while (FindNextFile(hFind, &fd));
    // Завершить поиск:
    FindClose(hFind);
    // Ожидание нажатия любой клавиши (чтобы не закрылось окно):
    system("pause");
    return 0;
}
Добавлено через 19 часов 7 минут
Укажите на ошибки, почему я не могу реализовать выбор каталога
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <stdio.h> 
#include <conio.h>
#include <math.h>
#include <string>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    cout << "Введите путь к папке (Пример: C:\\*):" << endl;
    wstring folderpath;
    std::getline(wcin, folderpath);
    wcout << L"Your path: " << folderpath << endl;
 
    WIN32_FIND_DATA fd;
    // Начать поиск всех файлов в корне диска C:
    HANDLE const hFind = FindFirstFile((L"\\\\?" + folderpath).c_str(), &fd);
    char buf[2];
    do
    {
        // Если ошибка поиска(например, нет диска С):
        if (hFind == INVALID_HANDLE_VALUE) std::cout << "error";
        else
        {
            std::wstring path = L"\\\\?";
            path += fd.cFileName;
            HANDLE hFile = hFile = CreateFile(path.c_str(), GENERIC_READ, NULL, NULL, OPEN_EXISTING, NULL, NULL);
            if (hFile == INVALID_HANDLE_VALUE)
            {
                CloseHandle(hFile);
                continue;
            }
            DWORD nRead;
            BOOL res = ReadFile(hFile, buf, 2, &nRead, NULL);
            if (buf[0] == 'M' && buf[1] == 'Z') std::cout << "PE!" << std::endl;
            else std::cout << "Not PE" << std::endl;
            CloseHandle(hFile);
        }
        // Вывести имя файла или папки на экран:
        std::wcout << fd.cFileName << "\n";
        //Перевести дату создания из времени по Гринвичу в локальное время:
        FileTimeToLocalFileTime(&fd.ftCreationTime, &fd.ftCreationTime);
        // Выполнить конвертирование из FILETIME в SYSTEMTIME:
        SYSTEMTIME st;
        if (FileTimeToSystemTime(&fd.ftCreationTime, &st) == TRUE)
        {
            // Вывести дату на экран:
            cout << st.wDay << "-" << st.wMonth << "-" << st.wYear << " " << st.wHour << ":" << st.wMinute << ":" << st.wSecond << " ";
        }
 
        // Перевод на новую строку (для вывода след. файла):
        std::cout << "\n";
        std::cout << "\n";
        std::cout << "\n";
        // Найти следующий файл, удовлетворяющий условиям поиска. Если файл найден, повторить цикл:
    } while (FindNextFile(hFind, &fd));
    // Завершить поиск:
    FindClose(hFind);
    // Ожидание нажатия любой клавиши (чтобы не закрылось окно):
    system("pause");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.09.2016, 18:10
Помогаю со студенческими работами здесь

Проверить открывается ли файл
У меня компилятор dew-cpp есть файл с именем file нужно проверить если файл существует то открыть его для дописывания в файл если нет то...

Проверить, закрыт ли файл
Мне очень нужен код , который вкл в себя : if (Файл закрыт) { //Запускаем закрытый файл }

Проверить, открыт ли файл
в одном событии открываю файл через Reset, в OnDestroy формы хочу проверить открыт ли файл и если открыт - закрыть, как это сделать?

Проверить файл по секторах
Как проверить содержимое файла по секторах?

Проверить, пуст ли файл
Как можно проверить пустоту файла? Поиск юзал. Добавлено через 17 минут fstream f; f.open(&quot;f.txt&quot;,ios::in);//открываем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru