Разработка программы для редактирования заголовка РЕ-файла
Разработка программы для отображения текущих значений полей файлового и необязательного заголовков и предоставление возможности изменения значений. Реализация файлового заголовка COFF для Windows поля и каталоги данных (адреса и размеры таблиц).
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 23.06.2011 |
Размер файла | 18,9 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Министерство образования и науки Российской Федерации
Федеральное государственное автономное образовательное учреждение высшего профессионального образования «Уральский федеральный университет имени первого Президента России Б. Н. Ельцина»
Факультет ускоренного обучения
Кафедра микропроцессорной техники
Разработка программы для редактирования заголовка РЕ-файла
Курсовой проект
Пояснительная записка
Руководитель доц., ст. преп.В. П. Кулюкин
Студент гр. СПВ-47014куН. Бархатов
Екатеринбург 2011г.
Введение
В операционных системах семейства Windows, начиная с Windows 95 и Windows NT 3.1, используется формат исполняемых файлов PE (Portable Executable, переносимый исполняемый). Название отражает тот факт, что формат не специфичен для какой-то одной архитектуры ЭВМ. PE основан на формате COFF (Common Object File Format), использовавшемся в некоторых UNIX и UNIX-подобных системах.
PE-файл начинается с файлового заголовка, который состоит из MS DOS заглушки, PE-сигнатуры, файлового заголовка COFF и необязательного заголовка. За файловым заголовком следуют заголовки секций. Необязательный заголовок требуется для исполняемых файлов, но не для объектных. Необязательный заголовок состоит из трёх частей: стандартные поля -- определены для всех реализаций COFF, специфические для Windows поля, каталоги данных (адреса и размеры определённых таблиц, например, импорта и экспорта). Для работы в программах с составляющими заголовка они представлены структурами.
Существует два вида PE-файлов: для 32-битных и 64-битных процессоров, называемые соответственно PE32 и PE32+. В формате PE32+ некоторые поля заголовка занимают 8 байтов (64 бита) вместо 4 в PE32.
Файловый заголовок |
программа-заглушка MS-DOS |
|
PE-сигнатура |
||
файловый заголовок COFF |
||
необязательный заголовок |
||
заголовки секций |
||
секции |
Рис. 1. Схема PE-файла
Постановка задачи
Файловый заголовок COFF состоит из следующих полей. Machine - число, идентифицирующее тип (архитектуру) целевого компьютера (например, Intel 386-совместимый, AMD64, Intel Itanium). NumberOfSections число секций, размер таблицы секций, следующей за заголовками. TimeDateStamp -- нижние 32 бита числа секунд с 0 часов 0 минут 1 января 1970 г. (тип time_t библиотеки запуска C), которые показывают, когда файл был создан. PointerToSymbolTable, NumberOfSymbols -- файловое смещение таблицы символов COFF и число элементов в ней; для образов (исполняемых файлов) эти числа должны быть 0, потому что включение в образы отладочной информации COFF не рекомендуется. SizeOfOptionalHeader -- размер необязательного заголовка, для объектных файлов должен быть 0. Characteristics -- флаги, которые показывают атрибуты файла (содержит ли файл информацию о перемещениях; является ли он действительным образом, системным файлом или DLL; может ли обрабатывать адреса более 2 ГБ; удалена ли отладочная информация; запускать ли файл только на однопроцессорной машине; запускать ли образ из файла подкачки, если он находится на гибком диске или сетевом носителе).
Необязательный заголовок состоит из следующих полей.
Magic - определяет тип PE-файла (PE32, PE32+, образ ROM). MajorLinkerVersion, MinorLinkerVersion, MajorOperatingSystemVersion, MinorOperatingSystemVersion, MajorImageVersion, MinorImageVersion, MajorSubsystemVersion, MinorSubsystemVersion - старшие и младшие номера версий компоновщика, требуемой операционной системы, самого образа и подсистемы соответственно. SizeOfCode, SizeOfInitializedData, SizeOfUninitializedData, SizeOfImage, SizeOfHeaders, SizeOfStackReserve, SizeOfStackCommit, SizeOfHeapReserve, SizeOfHeapCommit - размеры областей кода, инициализированных и неинициализированных данных, образа в памяти, всех заголовков, резервируемого и выделяемого места под стек и кучу. AddressOfEntryPoint -- адрес точки входа. BaseOfCode, BaseOfData (только PE32) - адреса начала кода и данных. ImageBase - предпочтительный адрес первого байта образа в памяти. SectionAlignment, FileAlignment - выравнивание (кратность размеров этому числу) секций в памяти и файле образа, в байтах. Checksum - контрольная сумма файла образа -- проверяется при загрузке всех драйверов, DLL-файлов, загружаемых при запуске системы и загружаемых в критические процессы Windows. Subsystem -- подсистема, требуемая для запуска этого образа (например, ядро, графический интерфейс, консоль). DllCharacteristics - характеристики образа, связанные с DLL. NumberOfRvaAndSizes - количество каталогов данных (пар адрес-размер). Зарезервированы и должны быть равны нулю поля Win32VersionValue и LoaderFlags.
Задачей данной работы является отображение текущих значений полей файлового и необязательного (кроме каталогов данных) заголовков и предоставление возможности изменения значений.
Схема работы и текст программы
Схема работы программы:
- проверить, что указанный файл является PE-файлом;
- получить указатели на файловый и необязательный заголовки;
- выводить меню с показом текущих значений полей заголовка.
файловый необязательный таблица заголовок
Текст программы
#define IOH1 ioh->Magic
#define IOH2 ioh->MajorLinkerVersion
#define IOH3 ioh->MinorLinkerVersion
#define IOH4 ioh->SizeOfCode
#define IOH5 ioh->SizeOfInitializedData
#define IOH6 ioh->SizeOfUninitializedData
#define IOH7 ioh->AddressOfEntryPoint
#define IOH8 ioh->BaseOfCode
#define IOH9 ioh->BaseOfData
#define IOH10 ioh->ImageBase
#define IOH11 ioh->SectionAlignment
#define IOH12 ioh->FileAlignment
#define IOH13 ioh->MajorOperatingSystemVersion
#define IOH14 ioh->MinorOperatingSystemVersion
#define IOH15 ioh->MajorImageVersion
#define IOH16 ioh->MinorImageVersion
#define IOH17 ioh->MajorSubsystemVersion
#define IOH18 ioh->MinorSubsystemVersion
#define IOH19 ioh->Win32VersionValue
#define IOH20 ioh->SizeOfImage
#define IOH21 ioh->SizeOfHeaders
#define IOH22 ioh->CheckSum
#define IOH23 ioh->Subsystem
#define IOH24 ioh->DllCharacteristics
#define IOH25 ioh->SizeOfStackReserve
#define IOH26 ioh->SizeOfStackCommit
#define IOH27 ioh->SizeOfHeapReserve
#define IOH28 ioh->SizeOfHeapCommit
#define IOH29 ioh->LoaderFlags
#define IOH30 ioh->NumberOfRvaAndSizes
#define IFH1 ifh->Machine
#define IFH2 ifh->NumberOfSections
#define IFH3 ifh->TimeDateStamp
#define IFH4 ifh->PointerToSymbolTable
#define IFH5 ifh->NumberOfSymbols
#define IFH6 ifh->SizeOfOptionalHeader
#define IFH7 ifh->Characteristics
#include <stdio.h>
#include <windows.h>
int main(int argc, char **argv)
{
char s[12];
unsigned int i, j, k, r;
CONSOLE_SCREEN_BUFFER_INFO csbi;
HANDLE hConsoleOutput, hFile, hFileMappingObject;
LPTSTR lpBuffer;
LPVOID lpBaseAddress;
IMAGE_DOS_HEADER *idh;
IMAGE_FILE_HEADER *ifh;
IMAGE_NT_HEADERS32 *inh;
IMAGE_OPTIONAL_HEADER32 *ioh;
if (argc == 1)
{
printf ("argc = 1\n");
return 1;
}
hFile = CreateFile (argv[1], GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
i = GetLastError ();
FormatMessage
(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
0, i, 0, (LPTSTR) &lpBuffer, 0, 0);
CharToOem (lpBuffer, lpBuffer);
printf ("hFile = INVALID_HANDLE_VALUE. %s", lpBuffer);
return 1;
}
hFileMappingObject = CreateFileMapping
(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
if (hFileMappingObject == NULL)
{
i = GetLastError ();
FormatMessage
(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
0, i, 0, (LPTSTR) &lpBuffer, 0, 0);
CharToOem (lpBuffer, lpBuffer);
printf ("hFileMappingObject = NULL. %s", lpBuffer);
return 1;
}
lpBaseAddress = MapViewOfFile (hFileMappingObject, FILE_MAP_WRITE, 0, 0, 0);
idh = lpBaseAddress;
if (idh->e_magic != IMAGE_DOS_SIGNATURE)
{
printf
("IMAGE_DOS_HEADER.e_magic != IMAGE_DOS_SIGNATURE\n");
return 1;
}
inh = (IMAGE_NT_HEADERS32 *)
((char *) lpBaseAddress + idh->e_lfanew);
if (inh->Signature != IMAGE_NT_SIGNATURE)
{
printf
IMAGE_NT_HEADERS32.Signature != IMAGE_NT_SIGNATURE\n");
return 1;
}
ifh = &inh->FileHeader;
ioh = &inh->OptionalHeader;
hConsoleOutput = GetStdHandle (STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo (hConsoleOutput, &csbi);
if (csbi.dwSize.Y < 35) csbi.dwSize.Y = 35;
csbi.srWindow.Bottom = csbi.srWindow.Top + 34;
SetConsoleScreenBufferSize (hConsoleOutput, csbi.dwSize);
SetConsoleWindowInfo (hConsoleOutput, TRUE, &csbi.srWindow);
while (1)
{
printf (
"typedef struct _IMAGE_NT_HEADERS {\n"
" DWORD Signature; \
// 0x%X\n"
" IMAGE_FILE_HEADER FileHeader; // 1\n"
" IMAGE_OPTIONAL_HEADER32 OptionalHeader; // 2\n"
"} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32; \
// 0 - выход\n",
inh->Signature);
do
{
fgets (s, 2, stdin);
fseek (stdin, 0, SEEK_END);
r = sscanf (s, "%1d", &i);
if (r == 0 || i > 2)
printf ("Вы неправильно ввели запрос.\n\n");
}
while (r == 0 || i > 2);
if (i == 0) break;
if (i == 1) while (1)
{
printf (
"typedef struct _IMAGE_FILE_HEADER {\n"
" WORD Machine; \
// 1 0x%X\n"
" WORD NumberOfSections; \
// 2 0x%X\n"
" DWORD TimeDateStamp; \
// 3 0x%X\n"
" DWORD PointerToSymbolTable; \
// 4 0x%X\n"
" DWORD NumberOfSymbols; \
// 5 0x%X\n"
" WORD SizeOfOptionalHeader; \
// 6 0x%X\n"
" WORD Characteristics; \
// 7 0x%X\n"
"} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; \
// 0 - возврат\n",
IFH1, IFH2, IFH3, IFH4, IFH5, IFH6, IFH7);
do
{
fgets (s, 11, stdin);
fseek (stdin, 0, SEEK_END);
r = sscanf (s, "%1d %8x", &j, &k);
if (r == 0 || r == 1 && j != 0)
printf ("Вы неправильно ввели запрос.\n\n");
}
while (r == 0 || r == 1 && j != 0);
if (j == 0) break;
switch (j)
{
case 1:
IFH1 = k;
break;
case 2:
IFH2 = k;
break;
case 3:
IFH3 = k;
break;
case 4:
IFH4 = k;
break;
case 5:
IFH5 = k;
break;
case 6:
IFH6 = k;
break;
case 7:
IFH7 = k;
}
}
if (i == 2) while (1)
{
printf (
"typedef struct _IMAGE_OPTIONAL_HEADER {\n"
" WORD Magic; \
// 1 0x%X\n"
" BYTE MajorLinkerVersion; \
// 2 0x%X\n"
" BYTE MinorLinkerVersion; \
// 3 0x%X\n"
" DWORD SizeOfCode; \
// 4 0x%X\n"
" DWORD SizeOfInitializedData; \
// 5 0x%X\n"
" DWORD SizeOfUninitializedData; \
// 6 0x%X\n"
" DWORD AddressOfEntryPoint; \
// 7 0x%X\n"
" DWORD BaseOfCode; \
// 8 0x%X\n"
" DWORD BaseOfData; \
// 9 0x%X\n"
" DWORD ImageBase; \
//10 0x%X\n"
" DWORD SectionAlignment; \
//11 0x%X\n"
" DWORD FileAlignment; \
//12 0x%X\n"
" WORD MajorOperatingSystemVersion; \
//13 0x%X\n"
" WORD MinorOperatingSystemVersion; \
//14 0x%X\n"
" WORD MajorImageVersion; \
//15 0x%X\n"
" WORD MinorImageVersion; \
//16 0x%X\n"
" WORD MajorSubsystemVersion; \
//17 0x%X\n"
" WORD MinorSubsystemVersion; \
//18 0x%X\n"
" DWORD Win32VersionValue; \
//19 0x%X\n"
" DWORD SizeOfImage; \
//20 0x%X\n"
" DWORD SizeOfHeaders; \
//21 0x%X\n"
" DWORD CheckSum; \
//22 0x%X\n"
" WORD Subsystem; \
//23 0x%X\n"
" WORD DllCharacteristics; \
//24 0x%X\n"
" DWORD SizeOfStackReserve; \
//25 0x%X\n"
" DWORD SizeOfStackCommit; \
//26 0x%X\n"
" DWORD SizeOfHeapReserve; \
//27 0x%X\n"
" DWORD SizeOfHeapCommit; \
//28 0x%X\n"
" DWORD LoaderFlags; \
//29 0x%X\n"
" DWORD NumberOfRvaAndSizes; \
//30 0x%X\n"
" IMAGE_DATA_DIRECTORY \
DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];\n"
"} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32; // 0 - возврат\n",
IOH1, IOH2, IOH3, IOH4, IOH5, IOH6, IOH7, IOH8, IOH9,
IOH10, IOH11, IOH12, IOH13, IOH14, IOH15, IOH16, IOH17,
IOH18, IOH19, IOH20, IOH21, IOH22, IOH23, IOH24, IOH25,
IOH26, IOH27, IOH28, IOH29, IOH30);
do
{
fgets (s, 12, stdin);
fseek (stdin, 0, SEEK_END);
r = sscanf (s, "%2d %8x", &j, &k);
if (r == 0 || r == 1 && j != 0)
printf ("Вы неправильно ввели запрос.\n\n");
}
while (r == 0 || r == 1 && j != 0);
if (j == 0) break;
switch (j)
{
case 1:
IOH1 = k;
break;
case 2:
IOH2 = k;
break;
case 3:
IOH3 = k;
break;
case 4:
IOH4 = k;
break;
case 5:
IOH5 = k;
break;
case 6:
IOH6 = k;
break;
case 7:
IOH7 = k;
break;
case 8:
IOH8 = k;
break;
case 9:
IOH9 = k;
break;
case 10:
IOH10 = k;
break;
case 11:
IOH11 = k;
break;
case 12:
IOH12 = k;
break;
case 13:
IOH13 = k;
break;
case 14:
IOH14 = k;
break;
case 15:
IOH15 = k;
break;
case 16:
IOH16 = k;
break;
case 17:
IOH17 = k;
break;
case 18:
IOH18 = k;
break;
case 19:
IOH19 = k;
break;
case 20:
IOH20 = k;
break;
case 21:
IOH21 = k;
break;
case 22:
IOH22 = k;
break;
case 23:
IOH23 = k;
break;
case 24:
IOH24 = k;
break;
case 25:
IOH25 = k;
break;
case 26:
IOH26 = k;
break;
case 27:
IOH27 = k;
break;
case 28:
IOH28 = k;
break;
case 29:
IOH29 = k;
break;
case 30:
IOH30 = k;
}
}
}
UnmapViewOfFile (lpBaseAddress);
CloseHandle (hFile);
}
Заключение
Программа работает, проверена на многих PE-файлах. Просмотреть и изменить заголовки PE-файла можно также программой PE Tools (http://uinc.ru/files/neox/PE_Tools.shtml) -- компонент PE Editor. Она предоставляет пользователю графический интерфейс.
Список использованных источников
1. http://en.wikipedia.org/wiki/COFF COFF.
2. http://hack-xpo.void.ru/groups/reversing/articles/infoforbeginner/pefmt120.htm ФОРМАТ ИСПОЛНЯЕМЫХ ФАЙЛОВ PortableExecutables (PE).
3. http://kidsoft.ru/arch-2005/files/web_design/wd_14/index.php?id=20 Исследование переносимого формата исполнимых файлов "сверху вниз".
4. http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx Microsoft Portable Executable and Common Object File Format Specification.
Размещено на Allbest.ru
Подобные документы
Проектирование программы "Будильник" с использованием программной среды, позволяющей осуществлять получение и обработку значений времени и воспроизведение звукового файла. Разработка технического и эскизного проектов программы. Спецификация программы.
курсовая работа [84,2 K], добавлен 15.04.2013Понятие и физическая структура диска, описание способности системы хранить данные. Рассмотрение особенностей файловой системы FAT16. Выявление связи между размером кластера и потерями дискового пространства. Пример создания программы файлового обмена.
курсовая работа [146,1 K], добавлен 26.10.2015Аналіз функціонування файлового менеджера WINDOWS COMMANDER. Ключові якості програми: операцї з файлами, управління архівами, локальні меню, вбудований FTP-клієнт. З'днання з іншим комп'ютером. Контрольні суми. Функції різних версій WINDOWS COMMANDER.
дипломная работа [48,2 K], добавлен 14.12.2007Считывание информации из файла, анализ заголовка. Установка видеорежима и анализ его параметров. Разработка процедуры вывода изображения на экран. Методы вывода сообщений. Разработка алгоритма, удовлетворяющего требованиям задания и интерфейса программы.
курсовая работа [23,6 K], добавлен 17.05.2013Создание программы для обработки информации об объектах предметной области "Бытовая техника" в среде визуального программирования C++. Иерархия родственных классов. Описание логической структуры программы. Реализация файлового ввода/вывода данных.
курсовая работа [711,4 K], добавлен 27.07.2014Реализация базовых геометрических преобразований: вращения, переноса, отражения и масштабирования. Рекомендации по работе с программой. Ввод в соответствующие поля приложений значений данных по каждой из осей координат для выполнения операции с фигурой.
контрольная работа [642,0 K], добавлен 21.01.2015Создание таблиц базы данных в режиме конструктора. Наименование и структура таблиц базы данных "Библиотека". Применение поля подстановок и создание фиксированного списка значений для полей. Схема связи между таблицами. Формирование и выполнение запроса.
контрольная работа [1,2 M], добавлен 24.07.2009Разработка эскизного и технического проектов программы, ее назначение и область применения, описание алгоритма, организация входных и выходных данных. Выбор состава технических и программных средств, разработка рабочего проекта, спецификация программы.
курсовая работа [700,6 K], добавлен 26.01.2010Основы проверки и расчета входных данных и вывода выходных данных программы, их блок-схемы. Реализация функции считывания числовых данных из файла, управление (создание, уничтожение и редактирование) визуальными компонентами во время выполнения программы.
контрольная работа [1,3 M], добавлен 12.06.2009Структура записей входного массива. Описание основных типов данных. Алгоритм программы: присвоение начальных значений переменных, чтение списка из файла, вывод данных на экран, выполнение обработки данных, сохранение списка в файл. Листинг программы.
курсовая работа [325,2 K], добавлен 28.12.2012