Міністерство освіти і науки України Національний університет „Львівська політехніка”
Кафедра ЕОМ
Курсовий проект
з дисципліни: «Системне програмне забезпечення»
на тему:
«Утиліта перегляду інформації файлів PE формату»
АНОТАЦІЯ
В курсовому проекті була розроблено утиліта перегляду інформації файлів PE формату, вона дозволяє переглядати інформацію про використані динамічно завантажувальні бібліотеки у файлах PE формату( .exe, .dll, .ocx, .sys, .scr, .drv, .cpl, .efi), інформацію про заголовок файлу, перегляд файлу у шістнадцятковому представленні, пошук використаних бібліотек у інтернеті.
Програма буде розроблена мовою програмування С# за допомогою Microsoft Visual Studio.
ЗМІСТ
Завдання на курсовий проект……………………………………….……………4
Вступ………………………………………………………………………...……..5
Аналіз завдання та способи його вирішення………………………………..6
Огляд роботи програм аналогів…………………………………………..6
Вибір технології програмування……………………………………....….9
Алгоритм роботи………………………………………………………….....11
Розробка програми…………………………………………………….…….12
Збір використаних dll бібліотек……………………………...…………12
Вивід інформації про заголовок файлу………………………………...14
Створення переглядача файлу у шістнадцятковому представленні…16
Зчитування файлу……………………………………………………..…17
Пошук бібліотеки в інтернеті…………………………………..……….18
4. Тестування………………………………………………………………….….19
4.1. Виявлення помилок при спільному використанні програми……..…..19
4.2. Виявлення помилок при пошуку бібліотеки в інтернеті…………..….19
4.3. Виявлення помилок при створенні шістнадцяткового переглядача....20
4.4. Порівняльне тестування………………………………………………....21
5. Опис інтерфейсу та інструкції користувача…………………………….…..22
Висновки…………………………………………………………………………24
Список використаної літератури…………………………………………….....25
Додатки…………………………………………………………………………...26
Додаток А. Блок-схема алгоритму виконання програми………………....26
Додаток Б. Текст програми………………………………………………….27
ЗАВДАННЯ НА КУРСОВИЙ ПРОЕКТ
Розробити утиліту перегляду інформації файлів PE формату.
Функції програми:
Завантаження PE файлів
Вивід dll бібліотек, які використовуються
Вивід інформації про місцезнаходження бібліотек
Пошук інформації про бібліотеки в інтернеті
Перегляд файлу у шістнадцятковому представленні
Вивід інформації про заголовок файлу
Програма використовує стандартні бібліотеки класів платформи .NET.
ВСТУП
В наш час переважна більшість користувачів комп’ютерів використовують операційну систему Windows, яка здатна виконувати файли PE формату. PE формат - формат виконуваних файлів, об'єктного коду та динамічних бібліотек, який використовується в 32- і 64-розрядних версіях операційної системи Microsoft Windows. Формат PE є структурою даних, що містить всю інформацію, необхідну PE-завантажувачу для відображення файлу в пам'ять. Виконуваний код включає в себе посилання для зв'язування динамічно завантажувальних бібліотек, таблиці експорту і імпорту API функцій, дані для управління ресурсами і дані локальної пам'яті потоку . В операційних системах сімейства Windows NT формат PE використовується для EXE, DLL, SYS (драйверів пристроїв) та інших типів виконуваних файлів.
Утиліта перегляду інформації про файл PE формату є досить актуальною в наш час, оскільки має широкий функціонал. Ця програма є корисною, поза як надає можливість перегляду використаних динамічно завантажувальних бібліотек. Це важлива функція, тому що є досить багато програм, в складі яких знаходяться шкідливі бібліотеки, які отримують доступ до інформації, яка розташована на комп’ютері користувача. Також перегляд назви бібліотеки в інтернеті надає можливість ознайомитись користувачу з нею, дізнатись, які функції вона пропонує.
1. АНАЛІЗ ЗАВДАННЯ ТА СПОСОБИ ЙОГО ВИРІШЕННЯ
1.1. Огляд роботи програм аналогів
Dependency Walker
Dependency Walker (від англ. "уникач залежностей") - програма для первинного аналізу виконуваних файлів і бібліотек, програма-аналізатор, що надає користувачу інформацію про іншу обрану програму, наприклад, про комп'ютерну іграшку або будь який інший вибраний додаток.
Основне призначення Dependency Walker - допомогти з'ясувати, від яких виконуваних файлів і бібліотек залежить аналізований додаток. Це дозволяє ідентифікувати такі проблеми з додатком, як:
відсутність потрібної бібліотеки (ім'я бібліотеки буде підсвічено червоним);
не збіг версій (проблемна бібліотека буде підсвічена рожевим) - це означає, що деякі необхідні додатком функції в ній відсутні;
використання неправильної версії бібліотеки – це буде помітно якщо подивитися на повний шлях до бібліотек в нижній частині вікна.
Допоміжні можливості програми:
Визначення цільової операційної системи - DOS / Win16 / Win32 / Win64 / etc, апаратної архітектури і графічної підсистеми
Визначення точної дати створення додатка / бібліотеки
Визначення мови програмування, на якому написано додаток (найпростіше це робиться за списком залежностей, наприклад, mscoree.dll з деякою мірою вірогідності відповідає .Net з додатком, msvbvm60.dll - Visual Basic 6.0, a msvcr80.dll - Visual C ++ 2005).
Визначення функцій операційної системи, що використовуються додатком. (Наприклад, wininet.dll з деякою мірою вірогідності говорить про прямий доступ до Інтернету, ole32.dll про роботу з COM-компонентами, user32.dll про роботу з вікнами, winmm.dll - про програванні музики, а dbghelp.dll про розширену обробці помилок).
Перегляд назв функцій, що експортуються бібліотекою – це буває корисно при налагодженні власних додатків для виявлення помилок з декларуванням імен функцій.
Нетривіальна можливість – це динамічний аналіз залежностей. Програми дозволяє запускати додаток на виконання і відстежувати (трасувати) всі етапи розпізнавання імен файлів і функцій.
/
Рис.1.1.1 Використання програми Dependency Walker
MiTeC EXE Explorer
MiTeC EXE Explorer – невеликий безкоштовний переглядач структури виконуваних файлів. Показує інформацію з заголовка файлу, таблицю імпорту, інформацію про секції, має зручну пошукову систему. За допомогою цієї програми можна дізнатись про час створення, модифікації, доступ до програми, розмір, кількість секцій, автора програми, її версію та навіть сайт компанії і багато іншої інформації.
/
Рис.1.1.2 Перегляд інформації про заголовок за допомогою програми MiTeC EXE Explorer
/
Рис.1.1.3 Перегляд використаних dll бібліотек за допомогою програми MiTeC EXE Explorer
1.2. Вибір технології програмування
На сьогоднішній день існує велика кількість мов програмування різних типів: мови низького та високого рівня, мови функціональні, структурні, об‘єктно орієнтовані мови програмування. Кожна з них має своє призначення, переваги та недоліки в порівнянні з іншими. Відповідно до різноманіття мов існує багато середовищ, зручних для програмування на таких мовах. Проте є мови і середовища зручніші за інші в своєму функціоналі та практичному використанні. Найпопулярнішими на даний час є такі мови:
( C – це мова, яка не має великого базового функціоналу, але може виконувати поставлені задачі швидше, за інші мови;
( Java – мова програмування, що дозволяє створювати універсальні програми для різних операційних систем (далі - ОС). І немає різниці, що за ОС встановлена на пристрої – програма буде виконуватись у віртуальній машині Java Virtual Machine;
( PHP, JavaScript та мови розмітки гіпертекстових документів HTML та CSS – мови, що використовуються для створення веб-сторінок та веб-додатків для інтернет-браузерів.
Розглянемо детальніше С# (вимовляється Сі-шарп). С# – об‘єктно-орієнтована мова програмування для платформи .NET (Microsoft .NET). Синтаксис мови був розроблений під впливом інших мов, таких як Java, Objective-C, C++, Visual Basic та Delphi. Мова має строгу типізацію, підтримує поліморфізм та коментарі у форматі XML, атрибути, має обробник подій та винятків. Перейнявши багато що від своїх попередників – мов С++, Delphi, Модула і Smalltalk – С#, спираючись на практику їхнього використання, виключає деякі моделі, що зарекомендували себе як проблематичні при розробці програмних систем, наприклад множинне спадкування класів (на відміну від C++). На сьогоднішній день C# має велику кількість вбудованих можливостей:
( Створення інтерфейсів за допомогою Windows Forms та WPF (Windows Presentation Foundation);
( Спрощені оператори;
( Вбудована бібліотека для написання SQL-запитів (ключові слова select, from, where);
( Ініціалізація об‘єкта разом з його властивостями;
( Автоматичне визначення типів локальних змінних;
( Динамічна типізація об‘єктів;
( Асинхронні методи;
( Препроцесорні директиви
( Фільтри виключень та ін.
Паралельно з C# на особливу увагу заслуговує і інтегроване середовище розробки Visual Studio. Microsoft Visual Studio (Visual Studio) – серія продуктів фірми Майкрософт, які включають інтегроване середовище розробки програмного забезпечення та ряд інших інструментальних засобів. Visual Studio дозволяє розробляти як консольні програми, так і програми з графічним інтерфейсом (в т.ч. з підтримкою Windows Forms та WPF), а також веб-сайти, веб-додатки та веб-служби. За замовчуванням підтримуються такі платформи: Microsoft Windows, Windows Mobile, Windows Phone, Windows CE (варіант операційної системи Microsoft Windows для кишенькових комп'ютерів, мобільних телефонів і вбудованих систем).
2. АЛГОРИТМ РОБОТИ
Першим кроком для початку роботи з програмою - вибір файлу для якого користувач хоче дізнатись інформації. Завантаження відбувається лише для файлів формату PE. Якщо файл, вибраний користувачем, використовується іншим процесом, на екрані появляється повідомлення про неможливість його завантаження і пропозиція вибору іншого. Якщо завантаження відбулось успішно, вибраний файл буде зчитано в масив байтів. Далі відбувається пошук бібліотек. Якщо бібліотек не знайдено виводиться повідомлення про відсутність бібліотек, в іншому випадку знайдені dll бібліотеки виводяться на екран з їх шляхом розташування, записуються для подальшого перегляду в інтернеті, заповнюється інформація про заголовок, створюється шістнадцятковий перегляд файлу. Користувач може переміщуватись між панелями меню для перегляду зацікавленої інформації.
У додатку А представлена блок-схема роботи цього алгоритму.
3. РОЗРОБКА ПРОГРАМИ
Програма має такі основні функції функції:
Збір використаних dll бібліотек
Вивід інформації про заголовок файлу
Створення переглядача файлу у шістнадцятковому представленні
Зчитування файлу
Пошук бібліотеки в інтернеті
3.1.Збір використаних dll бібліотек
Дана функція повертає список з усіма використаними dll бібліотеками в програмі, а також їх розташуванням на комп’ютері.
public List<string> getDll()
{
List<string> list = new List<string>();
byte[] buf_read = ReadFile();
int old_index = 0;
for (int i = 0; i < buf_read.Length; i++)
{
int? index = find_dll(buf_read, i);
if (index == null) return list;
else
{
string tmp = GetNameDll(buf_read, (int)index);
if (tmp != "")
{
tmp += _dll;
if(!nameDll.Contains(tmp))
nameDll.Add(tmp);
string checkPath = Environment.ExpandEnvironmentVariables("%systemroot%") + @"\System32\" + tmp;
if (File.Exists(checkPath))
tmp += " \t[" + checkPath + "]";
list.Add(tmp);
}
}
old_index = (int)index;
i = (int)index;
}
list.Sort();
return list;
}
Функція ReadFile відкриває вибраний користувачем файл для читання і перетворює його в масив байт.
byte[] ReadFile()
{
using (FileStream file = new FileStream(path, FileMode.Open))
{
byte[] buf = new byte[file.Length];
file.Read(buf, 0, (int)file.Length);
return buf;
}
}
Функція find_dll шукає індекс появи в масиві байт строки .dll або .DLL.
public int? find_dll(byte[] buf_read, int start)
{
for (int i = start; i < buf_read.Length - 4; i++)
{
byte[] temp = CopyByte(buf_read, i);
if (equal(temp, mask_dll) || equal(temp, Mask_dll))
{
return i;
}
}
return null;
}
Функція CopyByte копіює байти з файлу в тимчасовий масив.
byte[] CopyByte(byte[] buf, int st, int count = 4)
{
byte[] temp = new byte[count];
for (int i = 0; i < count; i++)
{
temp[i] = buf[st + i];
}
return temp;
}
Функція equal порівнює значення двох масивів.
bool equal(byte[] a, byte[] b)
{
for (int i = 0; i < a.Length; i++)
{
if (a[i] != b[i]) return false;
}
return true;
}
Функція GetNameDll повертає назву бібліотеки.
string GetNameDll(byte[] buf, int index)
{
string outStr = "";
for (int i = index - 1; ; i--)
{
char? tmp = check(buf[i]);
if (tmp == null) return outStr;
else
{
outStr = tmp + outStr;
}
}
}
Функція check перевіряє чи байт дорівнює числу, великій чи малій літері згідно таблиці ASCII.
char? check(byte arg)
{
if ((arg >= 65 && arg <= 90)
|| (arg >= 97 && arg <= 122)
|| (arg >= 48 && arg <= 57)
|| (arg == (byte)'_')
|| (arg == (byte)'-'))
{
return (char?)arg;
}
return null;
}
3.2. Вивід інформації про заголовок файлу
Дана функція повертає список з інформацією про заголовок файлу.
public List<string> getInfo()
{
List<string> list = new List<string>();
byte[] buf_read = ReadFile();
int index = find_mask(buf_read, 0, mask_pe_h);
byte[] numb = CopyByte(buf_read, index + 6, 2);
list.Add("NumberOfSections= " + BitConverter.ToInt16(numb, 0));
numb = CopyByte(buf_read, index + 4, 2);
list.Add("Machine Types= " + MachineTypes[BitConverter.ToUInt16(numb, 0)]);
numb = CopyByte(buf_read, index + 24, 2);
list.Add("Magic= " + (BitConverter.ToUInt16(numb, 0) == 0x10b ? "x32" : "x64"));
numb = CopyByte(buf_read, index + 79, 4);
list.Add("SizeOfImage= " + (BitConverter.ToInt32(numb, 0) / 256) + " B");
numb = CopyByte(buf_read, index + 83, 4);
list.Add("SizeOfHeaders= " + (BitConverter.ToInt32(numb, 0) / 256) + " B");
numb = CopyByte(buf_read, index + 91, 2);
list.Add("Subsystem= " + Subsystem[BitConverter.ToUInt16(numb, 0) / 256]);
numb = CopyByte(buf_read, index + 20, 2);
list.Add("SizeOfOptionalHeaders= " + BitConverter.ToUInt16(numb, 0) + " B");
numb = CopyByte(buf_read, index + 28, 4);
list.Add("SizeOfCode= " + $"{BitConverter.ToUInt32(numb, 0)}" + " B");
numb = CopyByte(buf_read, index + 32, 4);
list.Add("SizeOfInitializedData= " + $"{BitConverter.ToUInt32(numb, 0)}" + " B");
numb = CopyByte(buf_read, index + 60, 4);
list.Add("File alignment= " + $"{BitConverter.ToUInt32(numb, 0)}");
numb = CopyByte(buf_read, index + 64, 2);
string line = "Operation system version= " + BitConverter.ToInt16(numb, 0);
numb = CopyByte(buf_read, index + 66, 2);
list.Add(line + "." + BitConverter.ToInt16(numb, 0));
numb = CopyByte(buf_read, index + 68, 2);
line = "Image version= " + BitConverter.ToInt16(numb, 0);
numb = CopyByte(buf_read, index + 70, 2);
list.Add(line + "." + BitConverter.ToInt16(numb, 0));
numb = CopyByte(buf_read, index + 72, 2);
line = "Subsystem version= " + BitConverter.ToInt16(numb, 0);
numb = CopyByte(buf_read, index + 74, 2);
list.Add(line + "." + BitConverter.ToInt16(numb, 0));
numb = CopyByte(buf_read, index + 76, 4);
list.Add("Win32 version value = " + $"{BitConverter.ToUInt32(numb, 0)}");
numb = CopyByte(buf_read, index + 88, 4);
list.Add("Checksum = " + $"{BitConverter.ToUInt32(numb, 0)}");
list.Sort();
return list;
}
Функція find_mask знаходить зміщення PE заголовка відносно початку файлу.
public int find_mask(byte[] buf_read, int start, byte[] mask)
{
for (int i = start; i < buf_read.Length - 4; i++)
{
byte[] temp = CopyByte(buf_read, i, mask.Length);
if (equal(temp, mask))
{
return i;
}
}
return 0;
}
3.3. Створення переглядача файлу у шістнадцятковому представленні
Дана функція записує файл у шістнадцятковому вигляді.
public List<string> GetBinary()
{
List<string> retList=new List<string>();
byte[] buf_read = ReadFile();
string line = "";
string end_line = "";
for (int i = 0; i < buf_read.Length; i++)
{
if (end_line.Length == 8)
{
retList.Add(line+end_line);
end_line = "";
line = "";
}
if (line == "")
{
line = $"[{i:d8}]\t";
}
line = line + (buf_read[i] < 16 ? "0" : "")+$"{buf_read[i]:X}\t";
if(buf_read[i] <= 32 || buf_read[i] >= 127 )
{
end_line += ".";
}
else
{
end_line += (char)buf_read[i];
}
}
retList.Add(line + end_line);
using (StreamWriter qwe = new StreamWriter("tmp", false))
{
foreach (var t in retList)
{
qwe.WriteLine(t);
}
}
return retList;
}
3.4. Зчитування файлу
При нажаті на кнопку, файл загружається в програму і виводить результат виконання на екран.
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
if (openFileDialog.ShowDialog() == DialogResult.Cancel)
return;
pathTextBox.Text = openFileDialog.FileName;
try
{
peImport peImport = new peImport(openFileDialog.FileName);
List<string> temp = peImport.getDll() ;
if (temp.Count > 0)
{
dllListBox.DataSource = temp;
headerInfoListBox.DataSource = peImport.getInfo();
dllComboBox.DataSource = peImport.nameDll;
hexlist = peImport.GetBinary();
if (File.Exists("tmp"))
{
string bigFile = File.ReadAllText("tmp");
hexBrowserListBox.AppendText(bigFile);
File.Delete("tmp");
}
}
else
{
dllListBox.Items.Add($"Файл '{peImport.path}' не містить імпортованих бібліотек");
}
}
catch
{
MessageBox.Show("Неможливо отримати доступ, даний файл використовується іншим процесом", "Помилка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
3.5. Пошук бібліотеки в інтернеті
При нажаті на кнопку, якщо кількість бібліотек більше нуля, тоді в інтернеті буде пошук вибраної бібліотеки.
private void searchButtonClick(object sender, EventArgs e)
{
if (dllComboBox.Items.Count > 0)
Process.Start("https://www.google.com.ua/search?q=" + dllComboBox.Items[dllComboBox.SelectedIndex]);
}
4. ТЕСТУВАННЯ
Тестування проводились на операційній системі Windows.
4.1. Виявлення помилок при спільному використанні програми
До помилок на цьому етапі відносяться помилки програмного коду, який супроводжується некоректним виконанням і як наслідок самостійним завершенням програми. Як видно з рисунку програма не закінчила свою роботу, лише повідомила про помилку:
/
Рис.4.1. Вікно програми з коректною реакцією
4.2. Виявлення помилок при пошуку бібліотеки в інтернеті
До помилок на цьому етапі відносяться помилки програмного коду, який супроводжується некоректним виконанням пошуку бібліотеки. Як видно з рисунку програма виконує інструкції правильно:
/
Рис. 4.2. Вікно програми з правильним результатом
4.3. Виявлення помилок при створенні шістнадцяткового переглядача
До помилок на цьому етапі відносяться помилки програмного коду, який супроводжується некоректним виконанням створення і перегляду файлу у шістнадцятковому представленні. Як видно з рисунку програма виконується правильно:
/
Рис.4.3. Вікно програми з правильним представленням
4.4. Порівняльне тестування
Проведемо порівняльне тестування з програмою MiTeC EXE Explorer. Як бачимо дві програми показали однаковий результат.
/
Рис.4.4.1. Вікно створеної програми
/
Рис.4.4.2. Вікно програми MiTeC EXE Explorer
5. ОПИС ІНТЕРФЕЙСУ ТА ІНСТРУКЦІЇ КОРИСТУВАЧА
Утиліту «Перегляд інформації файлів PE формату» можна запустити з виконавчого файлу kursova_pe_info. Для її запуску потрібна операційна система Windows.
/
Рис.5.1 Головне вікно програми
В утиліті присутні наступні функції:
Завантаження PE файлів
Перегляд інформації про заголовок файлу
Вивід dll бібліотек, які використовуються
Вивід інформації про місцезнаходження бібліотек
Пошук інформації про бібліотеки в інтернеті
Перегляд файлу у шістнадцятковому представленні
/
Рис.5.2. Головне вікно програми після завантаження файлу
Натискаючи на меню, користувач може дізнаватись інформацію, яка його зацікавила.
ВИСНОВКИ
Під час виконання даного курсового проекту було реалізовано утиліту «Перегляд інформації файлів PE формату» з можливістю роботи з файлами PE формату, виявлення динамічно завантажувальних бібліотек, пошуку бібліотек в інтернеті, перегляду файлу в шістнадцятковому представленні та інформації про заголовок файлу. Також було проведене тестування всіх модулів, яке підтвердило, що весь код, який міг призвести до помилок опрацьований і дозволяє працювати програмі коректно.
Під час виконання курсового проекту було засвоєно структуру файлів PE формату. Також надано інструкцію користувачеві та описано вимоги, які задовольняє даний проект, місце та можливість його застосування.
СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ
Russell Osterlund: What Goes On Inside Windows 2000: Solving the Mysteries of the Loader. MSDN Magazine, March 2002.
Matt Pietrek: An In-Depth Look into the Win32 Portable Executable File Format. MSDN Magazine, April-March 2002.
Matt Pietrek: Optimizing DLL Load Time Performance. MSDN Magazine, May 2000.
B. Luevelsmeyer: The PE file format, 1999.
Matt Pietrek: Peering Inside the PE: A Tour of the Win32 Portable Executable File Format. MSDN Magazine, March 1994.
Randy Kath: Исследование переносимого формата исполнимых файлов "сверху вниз" (в переводе).
Microsoft Corporation: Microsoft Portable Executable and Common Object File Format Specification, Revision 6.0 - February 1999.
Jeffrey Richter: Programming Applications for Microsoft Windows.
ДОДАТКИ
Додаток А
Блок-схема алгоритму виконання програми
Додаток Б
Текст програми
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace kursova_pe_info
{
class peImport
{
public string path { get; }
static byte[] Mask_dll = new byte[] { 46, 68, 76, 76 };
static byte[] mask_dll = new byte[] { 46, 100, 108, 108 };
static byte[] mask_pe_h = new byte[] { 0x50, 0x45, 0x0, 0x0 };
static Dictionary<ushort, string> MachineTypes = new Dictionary<ushort, string>()
{
{ 0x0,"The contents of this field are assumed to be applicable to any machine type"},
{ 0x1d3,"Matsushita AM33"},
{ 0x8664,"x64"},
{ 0x1c0,"ARM little endian"},
{ 0xaa64,"ARM64 little endian"},
{ 0x1c4,"ARM Thumb-2 little endian"},
{ 0xebc,"EFI byte code"},
{ 0x14c,"Intel 386 or later processors and compatible processors"},
{ 0x200,"Intel Itanium processor family"},
{ 0x9041,"Mitsubishi M32R little endian"},
{ 0x266,"MIPS16"},
{ 0x366,"MIPS with FPU"},
{ 0x466,"MIPS16 with FPU"},
{ 0x1f0,"Power PC little endian"},
{ 0x1f1,"Power PC with floating point support"},
{ 0x166,"MIPS little endian"},
{ 0x5032,"RISC-V 32-bit address space"},
{ 0x5064,"RISC-V 64-bit address space"},
{ 0x5128,"RISC-V 128-bit address space"},
{ 0x1a2,"Hitachi SH3"},
{ 0x1a3,"Hitachi SH3 DSP"},
{ 0x1a6,"Hitachi SH4"},
{ 0x1a8,"Hitachi SH5"},
{ 0x1c2,"Thumb"},
{ 0x169,"MIPS little-endian WCE v2"}
};
static Dictionary<int, string> Subsystem = new Dictionary<int, string>()
{
{ 0,"An unknown subsystem"},
{ 1,"Device drivers and native Windows processes"},
{ 2,"The Windows graphical user interface (GUI) subsystem"},
{ 3,"The Windows character subsystem"},
{ 5,"The OS/2 character subsystem"},
{ 7,"The Posix character subsystem"},
{ 8,"Native Win9x driver"},
{ 9,"Windows CE"},
{ 10,"An Extensible Firmware Interface (EFI) application"},
{ 11,"An EFI driver with boot services"},
{ 12,"An EFI driver with run-time services"},
{ 13,"An EFI ROM image"},
{ 14,"XBOX"},
{ 16,"Windows boot application."}
};
private static string _dll = ".dll";
public peImport(string Path)
{
path = Path;
}
bool equal(byte[] a, byte[] b)
{
for (int i = 0; i < a.Length; i++)
{
if (a[i] != b[i]) return false;
}
return true;
}
byte[] CopyByte(byte[] buf, int st, int count = 4)
{
byte[] temp = new byte[count];
for (int i = 0; i < count; i++)
{
temp[i] = buf[st + i];
}
return temp;
}
public int? find_dll(byte[] buf_read, int start)
{
for (int i = start; i < buf_read.Length - 4; i++)
{
byte[] temp = CopyByte(buf_read, i);
if (equal(temp, mask_dll) || equal(temp, Mask_dll))
{
return i;
}
}
return null;
}
public int find_mask(byte[] buf_read, int start, byte[] mask)
{
for (int i = start; i < buf_read.Length - 4; i++)
{
byte[] temp = CopyByte(buf_read, i, mask.Length);
if (equal(temp, mask))
{
return i;
}
}
return 0;
}
char? check(byte arg)
{
if ((arg >= 65 && arg <= 90)
|| (arg >= 97 && arg <= 122)
|| (arg >= 48 && arg <= 57)
|| (arg == (byte)'_')
|| (arg == (byte)'-'))
{
return (char?)arg;
}
return null;
}
byte[] ReadFile()
{
using (FileStream file = new FileStream(path, FileMode.Open))
{
byte[] buf = new byte[file.Length];
file.Read(buf, 0, (int)file.Length);
return buf;
}
}
string GetNameDll(byte[] buf, int index)
{
string outStr = "";
for (int i = index - 1; ; i--)
{
char? tmp = check(buf[i]);
if (tmp == null) return outStr;
else
{
outStr = tmp + outStr;
}
}
}
public List<string> getInfo()
{
List<string> list = new List<string>();
byte[] buf_read = ReadFile();
int index = find_mask(buf_read, 0, mask_pe_h);
byte[] numb = CopyByte(buf_read, index + 6, 2);
list.Add("NumberOfSections= " + BitConverter.ToInt16(numb, 0));
numb = CopyByte(buf_read, index + 4, 2);
list.Add("Machine Types= " + MachineTypes