1 / 1 / 0
Регистрация: 23.08.2016
Сообщений: 33

Изменение даты и времени в заголовке файла PE-формата

23.01.2017, 21:29. Показов 2459. Ответов 8

Author24 — интернет-сервис помощи студентам
Дорогие друзья, помогите, пожалуйста. Я хочу изменить дату и время в заголовке файла PE-формата.
Вот кусок кода, где я пытаюсь вывести дату и время создания, но вместо формата 16:00 31.12.1969 я получаю"0x74".
C++
1
2
3
4
5
6
IMAGE_FILE_HEADER header;
    pefile.read(reinterpret_cast<char*>(&header), sizeof(IMAGE_FILE_HEADER));//чтение заголовка секций
    
    DWORD name;
    name = header.TimeDateStamp;
    cout << "TimeDateStamp " << header.TimeDateStamp << endl;
Добавлено через 33 минуты
Вот такой код, сначала ошибся. Так вернее
C++
1
2
3
4
5
6
IMAGE_FILE_HEADER header;
    pefile.read(reinterpret_cast<char*>(&header), sizeof(IMAGE_FILE_HEADER));//чтение заголовка секций
    
    DWORD name;
    name = header.TimeDateStamp;
    cout << "TimeDateStamp " << name << endl;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.01.2017, 21:29
Ответы с готовыми решениями:

Изменение формата времени и даты
На Action подключил Form2, на procedure TForm2.FormActivate подключил ListBox1.Items.Add(DateToStr(Now)) и ...

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

Изменение даты и времени создания/изменения файла
помогите пожалуйста, есть вот такая форма, нужно написать код для того чтобы изменить год,дату,время какого нибудь выбранного файла

8
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
24.01.2017, 13:48
Что такое pefile.read? Откуда это?
Почему считывание идет в IMAGE_FILE_HEADER, хотя в начале любого PE-файла лежит IMAGE_DOS_HEADER?
И почему ты считаешь, что вывод DWORD в std::cout будет выводить дату/время в нужном формате?
0
1 / 1 / 0
Регистрация: 23.08.2016
Сообщений: 33
24.01.2017, 15:34  [ТС]
pefile - файл, переданный в аргументы. То есть тот файл, в котором собираюсь изменить дату и время.
В IMAGE_FILE_HEADER хранится нужные дата и время.
Если знаешь, подскажи пожалуйста правильный способ вывода даты создания
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
24.01.2017, 15:40
1. Загружаешь исполняемый файл в память с помощью LoadLibraryEx.

2. Вызываешь функцию ImageNtHeader. Через нее узнаешь адрес IMAGE_FILE_HEADER.
Из этой структуры вытаскиваешь значение поля TimeDateStamp. Время там хранится в
секундах, прошедших с 1 января 1970 года 00:00:00 (в UTC).
2
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
24.01.2017, 22:15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (pNT && !IsBadReadPtr(pNT,sizeof(PIMAGE_NT_HEADERS)))
{
   DWORD    dwTimestamp = pNT->FileHeader.TimeDateStamp;
 
   // If timer represents a date before midnight, January 1, 1970, gmtime returns NULL
   __int64     LTS = dwTimestamp;
 
   struct tm*     pTS = gmtime((const time_t*)&LTS);
 
   if (pTS)
   {
      sprintf(pszTemp,"%08X | %04d-%02d-%02d | %02d:%02d:%02d",dwTimestamp,pTS->tm_year + 1900,pTS->tm_mon + 1,pTS->tm_mday,pTS->tm_hour,pTS->tm_min,pTS->tm_sec);
   }
}
Code
1
4011B0BE | 2004-01-23 | 23:39:42
1
1 / 1 / 0
Регистрация: 23.08.2016
Сообщений: 33
25.01.2017, 10:04  [ТС]
gazlan, что такое pNT и pszTemp, откуда они?

Добавлено через 7 минут
gazlan, это PIMAGE_NT_HEADERS pNT?
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
25.01.2017, 15:32
pNT - PIMAGE_NT_HEADERS (полученный где-то в другом месте), pszTemp - временный буфер для строки с отметкой времени.
0
1 / 1 / 0
Регистрация: 23.08.2016
Сообщений: 33
26.01.2017, 11:04  [ТС]
Сейчас программа выводит дату и время из 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
33
34
35
36
37
38
39
40
41
42
43
44
45
int _tmain(int argc, _TCHAR* argv[])
{
    if (argc != 2)
    {
        std::cout << "Usage: UpdateDate.exe pe_file" << std::endl;
        return 0;
    }
 
    LoadLibraryEx(argv[1], NULL, LOAD_LIBRARY_AS_DATAFILE);
 
    std::ifstream pefile;
    pefile.open(argv[1], std::ios::in | std::ios::binary);//открытие ре-файла
    if (!pefile.is_open())//если не удалось открыть файл
    {
        std::cout << "can't open file" << std::endl;//файл не открыт
        return 0;
    }
    
 
    pefile.seekg(0, std::ios::end);
    std::streamoff filesize = pefile.tellg();
    pefile.seekg(0);
 
    IMAGE_DOS_HEADER dos_header;
    pefile.read(reinterpret_cast<char*>(&dos_header), sizeof(IMAGE_DOS_HEADER));
    pefile.seekg(dos_header.e_lfanew);
 
    IMAGE_NT_HEADERS nt_headers;
    pefile.read(reinterpret_cast<char*>(&nt_headers), sizeof(IMAGE_NT_HEADERS)-sizeof(IMAGE_DATA_DIRECTORY)* 16);
    char pszTemp[50];
    if (&nt_headers && !IsBadReadPtr(&nt_headers, sizeof(PIMAGE_NT_HEADERS)))
    {
        DWORD    dwTimestamp = nt_headers.FileHeader.TimeDateStamp;
        //If timer represents a date before midnight, January 1, 1970, gmtime returns NULL
        __int64     LTS = dwTimestamp;
        struct tm*     pTS = gmtime((const time_t*)&LTS);
        if (pTS)
        {
            sprintf(pszTemp, "%08X | %02d-%02d-%04d | %02d:%02d:%02d", dwTimestamp, pTS->tm_mday, pTS->tm_mon + 1, pTS->tm_year + 1900, pTS->tm_hour + 3, pTS->tm_min, pTS->tm_sec);
        }
        
    }
    std::cout << pszTemp << std::endl;
return 0;
}
Добавлено через 16 часов 36 минут
Мне нужно изменить TimeDateStamp: WORD — число хранящее дату и время создания файла.
0
1 / 1 / 0
Регистрация: 23.08.2016
Сообщений: 33
27.01.2017, 20:41  [ТС]
Я пытаюсь изменить дату и время создания в pe заголовке. Но после записи в файл ничего не изменяется.
Подскажите, что я делаю не так? Записываю не правильно? Нужно ли пересчитывать контрольную сумму CheckSum?
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
int _tmain(int argc, _TCHAR* argv[])
{
    if (argc != 2)
    {
        std::cout << "Usage: UpdateDate.exe pe_file" << std::endl;
        return 0;
    }
 
    std::ifstream pefile;//поток чтения
    std::ofstream peFL;//поток записи
    pefile.open(argv[1], std::ios::in | std::ios::binary);//открытие ре-файла
    if (!pefile.is_open())//если не удалось открыть файл
    {
        std::cout << "can't open file" << std::endl;//файл не открыт
        return 0;
    }
    //определение размера файла в байтах
    pefile.seekg(0, std::ios::end);
    std::streamoff filesize = pefile.tellg();
    pefile.seekg(0);
 
    LoadLibraryEx(argv[1], NULL, LOAD_LIBRARY_AS_DATAFILE);//загрузка файла в память
 
    IMAGE_DOS_HEADER dos_header;
    pefile.read(reinterpret_cast<char*>(&dos_header), sizeof(IMAGE_DOS_HEADER));//чтение dos заголовка
    pefile.seekg(dos_header.e_lfanew);//переход на структуру NT
 
    IMAGE_NT_HEADERS nt_headers;
    //чтение заголовка NT
    pefile.read(reinterpret_cast<char*>(&nt_headers), sizeof(IMAGE_NT_HEADERS)-sizeof(IMAGE_DATA_DIRECTORY)* 16);
    DWORD CheckSum = nt_headers.OptionalHeader.CheckSum;
    DWORD Date = nt_headers.FileHeader.TimeDateStamp;
    std::cout << "Date " << Date << std::endl;
    std::cout << "CheckSem " << CheckSum << std::endl;
    char pszTemp[50];//массив для вывода даты
    char TempHead[10];//
    //проверка, имеет ли вызывающий процесс доступ к заданному диапазону памяти 
    if (&nt_headers && !IsBadReadPtr(&nt_headers, sizeof(PIMAGE_NT_HEADERS))) 
    {
        DWORD    dwTimestamp = nt_headers.FileHeader.TimeDateStamp;//дата и время
        __int64     LTS = dwTimestamp;//перевод в числовой вид
        std::cout << "LTS " << LTS << std::endl;
        struct tm* pTS = gmtime((const time_t*)&LTS);//преобразование времени в структуру
        
        pTS->tm_mday = 10;
        pTS->tm_mon = 8;
        pTS->tm_year = 1994;
        pTS->tm_hour = 12;
        pTS->tm_min = 25;
        pTS->tm_sec = 58;
        std::cout << "LTS " << LTS << std::endl;
        sprintf(pszTemp, "%08X | %02d-%02d-%04d | %02d:%02d:%02d", dwTimestamp, pTS->tm_mday, pTS->tm_mon + 1, pTS->tm_year, pTS->tm_hour+3, pTS->tm_min, pTS->tm_sec);
        time_t KalendTime = mktime(pTS);
        __int64 TS = KalendTime;
        DWORD Check = nt_headers.OptionalHeader.CheckSum;
        std::cout << "Check " << Check << std::endl;
        std::cout << "TS " << TS << std::endl;
        nt_headers.FileHeader.TimeDateStamp = TS;
        
    }
    pefile.close();
    peFL.open(argv[1], std::ios::out | std::ios::binary);
    peFL.write(reinterpret_cast<char*>(&dos_header), sizeof(IMAGE_DOS_HEADER));
    peFL.write(reinterpret_cast<char*>(&nt_headers.FileHeader.TimeDateStamp), sizeof(IMAGE_NT_HEADERS)-sizeof(IMAGE_DATA_DIRECTORY)* 16);
    peFL.write(reinterpret_cast<char*>(&nt_headers.OptionalHeader.CheckSum), sizeof(IMAGE_NT_HEADERS));
    peFL.close();
    
    std::cout << pszTemp << std::endl;
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.01.2017, 20:41
Помогаю со студенческими работами здесь

Считывание и изменение даты и времени создания произвольного файла
Написать программу,считывающую и изменяющую дату и время создания произвольного файла. Имя файла, а также новые дату и время файла,...

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

Изменение формата даты
Здравствуйте! Подскажите, пожалуйста, как изменить формат дат в Excell (например с 2017-10-25 на 25.10.2017) После того как меняю...

Изменение формата даты
Всем хорошего дня! У меня такая проблема: Написал функцию расчёта срока изготовления изделия для этапов производства, в зависимости от...

Изменение формата даты
Доброе время суток! Проблема в следующем, получаю отчет из базы в XML-XSL- HTML . В отчете есть дата формата 11 Jul 2014 15:07,...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

Новые блоги и статьи
sshd restrictions, ssh access limitations
jigi33 26.03.2025
sshd restrictions | ssh access limitations рестрикции доступа на сервер sshd статья: https:/ / www. golinuxcloud. com/ restrict-allow-ssh-certain-users-groups-rhel
Компиляция C++ с Clang API
NullReferenced 24.03.2025
Компиляторы обычно воспринимаются как черные ящики, которые превращают исходный код в исполняемые файлы. Мы запускаем компилятор командой в терминале, и вуаля — получаем бинарник. Но что если нужно. . .
Многопоточное программировани­е в C#: Класс Thread
UnmanagedCoder 24.03.2025
Когда запускается приложение на компьютере, операционная система создаёт для него процесс - виртуальное адресное пространство. В C# этот процесс изначально получает один поток выполнения — главный. . .
SwiftUI Data Flow: Передача данных между представлениями
mobDevWorks 23.03.2025
При первом знакомстве со SwiftUI кажется, что фреймворк предлагает избыточное количество механизмов для передачи данных: @State, @Binding, @StateObject, @ObservedObject, @EnvironmentObject и другие. . . .
Моки в Java: Сравниваем Mockito, EasyMock, JMockit
Javaican 23.03.2025
Как протестировать класс, который зависит от других сложных компонентов, таких как базы данных, веб-сервисы или другие классы, с которыми и так непросто работать в тестовом окружении? Для этого и. . .
Архитектурные паттерны микросервисов: ТОП-10 шаблонов
ArchitectMsa 22.03.2025
Популярность микросервисной архитектуры объясняется множеством важных преимуществ. К примеру, она позволяет командам разработчиков работать независимо друг от друга, используя различные технологии и. . .
Оптимизация рендеринга в Unity: Сортировка миллиона спрайтов
GameUnited 22.03.2025
Помните, когда наличие сотни спрайтов в игре приводило к существенному падению производительности? Время таких ограничений уходит в прошлое. Сегодня геймдев сталкивается с задачами совершенно иного. . .
Образование и практика
Igor3D 21.03.2025
Добрый день А вот каково качество/ эффективность ВУЗовского образования? Аналитическая геометрия изучается в первом семестре и считается довольно легким курсом, что вполне справедливо. Ну хорошо,. . .
Lazarus. Таблица с объединением ячеек.
Massaraksh7 21.03.2025
Понадобилась представление на экране таблицы с объединёнными ячейками. И не одной, а штук триста, и все разные. На Delphi я использовал для этих целей TStringGrid, и то, кривовато получалось. А в. . .
Async/await в Swift: Асинхронное программировани­е в iOS
mobDevWorks 20.03.2025
Асинхронное программирование долго было одной из самых сложных задач для разработчиков iOS. В течение многих лет мы сражались с замыканиями, диспетчеризацией очередей и обратными вызовами, чтобы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru