From b31f797f55e4eb48b7cc84009e32f220f7d40c33 Mon Sep 17 00:00:00 2001 From: rukaimi <rukaimi@985867f9-ca9c-e1f6-822d-e8a4186388af> Date: Sat, 8 Sep 2012 20:58:04 +0000 Subject: [PATCH] Fixed sample settings Converted all samples with russian comments to UTF-8 Other small fixes --- pe_lib/pe_base.h | 3 +- samples/address_convertions/main.cpp | 24 ++-- samples/basic_dotnet_viewer/main.cpp | 30 ++--- samples/basic_info_viewer/main.cpp | 32 ++--- samples/bound_import_reader/main.cpp | 28 ++-- samples/debug_info_reader/main.cpp | 56 ++++---- samples/entropy_calculator/main.cpp | 18 +-- samples/exception_dir_reader/main.cpp | 24 ++-- samples/export_adder/export_adder.vcproj | 52 ++++---- samples/export_adder/main.cpp | 60 ++++----- samples/exports_reader/main.cpp | 32 ++--- samples/import_adder/main.cpp | 62 ++++----- samples/imports_reader/main.cpp | 34 ++--- samples/pe_config_reader/main.cpp | 18 +-- samples/pe_realigner/main.cpp | 22 ++-- samples/pe_rebaser/main.cpp | 22 ++-- samples/pe_sections_reader/main.cpp | 26 ++-- samples/pe_stripper/main.cpp | 26 ++-- samples/relocation_adder/main.cpp | 54 ++++---- samples/relocations_reader/main.cpp | 22 ++-- samples/resource_editor/main.cpp | 148 +++++++++++----------- samples/resource_viewer/main.cpp | 130 +++++++++---------- samples/rich_overlay_stub_reader/main.cpp | 18 +-- samples/section_adder/main.cpp | 32 ++--- samples/sections_and_addresses/main.cpp | 18 +-- samples/tls_editor/main.cpp | 59 ++++----- samples/tls_reader/main.cpp | 18 +-- 27 files changed, 533 insertions(+), 535 deletions(-) diff --git a/pe_lib/pe_base.h b/pe_lib/pe_base.h index 7648c7b..8bb53cc 100644 --- a/pe_lib/pe_base.h +++ b/pe_lib/pe_base.h @@ -12,10 +12,11 @@ //Please don't remove this information from header //PE Library (c) DX 2011 - 2012, http://kaimi.ru +//Version: 0.1.1 //Free to use, modify and distribute // == more important == -//TODO: relocations that take more than one element +//TODO: relocations that take more than one element (seems to be not possible in Windows PE, but anyway) //TODO: create sample-based tests //== less important == //TODO: delay import directory diff --git a/samples/address_convertions/main.cpp b/samples/address_convertions/main.cpp index 24bf08c..14d2144 100644 --- a/samples/address_convertions/main.cpp +++ b/samples/address_convertions/main.cpp @@ -1,9 +1,9 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include "lib.h" -//Пример, показывающий, как конвертировать адреса для PE-файла +//Пример, показывающий, как конвертировать адреса для PE-файла int main(int argc, char* argv[]) { if(argc != 2) @@ -12,7 +12,7 @@ int main(int argc, char* argv[]) return 0; } - //Открываем файл + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -22,27 +22,27 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); - //Получаем список секций + //Получаем СЃРїРёСЃРѕРє секций std::cout << "Reading PE sections..." << std::hex << std::showbase << std::endl << std::endl; const pe_base::section_list sections = image->get_image_sections(); - //Перечисляем секции и выводим информацию о них + //Перечисляем секции Рё выводим информацию Рѕ РЅРёС… for(pe_base::section_list::const_iterator it = sections.begin(); it != sections.end(); ++it) { - const pe_base::section& s = *it; //Секция - std::cout << "Section [" << s.get_name() << "]" << std::endl //Имя секции - << " -> RVA: " << s.get_virtual_address() << std::endl //Виртуальный адрес (RVA) - << " -> VA: " << image->rva_to_va_64(s.get_virtual_address()) << std::endl //Виртуальный адрес (VA) - << " -> File offset: " << image->rva_to_file_offset(s.get_virtual_address()) //Файловое смещение секции, вычисленное из ее RVA + const pe_base::section& s = *it; //Секция + std::cout << "Section [" << s.get_name() << "]" << std::endl //РРјСЏ секции + << " -> RVA: " << s.get_virtual_address() << std::endl //Виртуальный адрес (RVA) + << " -> VA: " << image->rva_to_va_64(s.get_virtual_address()) << std::endl //Виртуальный адрес (VA) + << " -> File offset: " << image->rva_to_file_offset(s.get_virtual_address()) //Файловое смещение секции, вычисленное РёР· ее RVA << std::endl << std::endl; } } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/basic_dotnet_viewer/main.cpp b/samples/basic_dotnet_viewer/main.cpp index 4715d81..b72bcc7 100644 --- a/samples/basic_dotnet_viewer/main.cpp +++ b/samples/basic_dotnet_viewer/main.cpp @@ -1,9 +1,9 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include "lib.h" -//Пример, показывающий, как получить базовую информацию о .NET PE-файле +//Пример, показывающий, как получить базовую информацию Рѕ .NET PE-файле int main(int argc, char* argv[]) { if(argc != 2) @@ -12,7 +12,7 @@ int main(int argc, char* argv[]) return 0; } - //Открываем файл + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -22,10 +22,10 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); - //Если образ не .NET, выходим + //Если образ РЅРµ .NET, выходим if(!image->is_dotnet()) { std::cout << "Image is not .NET" << std::endl; @@ -34,19 +34,19 @@ int main(int argc, char* argv[]) std::cout << "Reading basic dotnet info..." << std::hex << std::showbase << std::endl << std::endl; - //Получаем .NET-заголовок PE-файла + //Получаем .NET-заголовок PE-файла const pe_base::basic_dotnet_info info(image->get_basic_dotnet_info()); - //Выводим некоторую информацию - std::cout << "Major runtime version: " << info.get_major_runtime_version() << std::endl //Версия рантайма + //Выводим некоторую информацию + std::cout << "Major runtime version: " << info.get_major_runtime_version() << std::endl //Версия рантайма << "Minor runtime version: " << info.get_minor_runtime_version() << std::endl - << "Flags: " << info.get_flags() << std::endl //Флаги - << "RVA of resources: " << info.get_rva_of_resources() << std::endl //RVA ресурсов - << "RVA of metadata: " << info.get_rva_of_metadata() << std::endl //RVA метаданных - << "Size of resources: " << info.get_size_of_resources() << std::endl //Размер ресурсов - << "Size of metadata: " << info.get_size_of_metadata() << std::endl; //Размер метаданных + << "Flags: " << info.get_flags() << std::endl //Флаги + << "RVA of resources: " << info.get_rva_of_resources() << std::endl //RVA ресурсов + << "RVA of metadata: " << info.get_rva_of_metadata() << std::endl //RVA метаданных + << "Size of resources: " << info.get_size_of_resources() << std::endl //Размер ресурсов + << "Size of metadata: " << info.get_size_of_metadata() << std::endl; //Размер метаданных - //Определим точку входа .NET + //Определим точку РІС…РѕРґР° .NET if(info.is_native_entry_point()) std::cout << "Entry point RVA: "; else @@ -56,7 +56,7 @@ int main(int argc, char* argv[]) } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/basic_info_viewer/main.cpp b/samples/basic_info_viewer/main.cpp index 7676b83..e882af7 100644 --- a/samples/basic_info_viewer/main.cpp +++ b/samples/basic_info_viewer/main.cpp @@ -1,9 +1,9 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include "lib.h" -//Пример, показывающий, как получить базовую информацию о PE-файле +//Пример, показывающий, как получить базовую информацию Рѕ PE-файле int main(int argc, char* argv[]) { if(argc != 2) @@ -12,7 +12,7 @@ int main(int argc, char* argv[]) return 0; } - //Открываем файл + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -22,38 +22,38 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); - //Фабрика автоматически получает тип PE-файла и создает экземпляр нужного класса, - //но можно получить тип PE-файла и вручную, воспользовавшись одной из перегрузок функции get_pe_type - //Здесь мы просто выведем уже известный тип PE-файла: + //Фабрика автоматически получает тип PE-файла Рё создает экземпляр нужного класса, + //РЅРѕ можно получить тип PE-файла Рё вручную, воспользовавшись РѕРґРЅРѕР№ РёР· перегрузок функции get_pe_type + //Здесь РјС‹ просто выведем уже известный тип PE-файла: std::cout << "PE file type: " << (image->get_pe_type() == pe_base::pe_type_32 ? "PE32 (PE)" : "PE64 (PE+)") << std::endl; - //Вычислим контрольную сумму PE-файла + //Вычислим контрольную СЃСѓРјРјСѓ PE-файла std::cout << "Calculated checksum: "<< std::hex << std::showbase << pe_base::calculate_checksum(pe_file) << std::endl; - //Выведем контрольную сумму из заголовка файла (для не-драйверов она обычно равна 0) + //Выведем контрольную СЃСѓРјРјСѓ РёР· заголовка файла (для РЅРµ-драйверов РѕРЅР° обычно равна 0) std::cout << "Stored checksum: " << image->get_checksum() << std::endl; - //Выведем характеристики PE-файла + //Выведем характеристики PE-файла std::cout << "Characteristics: " << image->get_characteristics() << std::endl; - //Выведем адрес точки входа + //Выведем адрес точки РІС…РѕРґР° std::cout << "Entry point: " << image->get_ep() << std::endl; - //Выведем выравнивание + //Выведем выравнивание std::cout << "File alignment: " << image->get_file_alignment() << std::endl; std::cout << "Section alignment: " << image->get_section_alignment() << std::endl; - //Выведем базу образа в 64-битном виде (универсально для PE и PE+) + //Выведем базу образа РІ 64-битном РІРёРґРµ (универсально для PE Рё PE+) std::cout << "Image base: " << image->get_image_base_64() << std::endl; - //Выведем подсистему + //Выведем подсистему std::cout << "Subsystem: " << image->get_subsystem() << std::endl; std::cout << "Is console: " << (image->is_console() ? "YES" : "NO") << std::endl; std::cout << "Is windows GUI: " << (image->is_gui() ? "YES" : "NO") << std::endl; - //Выведем, какие директории есть у файла + //Выведем, какие директории есть Сѓ файла std::cout << "Has bound import: " << (image->has_bound_import() ? "YES" : "NO") << std::endl; std::cout << "Has config: " << (image->has_config() ? "YES" : "NO") << std::endl; std::cout << "Has debug: " << (image->has_debug() ? "YES" : "NO") << std::endl; @@ -69,7 +69,7 @@ int main(int argc, char* argv[]) } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/bound_import_reader/main.cpp b/samples/bound_import_reader/main.cpp index d162fc9..7255c51 100644 --- a/samples/bound_import_reader/main.cpp +++ b/samples/bound_import_reader/main.cpp @@ -1,9 +1,9 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include "lib.h" -//Пример, показывающий, как считать и получить информацию о привязанном импорте PE-файла +//Пример, показывающий, как считать Рё получить информацию Рѕ привязанном импорте PE-файла int main(int argc, char* argv[]) { if(argc != 2) @@ -12,7 +12,7 @@ int main(int argc, char* argv[]) return 0; } - //Открываем файл + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -22,10 +22,10 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); - //Проверим, есть ли привязанный импорт у PE-файла + //Проверим, есть ли привязанный РёРјРїРѕСЂС‚ Сѓ PE-файла if(!image->has_bound_import()) { std::cout << "Image has no bound import" << std::endl; @@ -34,28 +34,28 @@ int main(int argc, char* argv[]) std::cout << "Reading PE bound import..." << std::hex << std::showbase << std::endl << std::endl; - //Получаем информацию о привязанном импорте + //Получаем информацию Рѕ привязанном импорте const pe_base::bound_import_module_list modules = image->get_bound_import_module_list(); - //Выведем импортируемые модули и форварды + //Выведем импортируемые модули Рё форварды for(pe_base::bound_import_module_list::const_iterator it = modules.begin(); it != modules.end(); ++it) { - const pe_base::bound_import& import = *it; //Импортируемая библиотека - std::cout << "Module: " << import.get_module_name() << std::endl //Имя модуля - << "Timestamp: " << import.get_timestamp() << std::endl; //Временная метка + const pe_base::bound_import& import = *it; //Рмпортируемая библиотека + std::cout << "Module: " << import.get_module_name() << std::endl //РРјСЏ модуля + << "Timestamp: " << import.get_timestamp() << std::endl; //Временная метка - //Перечислим форварды для модуля - модули, на которые ссылается этот: + //Перечислим форварды для модуля - модули, РЅР° которые ссылается этот: const pe_base::bound_import::ref_list& refs = import.get_module_ref_list(); for(pe_base::bound_import::ref_list::const_iterator ref_it = refs.begin(); ref_it != refs.end(); ++ref_it) { - std::cout << " -> Module: " << (*ref_it).get_module_name() << std::endl //Имя модуля, на который ссылается родительский модуль - << " -> Timestamp: " << (*ref_it).get_timestamp() << std::endl; //Временная метка + std::cout << " -> Module: " << (*ref_it).get_module_name() << std::endl //РРјСЏ модуля, РЅР° который ссылается родительский модуль + << " -> Timestamp: " << (*ref_it).get_timestamp() << std::endl; //Временная метка } } } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/debug_info_reader/main.cpp b/samples/debug_info_reader/main.cpp index ba33402..abf93e5 100644 --- a/samples/debug_info_reader/main.cpp +++ b/samples/debug_info_reader/main.cpp @@ -1,9 +1,9 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include "lib.h" -//Пример, показывающий, как считать и обработать отладочную информацию PE или PE+ файла +//Пример, показывающий, как считать Рё обработать отладочную информацию PE или PE+ файла int main(int argc, char* argv[]) { if(argc != 2) @@ -12,7 +12,7 @@ int main(int argc, char* argv[]) return 0; } - //Открываем файл + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -22,10 +22,10 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); - //Проверим, есть ли отладочная информация у файла + //Проверим, есть ли отладочная информация Сѓ файла if(!image->has_debug()) { std::cout << "Image has no debug information" << std::endl; @@ -34,15 +34,15 @@ int main(int argc, char* argv[]) std::cout << "Reading PE debug information..." << std::hex << std::showbase << std::endl << std::endl; - //Получаем отладочную информацию, находящуюся в PE-файле + //Получаем отладочную информацию, находящуюся РІ PE-файле const pe_base::debug_info_list info_list = image->get_debug_information(); - //Перечисоляем все отладочные записи + //Перечисоляем РІСЃРµ отладочные записи for(pe_base::debug_info_list::const_iterator it = info_list.begin(); it != info_list.end(); ++it) { const pe_base::debug_info& info = *it; - //Выведем тип отладочной информации + //Выведем тип отладочной информации std::cout << "Debug info type: "; switch(info.get_type()) { @@ -92,17 +92,17 @@ int main(int argc, char* argv[]) std::cout << std::endl; - std::cout << "Timestamp: " << info.get_time_stamp() << std::endl << std::endl; //Временная метка + std::cout << "Timestamp: " << info.get_time_stamp() << std::endl << std::endl; //Временная метка - //Получим дополнительную информацию, если таковая имеется + //Получим дополнительную информацию, если таковая имеется switch(info.get_advanced_info_type()) { case pe_base::debug_info::advanced_info_pdb_7_0: { std::cout << "Advanced info - PDB 7.0" << std::endl; //PDB 7.0 pe_base::pdb_7_0_info advanced = info.get_advanced_debug_info<pe_base::pdb_7_0_info>(); - std::cout << "PDB file name: " << advanced.get_pdb_file_name() << std::endl; //Имя файла PDB - std::cout << "Age: " << advanced.get_age() << std::endl; //Возраст (билд) + std::cout << "PDB file name: " << advanced.get_pdb_file_name() << std::endl; //РРјСЏ файла PDB + std::cout << "Age: " << advanced.get_age() << std::endl; //Возраст (билд) } break; @@ -110,8 +110,8 @@ int main(int argc, char* argv[]) { std::cout << "Advanced info - PDB 2.0" << std::endl; //PDB 2.0 pe_base::pdb_2_0_info advanced = info.get_advanced_debug_info<pe_base::pdb_2_0_info>(); - std::cout << "PDB file name: " << advanced.get_pdb_file_name() << std::endl; //Имя файла PDB - std::cout << "Age: " << advanced.get_age() << std::endl; //Возраст (билд) + std::cout << "PDB file name: " << advanced.get_pdb_file_name() << std::endl; //РРјСЏ файла PDB + std::cout << "Age: " << advanced.get_age() << std::endl; //Возраст (билд) } break; @@ -119,9 +119,9 @@ int main(int argc, char* argv[]) { std::cout << "Advanced info - Misc" << std::endl; //Misc pe_base::misc_debug_info advanced = info.get_advanced_debug_info<pe_base::misc_debug_info>(); - std::cout << "Advanced data is EXE name: " << (advanced.is_exe_name() ? "YES" : "NO") << std::endl; //Если данные в структуре - имя EXE-файла + std::cout << "Advanced data is EXE name: " << (advanced.is_exe_name() ? "YES" : "NO") << std::endl; //Если данные РІ структуре - РёРјСЏ EXE-файла - //Выведем строковые данные + //Выведем строковые данные if(advanced.is_unicode()) std::wcout << advanced.get_data_unicode() << std::endl; else @@ -133,23 +133,23 @@ int main(int argc, char* argv[]) { std::cout << "Advanced info - COFF" << std::endl; //COFF pe_base::coff_debug_info advanced = info.get_advanced_debug_info<pe_base::coff_debug_info>(); - std::cout << "LVA to first line number: " << advanced.get_lva_to_first_line_number() << std::endl; //Адрес первого элемента в массиве номеров строк - std::cout << "LVA to first symbol: " << advanced.get_lva_to_first_symbol() << std::endl; //Адрес первого элемента в массиве символов - std::cout << "Number of line numbers: " << advanced.get_number_of_line_numbers() << std::endl; //Количество номеров строк - std::cout << "Number of symbols: " << advanced.get_number_of_symbols() << std::endl; //Количество номеров строк - std::cout << "RVA of first byte of code: " << advanced.get_rva_to_first_byte_of_code() << std::endl; //RVA первого байта кода - std::cout << "RVA of first byte of data: " << advanced.get_rva_to_first_byte_of_data() << std::endl; //RVA первого байта данных - std::cout << "RVA of last byte of code " << advanced.get_rva_to_last_byte_of_code() << std::endl; //RVA последнего байта кода - std::cout << "RVA of last byte of data: " << advanced.get_rva_to_last_byte_of_data() << std::endl; //RVA последнего байта данных + std::cout << "LVA to first line number: " << advanced.get_lva_to_first_line_number() << std::endl; //Адрес первого элемента РІ массиве номеров строк + std::cout << "LVA to first symbol: " << advanced.get_lva_to_first_symbol() << std::endl; //Адрес первого элемента РІ массиве символов + std::cout << "Number of line numbers: " << advanced.get_number_of_line_numbers() << std::endl; //Количество номеров строк + std::cout << "Number of symbols: " << advanced.get_number_of_symbols() << std::endl; //Количество номеров строк + std::cout << "RVA of first byte of code: " << advanced.get_rva_to_first_byte_of_code() << std::endl; //RVA первого байта РєРѕРґР° + std::cout << "RVA of first byte of data: " << advanced.get_rva_to_first_byte_of_data() << std::endl; //RVA первого байта данных + std::cout << "RVA of last byte of code " << advanced.get_rva_to_last_byte_of_code() << std::endl; //RVA последнего байта РєРѕРґР° + std::cout << "RVA of last byte of data: " << advanced.get_rva_to_last_byte_of_data() << std::endl; //RVA последнего байта данных std::cout << std::endl << "Symbol list:" << std::endl; - //Получим список символов + //Получим СЃРїРёСЃРѕРє символов const pe_base::coff_debug_info::coff_symbols_list& symbols = advanced.get_symbols(); for(pe_base::coff_debug_info::coff_symbols_list::const_iterator symbol_it = symbols.begin(); symbol_it != symbols.end(); ++symbol_it) { - //Выведем информацию об отладочных символах - const pe_base::coff_debug_info::coff_symbol& symbol = *symbol_it; //Отладочный символ + //Выведем информацию РѕР± отладочных символах + const pe_base::coff_debug_info::coff_symbol& symbol = *symbol_it; //Отладочный СЃРёРјРІРѕР» std::cout << "Index: " << symbol.get_index() << std::endl << "RVA: " << symbol.get_rva() << std::endl << "Section number: " << symbol.get_section_number() << std::endl @@ -175,7 +175,7 @@ int main(int argc, char* argv[]) } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/entropy_calculator/main.cpp b/samples/entropy_calculator/main.cpp index e699035..4c32630 100644 --- a/samples/entropy_calculator/main.cpp +++ b/samples/entropy_calculator/main.cpp @@ -1,9 +1,9 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include "lib.h" -//Пример, показывающий, как посчитать энтропию файла и секций PE +//Пример, показывающий, как посчитать энтропию файла Рё секций PE int main(int argc, char* argv[]) { if(argc != 2) @@ -12,7 +12,7 @@ int main(int argc, char* argv[]) return 0; } - //Открываем файл + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -23,25 +23,25 @@ int main(int argc, char* argv[]) try { - //Считаем энтропию файла + //Считаем энтропию файла std::cout << "File entropy: " << pe_base::calculate_entropy(pe_file) << std::endl; - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); - std::cout << "Sections entropy: " << image->calculate_entropy() << std::endl; //Считаем энтропию всех секций + std::cout << "Sections entropy: " << image->calculate_entropy() << std::endl; //Считаем энтропию всех секций - //Перечисляем секции и считаем их энтропию по отдельности + //Перечисляем секции Рё считаем РёС… энтропию РїРѕ отдельности const pe_base::section_list sections = image->get_image_sections(); for(pe_base::section_list::const_iterator it = sections.begin(); it != sections.end(); ++it) { - if(!(*it).empty()) //Если секция не пуста - посчитаем ее энтропию + if(!(*it).empty()) //Если секция РЅРµ пуста - посчитаем ее энтропию std::cout << "Section [" << (*it).get_name() << "] entropy: " << pe_base::calculate_entropy(*it) << std::endl; } } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/exception_dir_reader/main.cpp b/samples/exception_dir_reader/main.cpp index 28408ac..0c8b93f 100644 --- a/samples/exception_dir_reader/main.cpp +++ b/samples/exception_dir_reader/main.cpp @@ -1,10 +1,10 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include "lib.h" -//Пример, показывающий, как считать и получить информацию о директории исключений -//Она существует только для 64-разрядных PE-файлов (PE+) +//Пример, показывающий, как считать Рё получить информацию Рѕ директории исключений +//РћРЅР° существует только для 64-разрядных PE-файлов (PE+) int main(int argc, char* argv[]) { if(argc != 2) @@ -13,7 +13,7 @@ int main(int argc, char* argv[]) return 0; } - //Открываем файл + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -23,10 +23,10 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); - //Проверим, есть ли директория информации об исключениях у PE-файла + //Проверим, есть ли директория информации РѕР± исключениях Сѓ PE-файла if(!image->has_exception_directory()) { std::cout << "Image has no exception directory" << std::endl; @@ -35,16 +35,16 @@ int main(int argc, char* argv[]) std::cout << "Reading exception directory..." << std::hex << std::showbase << std::endl << std::endl; - //Получаем информацию из exception directory + //Получаем информацию РёР· exception directory const pe_base::exception_entry_list info = image->get_exception_directory_data(); - //Выведем записи из exception directory - //Подробное описание всех этих структур есть в MSDN + //Выведем записи РёР· exception directory + //РџРѕРґСЂРѕР±РЅРѕРµ описание всех этих структур есть РІ MSDN for(pe_base::exception_entry_list::const_iterator it = info.begin(); it != info.end(); ++it) { - const pe_base::exception_entry& entry = *it; //Запись из таблицы + const pe_base::exception_entry& entry = *it; //Запись РёР· таблицы - //Выведем информацию + //Выведем информацию std::cout << "Addresses: [" << entry.get_begin_address() << ":" << entry.get_end_address() << "]:" << std::endl << "Flags: " << static_cast<unsigned long>(entry.get_flags()) << std::endl << "Frame pointer register number: " << static_cast<unsigned long>(entry.get_frame_pointer_register_number()) << std::endl @@ -58,7 +58,7 @@ int main(int argc, char* argv[]) } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/export_adder/export_adder.vcproj b/samples/export_adder/export_adder.vcproj index d8ca28e..bfda59c 100644 --- a/samples/export_adder/export_adder.vcproj +++ b/samples/export_adder/export_adder.vcproj @@ -92,12 +92,11 @@ /> </Configuration> <Configuration - Name="Release|Win32" - OutputDirectory="$(SolutionDir)$(ConfigurationName)" - IntermediateDirectory="$(ConfigurationName)" + Name="Debug|x64" + OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)" + IntermediateDirectory="$(PlatformName)\$(ConfigurationName)" ConfigurationType="1" CharacterSet="1" - WholeProgramOptimization="1" > <Tool Name="VCPreBuildEventTool" @@ -113,15 +112,16 @@ /> <Tool Name="VCMIDLTool" + TargetEnvironment="3" /> <Tool Name="VCCLCompilerTool" - Optimization="2" - EnableIntrinsicFunctions="true" + Optimization="0" AdditionalIncludeDirectories="../../pe_lib/;../" - PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" - RuntimeLibrary="0" - EnableFunctionLevelLinking="true" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="1" UsePrecompiledHeader="0" WarningLevel="3" DebugInformationFormat="3" @@ -137,12 +137,10 @@ /> <Tool Name="VCLinkerTool" - LinkIncremental="1" + LinkIncremental="2" GenerateDebugInformation="true" SubSystem="1" - OptimizeReferences="2" - EnableCOMDATFolding="2" - TargetMachine="1" + TargetMachine="17" /> <Tool Name="VCALinkTool" @@ -167,11 +165,12 @@ /> </Configuration> <Configuration - Name="Debug|x64" - OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)" - IntermediateDirectory="$(PlatformName)\$(ConfigurationName)" + Name="Release|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" ConfigurationType="1" CharacterSet="1" + WholeProgramOptimization="1" > <Tool Name="VCPreBuildEventTool" @@ -187,16 +186,15 @@ /> <Tool Name="VCMIDLTool" - TargetEnvironment="3" /> <Tool Name="VCCLCompilerTool" - Optimization="0" + Optimization="2" + EnableIntrinsicFunctions="true" AdditionalIncludeDirectories="../../pe_lib/;../" - PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" - MinimalRebuild="true" - BasicRuntimeChecks="3" - RuntimeLibrary="1" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" + RuntimeLibrary="0" + EnableFunctionLevelLinking="true" UsePrecompiledHeader="0" WarningLevel="3" DebugInformationFormat="3" @@ -212,10 +210,12 @@ /> <Tool Name="VCLinkerTool" - LinkIncremental="2" + LinkIncremental="1" GenerateDebugInformation="true" SubSystem="1" - TargetMachine="17" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1" /> <Tool Name="VCALinkTool" @@ -325,7 +325,7 @@ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" > <File - RelativePath="..\lib.h" + RelativePath=".\main.cpp" > </File> </Filter> @@ -335,7 +335,7 @@ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" > <File - RelativePath=".\main.cpp" + RelativePath="..\lib.h" > </File> </Filter> diff --git a/samples/export_adder/main.cpp b/samples/export_adder/main.cpp index 685f772..6187b21 100644 --- a/samples/export_adder/main.cpp +++ b/samples/export_adder/main.cpp @@ -1,9 +1,9 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include "lib.h" -//Пример, показывающий, как добавить новый экспорт в таблицу экспорта PE-файла +//Пример, показывающий, как добавить новый СЌРєСЃРїРѕСЂС‚ РІ таблицу экспорта PE-файла int main(int argc, char* argv[]) { if(argc != 2) @@ -12,7 +12,7 @@ int main(int argc, char* argv[]) return 0; } - //Открываем файл + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -22,52 +22,52 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); - //Получим список экспортируемых функций и информацию об экспорте + //Получим СЃРїРёСЃРѕРє экспортируемых функций Рё информацию РѕР± экспорте pe_base::export_info info; pe_base::exported_functions_list exports; - //Если экспортов у файла нет, этот вызов бросит исключение, но это не значит, что мы - //не можем создать таблицу экспортов с нуля + //Если экспортов Сѓ файла нет, этот вызов Р±СЂРѕСЃРёС‚ исключение, РЅРѕ это РЅРµ значит, что РјС‹ + //РЅРµ можем создать таблицу экспортов СЃ нуля try { exports = image->get_exported_functions(info); } catch(const pe_exception&) { - //Нет таблицы экспортов, или она кривая - //Создадим информацию об экспортах вручную + //Нет таблицы экспортов, или РѕРЅР° кривая + //Создадим информацию РѕР± экспортах вручную info.set_name("MySuperLib.dll"); info.set_ordinal_base(5); } - //Создаем новую экспортируемую функцию + //Создаем РЅРѕРІСѓСЋ экспортируемую функцию pe_base::exported_function func; - func.set_name("SuperKernelCall"); //Имя экспортируемой функции - func.set_rva(0x123); //Относительный адрес точки входа экспортируемой функции (некорректный, чисто для примера) + func.set_name("SuperKernelCall"); //РРјСЏ экспортируемой функции + func.set_rva(0x123); //Относительный адрес точки РІС…РѕРґР° экспортируемой функции (некорректный, чисто для примера) - //Необходимо вычислить ординал функции, которую мы добавляем, чтобы не было повторных - //Для этого есть вспомогательная функция - func.set_ordinal(pe_base::get_export_ordinal_limits(exports).second + 1); //Сделаем наш ординал = максимальный ординал среди существующих экспортов + 1 - exports.push_back(func); //Добавим функцию к экспортам + //Необходимо вычислить ординал функции, которую РјС‹ добавляем, чтобы РЅРµ было повторных + //Для этого есть вспомогательная функция + func.set_ordinal(pe_base::get_export_ordinal_limits(exports).second + 1); //Сделаем наш ординал = максимальный ординал среди существующих экспортов + 1 + exports.push_back(func); //Добавим функцию Рє экспортам - //Можно редактировать и существующие экспорты - //или изменить информацию об экспортах (info) - //Но мы просто пересоберем таблицу экспортов - //Она будет иметь больший размер, чем до нашего редактирования, - //поэтому запишем ее в новую секцию, чтобы все поместилось - //(мы не можем расширять существующие секции, если только секция не в самом конце файла) + //Можно редактировать Рё существующие экспорты + //или изменить информацию РѕР± экспортах (info) + //РќРѕ РјС‹ просто пересоберем таблицу экспортов + //РћРЅР° будет иметь больший размер, чем РґРѕ нашего редактирования, + //поэтому запишем ее РІ РЅРѕРІСѓСЋ секцию, чтобы РІСЃРµ поместилось + //(РјС‹ РЅРµ можем расширять существующие секции, если только секция РЅРµ РІ самом конце файла) pe_base::section new_exports; - new_exports.get_raw_data().resize(1); //Мы не можем добавлять пустые секции, поэтому пусть у нее будет начальный размер данных 1 - new_exports.set_name("new_exp"); //Имя секции - new_exports.readable(true); //Доступна на чтение - pe_base::section& attached_section = image->add_section(new_exports); //Добавим секцию и получим ссылку на добавленную секцию с просчитанными размерами + new_exports.get_raw_data().resize(1); //РњС‹ РЅРµ можем добавлять пустые секции, поэтому пусть Сѓ нее будет начальный размер данных 1 + new_exports.set_name("new_exp"); //РРјСЏ секции + new_exports.readable(true); //Доступна РЅР° чтение + pe_base::section& attached_section = image->add_section(new_exports); //Добавим секцию Рё получим ссылку РЅР° добавленную секцию СЃ просчитанными размерами - image->rebuild_exports(info, exports, attached_section); //Пересобираем экспорты, расположив их с начала новой секции и записав новые данные таблиц экспорта в PE-заголовок + image->rebuild_exports(info, exports, attached_section); //Пересобираем экспорты, расположив РёС… СЃ начала РЅРѕРІРѕР№ секции Рё записав новые данные таблиц экспорта РІ PE-заголовок - //Создаем новый PE-файл + //Создаем новый PE-файл std::string base_file_name(argv[1]); std::string::size_type slash_pos; if((slash_pos = base_file_name.find_last_of("/\\")) != std::string::npos) @@ -81,14 +81,14 @@ int main(int argc, char* argv[]) return -1; } - //Пересобираем PE-файл + //Пересобираем PE-файл image->rebuild_pe(new_pe_file); std::cout << "PE was rebuilt and saved to " << base_file_name << std::endl; } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/exports_reader/main.cpp b/samples/exports_reader/main.cpp index aa88e7c..f0f53af 100644 --- a/samples/exports_reader/main.cpp +++ b/samples/exports_reader/main.cpp @@ -1,9 +1,9 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include "lib.h" -//Пример, показывающий, как считать и получить информацию об экспортах PE или PE+ файла +//Пример, показывающий, как считать Рё получить информацию РѕР± экспортах PE или PE+ файла int main(int argc, char* argv[]) { if(argc != 2) @@ -12,7 +12,7 @@ int main(int argc, char* argv[]) return 0; } - //Открываем файл + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -22,10 +22,10 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); - //Проверим, есть ли экспорты у PE-файла + //Проверим, есть ли экспорты Сѓ PE-файла if(!image->has_exports()) { std::cout << "Image has no exports" << std::endl; @@ -34,29 +34,29 @@ int main(int argc, char* argv[]) std::cout << "Reading PE exports..." << std::hex << std::showbase << std::endl << std::endl; - //Получаем полную информацию об экспортах и список экспортируемых функций + //Получаем полную информацию РѕР± экспортах Рё СЃРїРёСЃРѕРє экспортируемых функций pe_base::export_info info; const pe_base::exported_functions_list exports = image->get_exported_functions(info); - //Выведем некоторую информацию об экспорте: + //Выведем некоторую информацию РѕР± экспорте: std::cout << "Export info" << std::endl - << "Library name: " << info.get_name() << std::endl //Имя библиотеки - << "Timestamp: " << info.get_timestamp() << std::endl //Временная метка - << "Ordinal base: " << info.get_ordinal_base() << std::endl //База ординалов + << "Library name: " << info.get_name() << std::endl //РРјСЏ библиотеки + << "Timestamp: " << info.get_timestamp() << std::endl //Временная метка + << "Ordinal base: " << info.get_ordinal_base() << std::endl //База ординалов << std::endl; - //Перечисляем секции и выводим информацию о них + //Перечисляем секции Рё выводим информацию Рѕ РЅРёС… for(pe_base::exported_functions_list::const_iterator it = exports.begin(); it != exports.end(); ++it) { - const pe_base::exported_function& func = *it; //Экспортируемая функция + const pe_base::exported_function& func = *it; //Ркспортируемая функция std::cout << "[+] "; - if(func.has_name()) //Если функция имеет имя, выведем его и ординал имени + if(func.has_name()) //Если функция имеет РёРјСЏ, выведем его Рё ординал имени std::cout << func.get_name() << ", name ordinal: " << func.get_name_ordinal() << " "; - //Ординал функции + //Ординал функции std::cout << "ORD: " << func.get_ordinal(); - //Если функция - форвард (переадресация в другую DLL), выведем имя форварда + //Если функция - форвард (переадресация РІ РґСЂСѓРіСѓСЋ DLL), выведем РёРјСЏ форварда if(func.is_forwarded()) std::cout << std::endl << " -> " << func.get_forwarded_name(); @@ -65,7 +65,7 @@ int main(int argc, char* argv[]) } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/import_adder/main.cpp b/samples/import_adder/main.cpp index 1d521c2..a3a5ebe 100644 --- a/samples/import_adder/main.cpp +++ b/samples/import_adder/main.cpp @@ -1,9 +1,9 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include "lib.h" -//Пример, показывающий, как добавить новый импорт в таблицу импорта PE-файла +//Пример, показывающий, как добавить новый РёРјРїРѕСЂС‚ РІ таблицу импорта PE-файла int main(int argc, char* argv[]) { if(argc != 2) @@ -12,7 +12,7 @@ int main(int argc, char* argv[]) return 0; } - //Открываем файл + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -22,50 +22,50 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); - //Получим список импортируемых библиотек и функций + //Получим СЃРїРёСЃРѕРє импортируемых библиотек Рё функций pe_base::imported_functions_list imports = image->get_imported_functions(); - //Создадим новую библиотеку, из которой будем импортировать функции + //Создадим РЅРѕРІСѓСЋ библиотеку, РёР· которой будем импортировать функции pe_base::import_library new_lib; - new_lib.set_name("kaimi_dx.dll"); //Пусть это будет testdll.dll + new_lib.set_name("kaimi_dx.dll"); //Пусть это будет testdll.dll - //Добавим к ней пару импортов функций + //Добавим Рє ней пару импортов функций pe_base::imported_function func; - func.set_name("Tralala"); //Один импорт - по имени Tralala - func.set_iat_va(0x1); //Запишем ненулевой абсолютный адрес import address table + func.set_name("Tralala"); //РћРґРёРЅ РёРјРїРѕСЂС‚ - РїРѕ имени Tralala + func.set_iat_va(0x1); //Запишем ненулевой абсолютный адрес import address table pe_base::imported_function func2; - func2.set_ordinal(5); //Другой импорт - по ординалу 5 - func2.set_iat_va(0x2); //Запишем ненулевой абсолютный адрес import address table + func2.set_ordinal(5); //Другой РёРјРїРѕСЂС‚ - РїРѕ ординалу 5 + func2.set_iat_va(0x2); //Запишем ненулевой абсолютный адрес import address table - //Мы указали некорректные адреса (0x1 и 0x2) для ячеек, в которые будут записаны адреса импортируемых функций - //Это сделано для примера, в реальности должны быть указаны существующие адреса + //РњС‹ указали некорректные адреса (0x1 Рё 0x2) для ячеек, РІ которые Р±СѓРґСѓС‚ записаны адреса импортируемых функций + //Рто сделано для примера, РІ реальности должны быть указаны существующие адреса - //Добавим импорты + //Добавим импорты new_lib.add_import(func); new_lib.add_import(func2); - imports.push_back(new_lib); //Добавим импортированную библиотеку к импортам + imports.push_back(new_lib); //Добавим импортированную библиотеку Рє импортам - //Можно редактировать и существующие импорты + //Можно редактировать Рё существующие импорты - //Но мы просто пересоберем таблицу импортов - //Она будет иметь больший размер, чем до нашего редактирования, - //поэтому запишем ее в новую секцию, чтобы все поместилось - //(мы не можем расширять существующие секции, если только секция не в самом конце файла) + //РќРѕ РјС‹ просто пересоберем таблицу импортов + //РћРЅР° будет иметь больший размер, чем РґРѕ нашего редактирования, + //поэтому запишем ее РІ РЅРѕРІСѓСЋ секцию, чтобы РІСЃРµ поместилось + //(РјС‹ РЅРµ можем расширять существующие секции, если только секция РЅРµ РІ самом конце файла) pe_base::section new_imports; - new_imports.get_raw_data().resize(1); //Мы не можем добавлять пустые секции, поэтому пусть у нее будет начальный размер данных 1 - new_imports.set_name("new_imp"); //Имя секции - new_imports.readable(true).writeable(true); //Доступна на чтение и запись - pe_base::section& attached_section = image->add_section(new_imports); //Добавим секцию и получим ссылку на добавленную секцию с просчитанными размерами + new_imports.get_raw_data().resize(1); //РњС‹ РЅРµ можем добавлять пустые секции, поэтому пусть Сѓ нее будет начальный размер данных 1 + new_imports.set_name("new_imp"); //РРјСЏ секции + new_imports.readable(true).writeable(true); //Доступна РЅР° чтение Рё запись + pe_base::section& attached_section = image->add_section(new_imports); //Добавим секцию Рё получим ссылку РЅР° добавленную секцию СЃ просчитанными размерами - //Структура, отвечающая за настройки пересборщика импортов - pe_base::import_rebuilder_settings settings(true, true); //Сразу модифицируем заголовок PE и очистим поле IMAGE_DIRECTORY_ENTRY_IAT - image->rebuild_imports(imports, attached_section, settings); //Пересобираем импорты + //Структура, отвечающая Р·Р° настройки пересборщика импортов + pe_base::import_rebuilder_settings settings(true, true); //Сразу модифицируем заголовок PE Рё очистим поле IMAGE_DIRECTORY_ENTRY_IAT + image->rebuild_imports(imports, attached_section, settings); //Пересобираем импорты - //Создаем новый PE-файл + //Создаем новый PE-файл std::string base_file_name(argv[1]); std::string::size_type slash_pos; if((slash_pos = base_file_name.find_last_of("/\\")) != std::string::npos) @@ -79,14 +79,14 @@ int main(int argc, char* argv[]) return -1; } - //Пересобираем PE-файл + //Пересобираем PE-файл image->rebuild_pe(new_pe_file); std::cout << "PE was rebuilt and saved to " << base_file_name << std::endl; } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/imports_reader/main.cpp b/samples/imports_reader/main.cpp index 03bb73c..1bb3477 100644 --- a/samples/imports_reader/main.cpp +++ b/samples/imports_reader/main.cpp @@ -1,9 +1,9 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include "lib.h" -//Пример, показывающий, как считать и получить информацию об импортах PE или PE+ файла +//Пример, показывающий, как считать Рё получить информацию РѕР± импортах PE или PE+ файла int main(int argc, char* argv[]) { if(argc != 2) @@ -12,7 +12,7 @@ int main(int argc, char* argv[]) return 0; } - //Открываем файл + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -22,10 +22,10 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); - //Проверим, есть ли импорты у файла + //Проверим, есть ли импорты Сѓ файла if(!image->has_imports()) { std::cout << "Image has no imports" << std::endl; @@ -34,30 +34,30 @@ int main(int argc, char* argv[]) std::cout << "Reading PE imports..." << std::hex << std::showbase << std::endl << std::endl; - //Получаем список импортируемых библиотек с функциями + //Получаем СЃРїРёСЃРѕРє импортируемых библиотек СЃ функциями const pe_base::imported_functions_list imports = image->get_imported_functions(); - //Перечисляем импортированные библиотеки и выводим информацию о них + //Перечисляем импортированные библиотеки Рё выводим информацию Рѕ РЅРёС… for(pe_base::imported_functions_list::const_iterator it = imports.begin(); it != imports.end(); ++it) { - const pe_base::import_library& lib = *it; //Импортируемая библиотека - std::cout << "Library [" << lib.get_name() << "]" << std::endl //Имя - << "Timestamp: " << lib.get_timestamp() << std::endl //Временная метка - << "RVA to IAT: " << lib.get_rva_to_iat() << std::endl //Относительный адрес к import address table + const pe_base::import_library& lib = *it; //Рмпортируемая библиотека + std::cout << "Library [" << lib.get_name() << "]" << std::endl //РРјСЏ + << "Timestamp: " << lib.get_timestamp() << std::endl //Временная метка + << "RVA to IAT: " << lib.get_rva_to_iat() << std::endl //Относительный адрес Рє import address table << "========" << std::endl; - //Перечисляем импортированные функции для библиотеки + //Перечисляем импортированные функции для библиотеки const pe_base::import_library::imported_list& functions = lib.get_imported_functions(); for(pe_base::import_library::imported_list::const_iterator func_it = functions.begin(); func_it != functions.end(); ++func_it) { - const pe_base::imported_function& func = *func_it; //Импортированная функция + const pe_base::imported_function& func = *func_it; //Рмпортированная функция std::cout << "[+] "; - if(func.has_name()) //Если функция имеет имя - выведем его + if(func.has_name()) //Если функция имеет РёРјСЏ - выведем его std::cout << func.get_name(); else - std::cout << "#" << func.get_ordinal(); //Иначе она импортирована по ординалу + std::cout << "#" << func.get_ordinal(); //Рначе РѕРЅР° импортирована РїРѕ ординалу - //Хинт + //РҐРёРЅС‚ std::cout << " hint: " << func.get_hint() << std::endl; } @@ -66,7 +66,7 @@ int main(int argc, char* argv[]) } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/pe_config_reader/main.cpp b/samples/pe_config_reader/main.cpp index 82c46d1..f1fe4a9 100644 --- a/samples/pe_config_reader/main.cpp +++ b/samples/pe_config_reader/main.cpp @@ -1,9 +1,9 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include "lib.h" -//Пример, показывающий, как считать и получить информацию о Image Config (конфигурация исполняемого файла) PE или PE+ +//Пример, показывающий, как считать Рё получить информацию Рѕ Image Config (конфигурация исполняемого файла) PE или PE+ int main(int argc, char* argv[]) { if(argc != 2) @@ -12,7 +12,7 @@ int main(int argc, char* argv[]) return 0; } - //Открываем файл + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -22,16 +22,16 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); std::cout << "Reading PE image config info..." << std::hex << std::showbase << std::endl << std::endl; - //Получаем конфигурацию + //Получаем конфигурацию const pe_base::image_config_info info = image->get_image_config(); - //Выводим данные конфигурации - //Подробнее о полях - в MSDN + //Выводим данные конфигурации + //Подробнее Рѕ полях - РІ MSDN std::cout << "Critical section default timeout: " << info.get_critical_section_default_timeout() << std::endl << "Decommit free block threshold: " << info.get_decommit_free_block_threshold() << std::endl << "Decommit total free threshold: " << info.get_decommit_total_free_threshold() << std::endl @@ -47,14 +47,14 @@ int main(int argc, char* argv[]) << "Virtual memory threshold: " << info.get_virtual_memory_threshold() << std::endl << std::endl; - //Выведем адреса SE-хендлеров + //Выведем адреса SE-хендлеров const pe_base::image_config_info::se_handler_list& se_handlers = info.get_se_handler_rvas(); for(pe_base::image_config_info::se_handler_list::const_iterator it = se_handlers.begin(); it != se_handlers.end(); ++it) std::cout << "SE Handler: " << (*it) << std::endl; } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/pe_realigner/main.cpp b/samples/pe_realigner/main.cpp index 043ed7e..fac2540 100644 --- a/samples/pe_realigner/main.cpp +++ b/samples/pe_realigner/main.cpp @@ -1,9 +1,9 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include "lib.h" -//Пример, показывающий, как изменить файловое выравнивание PE-файлов +//Пример, показывающий, как изменить файловое выравнивание PE-файлов int main(int argc, char* argv[]) { if(argc != 2) @@ -12,7 +12,7 @@ int main(int argc, char* argv[]) return 0; } - //Открываем файл + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -22,20 +22,20 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); - //Выведем темущий file alignment + //Выведем темущий file alignment std::cout << "File alignment: " << image->get_file_alignment() << std::endl; - //Предложим выбрать новое выравнивание + //Предложим выбрать РЅРѕРІРѕРµ выравнивание DWORD new_alignment_index = static_cast<DWORD>(-1); while(new_alignment_index > 3) { if(std::cin.fail()) { - //На случай, если пользователь ввел что-то некорректное + //РќР° случай, если пользователь ввел что-то некорректное std::cin.clear(); std::cin.ignore(static_cast<std::streamsize>(-1), '\n'); } @@ -47,10 +47,10 @@ int main(int argc, char* argv[]) DWORD available_aligns[] = {512, 1024, 2048, 4096}; - //Изменим выравнивание на то, которое указал пользователь + //Рзменим выравнивание РЅР° то, которое указал пользователь image->realign_file(available_aligns[new_alignment_index]); - //Создаем новый PE-файл + //Создаем новый PE-файл std::string base_file_name(argv[1]); std::string::size_type slash_pos; if((slash_pos = base_file_name.find_last_of("/\\")) != std::string::npos) @@ -64,14 +64,14 @@ int main(int argc, char* argv[]) return -1; } - //Пересобираем PE-файл + //Пересобираем PE-файл image->rebuild_pe(new_pe_file); std::cout << "PE was rebuilt and saved to " << base_file_name << std::endl; } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/pe_rebaser/main.cpp b/samples/pe_rebaser/main.cpp index e3d1613..c94169c 100644 --- a/samples/pe_rebaser/main.cpp +++ b/samples/pe_rebaser/main.cpp @@ -1,9 +1,9 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include "lib.h" -//Пример, показывающий, как изменить базовый адрес загрузки PE-файла при условии наличия релокаций +//Пример, показывающий, как изменить базовый адрес загрузки PE-файла РїСЂРё условии наличия релокаций int main(int argc, char* argv[]) { if(argc != 2) @@ -12,7 +12,7 @@ int main(int argc, char* argv[]) return 0; } - //Открываем файл + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -22,24 +22,24 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); - //Проверим, есть ли релокации у образа + //Проверим, есть ли релокации Сѓ образа if(!image->has_reloc()) { std::cout << "Image has no relocations, rebase is not possible" << std::endl; return 0; } - //Получим значение базового адреса загрузки образа (64-бита, универсально для PE и PE+) + //Получим значение базового адреса загрузки образа (64-бита, универсально для PE Рё PE+) ULONGLONG base = image->get_image_base_64(); - base += 0x100000; //Изменим базовый адрес загрузки + base += 0x100000; //Рзменим базовый адрес загрузки - //Произведем пересчет необходимых байтов + //Произведем пересчет необходимых байтов image->rebase_image(image->get_relocations(), base); - //Создаем новый PE-файл + //Создаем новый PE-файл std::string base_file_name(argv[1]); std::string::size_type slash_pos; if((slash_pos = base_file_name.find_last_of("/\\")) != std::string::npos) @@ -53,14 +53,14 @@ int main(int argc, char* argv[]) return -1; } - //Пересобираем PE-файл + //Пересобираем PE-файл image->rebuild_pe(new_pe_file); std::cout << "PE was rebuilt and saved to " << base_file_name << std::endl; } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/pe_sections_reader/main.cpp b/samples/pe_sections_reader/main.cpp index 62df662..cff2672 100644 --- a/samples/pe_sections_reader/main.cpp +++ b/samples/pe_sections_reader/main.cpp @@ -1,9 +1,9 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include "lib.h" -//Пример, показывающий, как считать и получить информацию о секциях PE или PE+ файла +//Пример, показывающий, как считать Рё получить информацию Рѕ секциях PE или PE+ файла int main(int argc, char* argv[]) { if(argc != 2) @@ -12,7 +12,7 @@ int main(int argc, char* argv[]) return 0; } - //Открываем файл + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -22,28 +22,28 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); - //Получаем список секций + //Получаем СЃРїРёСЃРѕРє секций std::cout << "Reading PE sections..." << std::hex << std::showbase << std::endl << std::endl; const pe_base::section_list sections = image->get_image_sections(); - //Перечисляем секции и выводим информацию о них + //Перечисляем секции Рё выводим информацию Рѕ РЅРёС… for(pe_base::section_list::const_iterator it = sections.begin(); it != sections.end(); ++it) { - const pe_base::section& s = *it; //Секция - std::cout << "Section [" << s.get_name() << "]" << std::endl //Имя секции - << "Characteristics: " << s.get_characteristics() << std::endl //Характеристики - << "Size of raw data: " << s.get_size_of_raw_data() << std::endl //Размер данных в файле - << "Virtual address: " << s.get_virtual_address() << std::endl //Виртуальный адрес - << "Virtual size: " << s.get_virtual_size() << std::endl //Виртуальный размер + const pe_base::section& s = *it; //Секция + std::cout << "Section [" << s.get_name() << "]" << std::endl //РРјСЏ секции + << "Characteristics: " << s.get_characteristics() << std::endl //Характеристики + << "Size of raw data: " << s.get_size_of_raw_data() << std::endl //Размер данных РІ файле + << "Virtual address: " << s.get_virtual_address() << std::endl //Виртуальный адрес + << "Virtual size: " << s.get_virtual_size() << std::endl //Виртуальный размер << std::endl; } } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/pe_stripper/main.cpp b/samples/pe_stripper/main.cpp index 9f7e17a..e2384f7 100644 --- a/samples/pe_stripper/main.cpp +++ b/samples/pe_stripper/main.cpp @@ -1,9 +1,9 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include "lib.h" -//Пример, показывающий, как вырезать ненужные данные из PE-файла и пересобрать его +//Пример, показывающий, как вырезать ненужные данные РёР· PE-файла Рё пересобрать его int main(int argc, char* argv[]) { if(argc != 2) @@ -12,7 +12,7 @@ int main(int argc, char* argv[]) return 0; } - //Открываем файл + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -22,17 +22,17 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); - //Удалим DOS stub и rich overlay + //Удалим DOS stub Рё rich overlay image->strip_stub_overlay(); - //Удалим ненужные DATA_DIRECTORY (нулевые) - //Очень малое количество линкеров умеют это делать + //Удалим ненужные DATA_DIRECTORY (нулевые) + //Очень малое количество линкеров умеют это делать image->strip_data_directories(0); - //Создаем новый PE-файл + //Создаем новый PE-файл std::string base_file_name(argv[1]); std::string::size_type slash_pos; if((slash_pos = base_file_name.find_last_of("/\\")) != std::string::npos) @@ -46,17 +46,17 @@ int main(int argc, char* argv[]) return -1; } - //Пересобираем PE-файл с опцией сжатия DOS-header - //Усеньшения размера это не дает, но упаковывает NT-заголовки в DOS-заголовок - //При пересборке автоматически убираются ненужные нулевые байты в самом конце образа, - //в результате чего размер образа становится немного меньше + //Пересобираем PE-файл СЃ опцией сжатия DOS-header + //Усеньшения размера это РЅРµ дает, РЅРѕ упаковывает NT-заголовки РІ DOS-заголовок + //РџСЂРё пересборке автоматически убираются ненужные нулевые байты РІ самом конце образа, + //РІ результате чего размер образа становится немного меньше image->rebuild_pe(new_pe_file, true); std::cout << "PE was rebuilt and saved to " << base_file_name << std::endl; } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/relocation_adder/main.cpp b/samples/relocation_adder/main.cpp index 9a48324..ae4beef 100644 --- a/samples/relocation_adder/main.cpp +++ b/samples/relocation_adder/main.cpp @@ -1,9 +1,9 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include "lib.h" -//Пример, показывающий, как добавить новую релокацию в таблицы релокаций PE-файла +//Пример, показывающий, как добавить РЅРѕРІСѓСЋ релокацию РІ таблицы релокаций PE-файла int main(int argc, char* argv[]) { if(argc != 2) @@ -12,7 +12,7 @@ int main(int argc, char* argv[]) return 0; } - //Открываем файл + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -22,38 +22,38 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); - //Перечислим и получим все записи из таблиц релокаций в PE-файле, кроме абсолютных - //Можно было бы включить в список и абсолютные записи (ABSOLUTE), передав в вызов true - //Эти записи не нужны при пересборке релокаций, они используются для выравнивания - //и будут добавлены автоматически пересборщиком + //Перечислим Рё получим РІСЃРµ записи РёР· таблиц релокаций РІ PE-файле, РєСЂРѕРјРµ абсолютных + //Можно было Р±С‹ включить РІ СЃРїРёСЃРѕРє Рё абсолютные записи (ABSOLUTE), передав РІ вызов true + //Рти записи РЅРµ нужны РїСЂРё пересборке релокаций, РѕРЅРё используются для выравнивания + //Рё Р±СѓРґСѓС‚ добавлены автоматически пересборщиком pe_base::relocation_table_list tables = image->get_relocations(); - //Создаем новую таблицу релокаций + //Создаем РЅРѕРІСѓСЋ таблицу релокаций pe_base::relocation_table new_table; - new_table.set_rva(0x5678); //Относительный адрес релокаций в таблице - он некорректен, для примера, поэтому получившийся PE скорее всего не загрузится - //Добавим в таблицу новую релокацию - new_table.add_relocation(pe_base::relocation_entry(10, 3)); //Тип 3 - HIGHLOW-релокация, RRVA = 10, т.е. RVA = 0x5678 + 10 - //Добавляем таблицу + new_table.set_rva(0x5678); //Относительный адрес релокаций РІ таблице - РѕРЅ некорректен, для примера, поэтому получившийся PE скорее всего РЅРµ загрузится + //Добавим РІ таблицу РЅРѕРІСѓСЋ релокацию + new_table.add_relocation(pe_base::relocation_entry(10, 3)); //РўРёРї 3 - HIGHLOW-релокация, RRVA = 10, С‚.Рµ. RVA = 0x5678 + 10 + //Добавляем таблицу tables.push_back(new_table); - //Можно редактировать и существующие релокации, но делать этого не стоит, так как файл не загрузится, если что-то в них поменять - //Если их удалить у EXE-файла полностью, то все будет нормально, у DLL этого делать не стоит - //Мы просто пересоберем релокации - //Они будет иметь больший размер, чем до нашего редактирования, - //поэтому запишем их в новую секцию, чтобы все поместилось - //(мы не можем расширять существующие секции, если только секция не в самом конце файла) + //Можно редактировать Рё существующие релокации, РЅРѕ делать этого РЅРµ стоит, так как файл РЅРµ загрузится, если что-то РІ РЅРёС… поменять + //Если РёС… удалить Сѓ EXE-файла полностью, то РІСЃРµ будет нормально, Сѓ DLL этого делать РЅРµ стоит + //РњС‹ просто пересоберем релокации + //РћРЅРё будет иметь больший размер, чем РґРѕ нашего редактирования, + //поэтому запишем РёС… РІ РЅРѕРІСѓСЋ секцию, чтобы РІСЃРµ поместилось + //(РјС‹ РЅРµ можем расширять существующие секции, если только секция РЅРµ РІ самом конце файла) pe_base::section new_relocs; - new_relocs.get_raw_data().resize(1); //Мы не можем добавлять пустые секции, поэтому пусть у нее будет начальный размер данных 1 - new_relocs.set_name("new_rel"); //Имя секции - new_relocs.readable(true); //Доступна на чтение - pe_base::section& attached_section = image->add_section(new_relocs); //Добавим секцию и получим ссылку на добавленную секцию с просчитанными размерами + new_relocs.get_raw_data().resize(1); //РњС‹ РЅРµ можем добавлять пустые секции, поэтому пусть Сѓ нее будет начальный размер данных 1 + new_relocs.set_name("new_rel"); //РРјСЏ секции + new_relocs.readable(true); //Доступна РЅР° чтение + pe_base::section& attached_section = image->add_section(new_relocs); //Добавим секцию Рё получим ссылку РЅР° добавленную секцию СЃ просчитанными размерами - image->rebuild_relocations(tables, attached_section); //Пересобираем экспорты, расположив их с начала новой секции и записав новые данные таблиц релокаций в PE-заголовок + image->rebuild_relocations(tables, attached_section); //Пересобираем экспорты, расположив РёС… СЃ начала РЅРѕРІРѕР№ секции Рё записав новые данные таблиц релокаций РІ PE-заголовок - //Создаем новый PE-файл + //Создаем новый PE-файл std::string base_file_name(argv[1]); std::string::size_type slash_pos; if((slash_pos = base_file_name.find_last_of("/\\")) != std::string::npos) @@ -67,14 +67,14 @@ int main(int argc, char* argv[]) return -1; } - //Пересобираем PE-файл + //Пересобираем PE-файл image->rebuild_pe(new_pe_file); std::cout << "PE was rebuilt and saved to " << base_file_name << std::endl; } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/relocations_reader/main.cpp b/samples/relocations_reader/main.cpp index fbaf994..ebc7a0d 100644 --- a/samples/relocations_reader/main.cpp +++ b/samples/relocations_reader/main.cpp @@ -1,9 +1,9 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include "lib.h" -//Пример, показывающий, как считать и получить информацию о релокациях PE или PE+ файла +//Пример, показывающий, как считать Рё получить информацию Рѕ релокациях PE или PE+ файла int main(int argc, char* argv[]) { if(argc != 2) @@ -12,7 +12,7 @@ int main(int argc, char* argv[]) return 0; } - //Открываем файл + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -22,10 +22,10 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); - //Проверим, есть ли релокации у файла + //Проверим, есть ли релокации Сѓ файла if(!image->has_reloc()) { std::cout << "Image has no relocations" << std::endl; @@ -34,18 +34,18 @@ int main(int argc, char* argv[]) std::cout << "Reading PE relocations..." << std::hex << std::showbase << std::endl << std::endl; - //Получаем список таблиц релокаций + //Получаем СЃРїРёСЃРѕРє таблиц релокаций const pe_base::relocation_table_list tables = image->get_relocations(); - //Перечисляем таблицы релокаций и выводим информацию о них + //Перечисляем таблицы релокаций Рё выводим информацию Рѕ РЅРёС… for(pe_base::relocation_table_list::const_iterator it = tables.begin(); it != tables.end(); ++it) { - const pe_base::relocation_table& table = *it; //Таблица релокаций - std::cout << "RVA [" << table.get_rva() << "]" << std::endl //Относительный адрес + const pe_base::relocation_table& table = *it; //Таблица релокаций + std::cout << "RVA [" << table.get_rva() << "]" << std::endl //Относительный адрес << "==========" << std::endl; - //Перечислим все релокации + //Перечислим РІСЃРµ релокации const pe_base::relocation_table::relocation_list& relocs = table.get_relocations(); for(pe_base::relocation_table::relocation_list::const_iterator reloc_it = relocs.begin(); reloc_it != relocs.end(); ++reloc_it) { @@ -57,7 +57,7 @@ int main(int argc, char* argv[]) } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/resource_editor/main.cpp b/samples/resource_editor/main.cpp index aa1b601..a1b7630 100644 --- a/samples/resource_editor/main.cpp +++ b/samples/resource_editor/main.cpp @@ -1,16 +1,16 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include <pe_resource_manager.h> #include "resource.h" #include "lib.h" -//Пример, показывающий, как редактировать ресурсы PE-файла -//Для начала рекомендуется ознакомиться с примером resource_viewer -//Обратите внимание, что пример корректно отработает и в x86, и в x64 варианте +//Пример, показывающий, как редактировать ресурсы PE-файла +//Для начала рекомендуется ознакомиться СЃ примером resource_viewer +//Обратите внимание, что пример корректно отработает Рё РІ x86, Рё РІ x64 варианте int main(int argc, char* argv[]) { - //Открываем файл (сами себя) + //Открываем файл (сами себя) std::ifstream pe_file(argv[0], std::ios::in | std::ios::binary); if(!pe_file) { @@ -20,115 +20,115 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); - //Суть примера будет состоять в следующем: - //В сам пример вкомпиливается иконка в директорию с именем CUSTOM - //Иконка состоит из трех картинок разных разрешений - //Наша задача - считать иконку из директории CUSTOM и установить ее как главную иконку exe-файла - //Далее - удалить директорию CUSTOM - //Наконец, добавить какую-нибудь информацию о версии к файлу + //Суть примера будет состоять РІ следующем: + //Р’ сам пример вкомпиливается РёРєРѕРЅРєР° РІ директорию СЃ именем CUSTOM + //РРєРѕРЅРєР° состоит РёР· трех картинок разных разрешений + //Наша задача - считать РёРєРѕРЅРєСѓ РёР· директории CUSTOM Рё установить ее как главную РёРєРѕРЅРєСѓ exe-файла + //Далее - удалить директорию CUSTOM + //Наконец, добавить какую-РЅРёР±СѓРґСЊ информацию Рѕ версии Рє файлу - //Проверим, есть ли ресурсы у файла + //Проверим, есть ли ресурсы Сѓ файла if(!image->has_resources()) { std::cout << "Image has no resources" << std::endl; return 0; } - //Получаем корневую директорию ресурсов + //Получаем корневую директорию ресурсов std::cout << "Reading PE resources..." << std::hex << std::showbase << std::endl << std::endl; pe_base::resource_directory root = image->get_resources(); - //Для облегчения работы с директориями и записями ресурсов созданы вспомогательные классы - //Этот класс позволяет извлекать из PE-файлов любые ресурсы и перезаписывать их - //и предоставляет высокоуровневые функции для извечения иконок, курсоров, картинкок, строковых таблиц - //и таблиц сообщений, а также информации о версии - //и редактирования иконок, курсоров, картинок и информации о версии + //Для облегчения работы СЃ директориями Рё записями ресурсов созданы вспомогательные классы + //Ртот класс позволяет извлекать РёР· PE-файлов любые ресурсы Рё перезаписывать РёС… + //Рё предоставляет высокоуровневые функции для извечения РёРєРѕРЅРѕРє, РєСѓСЂСЃРѕСЂРѕРІ, картинкок, строковых таблиц + //Рё таблиц сообщений, Р° также информации Рѕ версии + //Рё редактирования РёРєРѕРЅРѕРє, РєСѓСЂСЃРѕСЂРѕРІ, картинок Рё информации Рѕ версии pe_resource_manager res(root); - //Для начала убедимся, что директория CUSTOM есть + //Для начала убедимся, что директория CUSTOM есть if(!res.resource_exists(L"CUSTOM")) { std::cout << "\"CUSTOM\" resource directory does not exist" << std::endl; return -1; } - //Получим нашу иконку из этой директории: мы знаем, что ее ID=100 и она одна в директории имен, поэтому делаем так - //Получаем ее по нулевому индексу (можно было получить по языку, но это незачем, т.к. она единственная) + //Получим нашу РёРєРѕРЅРєСѓ РёР· этой директории: РјС‹ знаем, что ее ID=100 Рё РѕРЅР° РѕРґРЅР° РІ директории имен, поэтому делаем так + //Получаем ее РїРѕ нулевому индексу (можно было получить РїРѕ языку, РЅРѕ это незачем, С‚.Рє. РѕРЅР° единственная) const pe_resource_viewer::resource_data_info data = res.get_resource_data_by_id(L"CUSTOM", IDR_CUSTOM1); - //Необходимо теперь добавить ее как главную иконку - //Иконка приложения - это иконка из той группы иконок, которая следует самой первой в списке групп иконок - //Помните, что сначала идут именованные ресурсы, а потом ресурсы с идентификаторами, и всё сортируется - //Создадим группу иконок с именем MAIN_ICON - res.add_icon(data.get_data(), //Данные файла иконки - L"MAIN_ICON", //Имя группы иконок (помните, у нас три картинки внутри иконки, они будут находиться в этой группе) - 0, //Язык - нам неважен - pe_resource_manager::icon_place_after_max_icon_id, //Вариант расположения иконок в существующей группе - нам он неважен, так как мы создаем новую группу - data.get_codepage(), //Сохраним исходную Codepage - 0 //Timestamp - неважен + //Необходимо теперь добавить ее как главную РёРєРѕРЅРєСѓ + //РРєРѕРЅРєР° приложения - это РёРєРѕРЅРєР° РёР· той РіСЂСѓРїРїС‹ РёРєРѕРЅРѕРє, которая следует самой первой РІ СЃРїРёСЃРєРµ РіСЂСѓРїРї РёРєРѕРЅРѕРє + //Помните, что сначала РёРґСѓС‚ именованные ресурсы, Р° потом ресурсы СЃ идентификаторами, Рё РІСЃС‘ сортируется + //Создадим РіСЂСѓРїРїСѓ РёРєРѕРЅРѕРє СЃ именем MAIN_ICON + res.add_icon(data.get_data(), //Данные файла РёРєРѕРЅРєРё + L"MAIN_ICON", //РРјСЏ РіСЂСѓРїРїС‹ РёРєРѕРЅРѕРє (помните, Сѓ нас три картинки внутри РёРєРѕРЅРєРё, РѕРЅРё Р±СѓРґСѓС‚ находиться РІ этой РіСЂСѓРїРїРµ) + 0, //Язык - нам неважен + pe_resource_manager::icon_place_after_max_icon_id, //Вариант расположения РёРєРѕРЅРѕРє РІ существующей РіСЂСѓРїРїРµ - нам РѕРЅ неважен, так как РјС‹ создаем РЅРѕРІСѓСЋ РіСЂСѓРїРїСѓ + data.get_codepage(), //Сохраним РёСЃС…РѕРґРЅСѓСЋ Codepage + 0 //Timestamp - неважен ); - //Теперь удалим уже ненужную директорию CUSTOM + //Теперь удалим уже ненужную директорию CUSTOM res.remove_resource(L"CUSTOM"); - //Теперь создадим информацию о версии - pe_resource_viewer::file_version_info file_info; //Базовая информация о файле - file_info.set_special_build(true); //Это будет специальный билд - file_info.set_file_os(pe_resource_viewer::file_version_info::file_os_nt_win32); //Система, на которой работает файл - file_info.set_file_version_ms(0x00010002); //Версия файла будет 1.2.3.4 + //Теперь создадим информацию Рѕ версии + pe_resource_viewer::file_version_info file_info; //Базовая информация Рѕ файле + file_info.set_special_build(true); //Рто будет специальный билд + file_info.set_file_os(pe_resource_viewer::file_version_info::file_os_nt_win32); //Система, РЅР° которой работает файл + file_info.set_file_version_ms(0x00010002); //Версия файла будет 1.2.3.4 file_info.set_file_version_ls(0x00030004); - //Теперь создадим строки с информацией и трансляции (переводы) + //Теперь создадим строки СЃ информацией Рё трансляции (переводы) pe_resource_viewer::lang_string_values_map strings; pe_resource_viewer::translation_values_map translations; - //Для работы со строками и трансляциями есть вспомогательный класс + //Для работы СЃРѕ строками Рё трансляциями есть вспомогательный класс version_info_editor version(strings, translations); - //Добавим трансляцию - default process language, UNICODE - //Можно указать и конкретный язык и кодировку + //Добавим трансляцию - default process language, UNICODE + //Можно указать Рё конкретный язык Рё РєРѕРґРёСЂРѕРІРєСѓ version.add_translation(version_info_editor::default_language_translation); - //Строки будут устанавливаться для дефолтной кодировки (default_language_translation) - //Если такой нет, то для первой найденной - //Если вообще нет ни одной трансляции, то будет добавлена дефолтная (default_language_translation) - //Таким образом, предыдущий вызов add_translation можно было бы опустить - //И еще: необязательно устанавливать все доступные строки, как сделано ниже - version.set_company_name(L"Kaimi.ru DX"); //Имя компании-производителя - version.set_file_description(L"Generated file version info"); //Описание файла - version.set_internal_name(L"Tralala.exe"); //Внутреннее имя файла - version.set_legal_copyright(L"(C) DX Portable Executable Library"); //Копирайт - version.set_original_filename(L"resource_editor.exe"); //Оригинальное имя файла - version.set_product_name(L"PE Resource Editor Example"); //Имя продукта - version.set_product_version(L"x.y.z"); //Версия продукта - - //Можно также добавить свою собственную строку: она будет храниться в информации о версии, - //но Windows Explorer вряд ли ее отобразит в свойствах файла + //Строки Р±СѓРґСѓС‚ устанавливаться для дефолтной РєРѕРґРёСЂРѕРІРєРё (default_language_translation) + //Если такой нет, то для первой найденной + //Если вообще нет РЅРё РѕРґРЅРѕР№ трансляции, то будет добавлена дефолтная (default_language_translation) + //Таким образом, предыдущий вызов add_translation можно было Р±С‹ опустить + //Реще: необязательно устанавливать РІСЃРµ доступные строки, как сделано ниже + version.set_company_name(L"Kaimi.ru DX"); //РРјСЏ компании-производителя + version.set_file_description(L"Generated file version info"); //Описание файла + version.set_internal_name(L"Tralala.exe"); //Внутреннее РёРјСЏ файла + version.set_legal_copyright(L"(C) DX Portable Executable Library"); //Копирайт + version.set_original_filename(L"resource_editor.exe"); //Оригинальное РёРјСЏ файла + version.set_product_name(L"PE Resource Editor Example"); //РРјСЏ продукта + version.set_product_version(L"x.y.z"); //Версия продукта + + //Можно также добавить СЃРІРѕСЋ собственную строку: РѕРЅР° будет храниться РІ информации Рѕ версии, + //РЅРѕ Windows Explorer РІСЂСЏРґ ли ее отобразит РІ свойствах файла version.set_property(L"MyLittleProperty", L"Secret Value"); - //Установим информацию о версии - res.set_version_info(file_info, strings, translations, 1033); //1033 - русский язык + //Установим информацию Рѕ версии + res.set_version_info(file_info, strings, translations, 1033); //1033 - СЂСѓСЃСЃРєРёР№ язык - //Осталось переименовать старую секцию ресурсов - //Она называется .rsrc - //Переименование необходимо для того, чтобы Windows Explorer смог считать из новой секции иконку + //Осталось переименовать старую секцию ресурсов + //РћРЅР° называется .rsrc + //Переименование необходимо для того, чтобы Windows Explorer СЃРјРѕРі считать РёР· РЅРѕРІРѕР№ секции РёРєРѕРЅРєСѓ image->section_from_directory(IMAGE_DIRECTORY_ENTRY_RESOURCE).set_name("oldres"); - //Пересоберем ресурсы - //Они будет иметь больший размер, чем до нашего редактирования, - //поэтому запишем их в новую секцию, чтобы все поместилось - //(мы не можем расширять существующие секции, если только секция не в самом конце файла) + //Пересоберем ресурсы + //РћРЅРё будет иметь больший размер, чем РґРѕ нашего редактирования, + //поэтому запишем РёС… РІ РЅРѕРІСѓСЋ секцию, чтобы РІСЃРµ поместилось + //(РјС‹ РЅРµ можем расширять существующие секции, если только секция РЅРµ РІ самом конце файла) pe_base::section new_resources; - new_resources.get_raw_data().resize(1); //Мы не можем добавлять пустые секции, поэтому пусть у нее будет начальный размер данных 1 - new_resources.set_name(".rsrc"); //Имя секции - new_resources.readable(true); //Доступна на чтение - pe_base::section& attached_section = image->add_section(new_resources); //Добавим секцию и получим ссылку на добавленную секцию с просчитанными размерами + new_resources.get_raw_data().resize(1); //РњС‹ РЅРµ можем добавлять пустые секции, поэтому пусть Сѓ нее будет начальный размер данных 1 + new_resources.set_name(".rsrc"); //РРјСЏ секции + new_resources.readable(true); //Доступна РЅР° чтение + pe_base::section& attached_section = image->add_section(new_resources); //Добавим секцию Рё получим ссылку РЅР° добавленную секцию СЃ просчитанными размерами - //Теперь пересоберем ресурсы, расположив их в самом начале новой секции и поправив PE-заголовок, записав туда новые параметры директории ресурсоы + //Теперь пересоберем ресурсы, расположив РёС… РІ самом начале РЅРѕРІРѕР№ секции Рё поправив PE-заголовок, записав туда новые параметры директории ресурсоы image->rebuild_resources(root, attached_section); - //Создаем новый PE-файл + //Создаем новый PE-файл std::string base_file_name(argv[0]); std::string::size_type slash_pos; if((slash_pos = base_file_name.find_last_of("/\\")) != std::string::npos) @@ -142,14 +142,14 @@ int main(int argc, char* argv[]) return -1; } - //Пересобираем PE-файл + //Пересобираем PE-файл image->rebuild_pe(new_pe_file); std::cout << "PE was rebuilt and saved to " << base_file_name << std::endl; } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/resource_viewer/main.cpp b/samples/resource_viewer/main.cpp index a7b5934..5e10cd1 100644 --- a/samples/resource_viewer/main.cpp +++ b/samples/resource_viewer/main.cpp @@ -1,10 +1,10 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include <pe_resource_manager.h> #include "lib.h" -//Пример, показывающий, как читать ресурсы PE-файла +//Пример, показывающий, как читать ресурсы PE-файла int main(int argc, char* argv[]) { if(argc != 2) @@ -13,7 +13,7 @@ int main(int argc, char* argv[]) return 0; } - //Открываем файл + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -23,55 +23,55 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); - //Проверим, есть ли ресурсы у файла + //Проверим, есть ли ресурсы Сѓ файла if(!image->has_resources()) { std::cout << "Image has no resources" << std::endl; return 0; } - //Получаем корневую директорию ресурсов + //Получаем корневую директорию ресурсов std::cout << "Reading PE resources..." << std::hex << std::showbase << std::endl << std::endl; const pe_base::resource_directory root = image->get_resources(); - //Для облегчения работы с директориями и записями ресурсов созданы вспомогательные классы - //Этот класс позволяет извлекать из PE-файлов любые ресурсы - //и предоставляет высокоуровневые функции для извечения иконок, курсоров, картинкок, строковых таблиц - //и таблиц сообщений, а также информации о версии + //Для облегчения работы СЃ директориями Рё записями ресурсов созданы вспомогательные классы + //Ртот класс позволяет извлекать РёР· PE-файлов любые ресурсы + //Рё предоставляет высокоуровневые функции для извечения РёРєРѕРЅРѕРє, РєСѓСЂСЃРѕСЂРѕРІ, картинкок, строковых таблиц + //Рё таблиц сообщений, Р° также информации Рѕ версии pe_resource_viewer res(root); - //Выведем типы ресурсов, которые присутствуют в PE-файле + //Выведем типы ресурсов, которые присутствуют РІ PE-файле pe_resource_viewer::resource_type_list res_types(res.list_resource_types()); for(pe_resource_viewer::resource_type_list::const_iterator it = res_types.begin(); it != res_types.end(); ++it) std::cout << "Present resource type: " << (*it) << std::endl; std::cout << std::endl; - //Выведем иофнрмацию о версии, если она существует + //Выведем иофнрмацию Рѕ версии, если РѕРЅР° существует if(res.resource_exists(pe_resource_viewer::resource_version)) { pe_resource_viewer::lang_string_values_map strings; pe_resource_viewer::translation_values_map translations; - //Получаем список строк, переводов и базовую информацию о файле + //Получаем СЃРїРёСЃРѕРє строк, переводов Рё базовую информацию Рѕ файле pe_resource_viewer::file_version_info file_info(res.get_version_info(strings, translations)); - //Выводить информацию будем в юникодный поток + //Выводить информацию будем РІ юникодный поток std::wstringstream version_info; - //Выведем некоторую базовую информацию + //Выведем некоторую базовую информацию version_info << L"Version info: " << std::endl; - version_info << L"File version: " << file_info.get_file_version_string<wchar_t>() << std::endl; //Строка версии файла - version_info << L"Debug build: " << (file_info.is_debug() ? L"YES" : L"NO") << std::endl; //Отладочный ли билд + version_info << L"File version: " << file_info.get_file_version_string<wchar_t>() << std::endl; //Строка версии файла + version_info << L"Debug build: " << (file_info.is_debug() ? L"YES" : L"NO") << std::endl; //Отладочный ли билд version_info << std::endl; - //Выведем строки для разных трансляций: + //Выведем строки для разных трансляций: for(pe_resource_viewer::lang_string_values_map::const_iterator it = strings.begin(); it != strings.end(); ++it) { version_info << L"Translation ID: " << (*it).first << std::endl; - //Перечислим записи в таблице строк для текущей трансляции (перевода) + //Перечислим записи РІ таблице строк для текущей трансляции (перевода) const pe_resource_viewer::string_values_map& string_table = (*it).second; for(pe_resource_viewer::string_values_map::const_iterator str_it = string_table.begin(); str_it != string_table.end(); ++str_it) version_info << (*str_it).first << L": " << (*str_it).second << std::endl; @@ -79,12 +79,12 @@ int main(int argc, char* argv[]) version_info << std::endl; } - //Выведем доступные переводы (трансляции): + //Выведем доступные переводы (трансляции): for(pe_resource_viewer::translation_values_map::const_iterator it = translations.begin(); it != translations.end(); ++it) version_info << L"Translation: language: " << (*it).first << ", codepage: " << (*it).second << std::endl; { - //Создаем файл, в который запишем информацию о версии + //Создаем файл, РІ который запишем информацию Рѕ версии std::ofstream version_info_file("version_info.txt", std::ios::out | std::ios::trunc | std::ios::binary); if(!version_info_file) { @@ -93,63 +93,63 @@ int main(int argc, char* argv[]) } std::wstring version_info_string(version_info.str()); - //Запишем буфер, чтобы не париться с локалями и записью юникода в файл + //Запишем буфер, чтобы РЅРµ париться СЃ локалями Рё записью СЋРЅРёРєРѕРґР° РІ файл version_info_file.write(reinterpret_cast<const char*>(version_info_string.data()), version_info_string.length() * sizeof(wchar_t)); std::cout << "version_info.txt created" << std::endl << std::endl; } - //Для облегчения чтения информации о версии есть специальный класс + //Для облегчения чтения информации Рѕ версии есть специальный класс version_info_viewer version_viewer(strings, translations); std::wcout << "Original filename: " << version_viewer.get_original_filename() << std::endl << std::endl; } { - //Найдем, есть ли у приложения иконка - //Для этого сначала узнаем все имена и идентификаторы групп иконок - //Все ресурсы в целом организованы в таком виде (дерево): - //тип ресурса - //--> имя ресурса - //----> язык рерурса - //------> ресурс - //----> язык ресурса - //------> ресурс + //Найдем, есть ли Сѓ приложения РёРєРѕРЅРєР° + //Для этого сначала узнаем РІСЃРµ имена Рё идентификаторы РіСЂСѓРїРї РёРєРѕРЅРѕРє + //Р’СЃРµ ресурсы РІ целом организованы РІ таком РІРёРґРµ (дерево): + //тип ресурса + //--> РёРјСЏ ресурса + //----> язык рерурса + //------> ресурс + //----> язык ресурса + //------> ресурс //----> ... - //--> имя ресурса + //--> РёРјСЏ ресурса //--> ... - //--> id ресурса - //----> язык рерурса - //------> ресурс - //----> язык ресурса - //------> ресурс + //--> id ресурса + //----> язык рерурса + //------> ресурс + //----> язык ресурса + //------> ресурс //----> ... - //--> id ресурса + //--> id ресурса //--> ... - //тип ресурса + //тип ресурса //... pe_resource_viewer::resource_id_list icon_id_list(res.list_resource_ids(pe_resource_viewer::resource_icon_group)); pe_resource_viewer::resource_name_list icon_name_list(res.list_resource_names(pe_resource_viewer::resource_icon_group)); - std::string main_icon; //Данные иконки приложения - //Сначала всегда располагаются именованные ресурсы, поэтому проверим, есть ли они + std::string main_icon; //Данные РёРєРѕРЅРєРё приложения + //Сначала всегда располагаются именованные ресурсы, поэтому проверим, есть ли РѕРЅРё if(!icon_name_list.empty()) { - //Получим самую первую иконку для самого первого языка (по индексу 0) - //Если надо было бы перечислить языки для заданной иконки, можно было вызвать list_resource_languages - //Если надо было бы получить иконку для конкретного языка, можно было вызвать get_icon_by_name (перегрузка с указанием языка) + //Получим самую первую РёРєРѕРЅРєСѓ для самого первого языка (РїРѕ индексу 0) + //Если надо было Р±С‹ перечислить языки для заданной РёРєРѕРЅРєРё, можно было вызвать list_resource_languages + //Если надо было Р±С‹ получить РёРєРѕРЅРєСѓ для конкретного языка, можно было вызвать get_icon_by_name (перегрузка СЃ указанием языка) main_icon = res.get_icon_by_name(icon_name_list[0]); } - else if(!icon_id_list.empty()) //Если нет именованных групп иконок, но есть группы с ID + else if(!icon_id_list.empty()) //Если нет именованных РіСЂСѓРїРї РёРєРѕРЅРѕРє, РЅРѕ есть РіСЂСѓРїРїС‹ СЃ ID { - //Получим самую первую иконку для самого первого языка (по индексу 0) - //Если надо было бы перечислить языки для заданной иконки, можно было вызвать list_resource_languages - //Если надо было бы получить иконку для конкретного языка, можно было вызвать get_icon_by_id_lang + //Получим самую первую РёРєРѕРЅРєСѓ для самого первого языка (РїРѕ индексу 0) + //Если надо было Р±С‹ перечислить языки для заданной РёРєРѕРЅРєРё, можно было вызвать list_resource_languages + //Если надо было Р±С‹ получить РёРєРѕРЅРєСѓ для конкретного языка, можно было вызвать get_icon_by_id_lang main_icon = res.get_icon_by_id(icon_id_list[0]); } - //Если есть иконка... + //Если есть РёРєРѕРЅРєР°... if(!main_icon.empty()) { - //Сохраним полученную иконку в файл + //Сохраним полученную РёРєРѕРЅРєСѓ РІ файл std::ofstream app_icon("main_icon.ico", std::ios::out | std::ios::trunc | std::ios::binary); if(!app_icon) { @@ -164,38 +164,38 @@ int main(int argc, char* argv[]) } { - //Сдампим строковые таблицы - //Перечислим идентификаторы существующих строковых таблиц + //Сдампим строковые таблицы + //Перечислим идентификаторы существующих строковых таблиц pe_resource_viewer::resource_id_list strings_id_list(res.list_resource_ids(pe_resource_viewer::resource_string)); - //Дампить будем в юникодный поток + //Дампить будем РІ юникодный поток std::wstringstream string_data; - if(!strings_id_list.empty()) //Если у нас есть именованные строковые таблицы, сдампим их + if(!strings_id_list.empty()) //Если Сѓ нас есть именованные строковые таблицы, сдампим РёС… { - //Все имена строковых таблиц + //Р’СЃРµ имена строковых таблиц for(pe_resource_viewer::resource_id_list::const_iterator it = strings_id_list.begin(); it != strings_id_list.end(); ++it) { string_data << L"String table [" << (*it) << L"]" << std::endl; - //Перечислим языки таблицы + //Перечислим языки таблицы pe_resource_viewer::resource_language_list langs(res.list_resource_languages(pe_resource_viewer::resource_string, *it)); - //Для каждого языка получим таблицу строк + //Для каждого языка получим таблицу строк for(pe_resource_viewer::resource_language_list::const_iterator lang_it = langs.begin(); lang_it != langs.end(); ++lang_it) { - string_data << L" -> Language = " << *lang_it << std::endl; //Запишем язык - //Таблица строк + string_data << L" -> Language = " << *lang_it << std::endl; //Запишем язык + //Таблица строк pe_resource_viewer::string_list strings(res.get_string_table_by_id_lang(*lang_it, *it)); - //Наконец, запишем все строки в поток + //Наконец, запишем РІСЃРµ строки РІ поток for(pe_resource_viewer::string_list::const_iterator str_it = strings.begin(); str_it != strings.end(); ++str_it) - string_data << L" --> #" << (*str_it).first << L": " << (*str_it).second << std::endl; //ID строки: ее значение + string_data << L" --> #" << (*str_it).first << L": " << (*str_it).second << std::endl; //ID строки: ее значение } string_data << std::endl; } - //Запишем полученные строки в файл + //Запишем полученные строки РІ файл std::ofstream strings_file("strings.txt", std::ios::out | std::ios::trunc | std::ios::binary); if(!strings_file) { @@ -204,7 +204,7 @@ int main(int argc, char* argv[]) } std::wstring strings_str(string_data.str()); - //Запишем буфер, чтобы не париться с локалями и записью юникода в файл + //Запишем буфер, чтобы РЅРµ париться СЃ локалями Рё записью СЋРЅРёРєРѕРґР° РІ файл strings_file.write(reinterpret_cast<const char*>(strings_str.data()), strings_str.length() * sizeof(wchar_t)); std::cout << "strings.txt created" << std::endl; @@ -213,7 +213,7 @@ int main(int argc, char* argv[]) } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/rich_overlay_stub_reader/main.cpp b/samples/rich_overlay_stub_reader/main.cpp index 35cabb8..fcfe0ff 100644 --- a/samples/rich_overlay_stub_reader/main.cpp +++ b/samples/rich_overlay_stub_reader/main.cpp @@ -1,9 +1,9 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include "lib.h" -//Пример, показывающий, как получить информацию о стабе PE-файла и rich overlay, который добавляет при компиляции MS Visual Studio +//Пример, показывающий, как получить информацию Рѕ стабе PE-файла Рё rich overlay, который добавляет РїСЂРё компиляции MS Visual Studio int main(int argc, char* argv[]) { if(argc != 2) @@ -12,7 +12,7 @@ int main(int argc, char* argv[]) return 0; } - //Открываем файл + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -22,29 +22,29 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); - //Выведем длину DOS stub'а + //Выведем длину DOS stub'Р° std::cout << "Image stub length: " << image->get_stub_overlay().length() << std::endl << std::endl; - //Перечисляем все RICH-записи + //Перечисляем РІСЃРµ RICH-записи pe_base::rich_data_list data = image->get_rich_data(); for(pe_base::rich_data_list::const_iterator it = data.begin(); it != data.end(); ++it) { - //Выводим информацию о записи + //Выводим информацию Рѕ записи std::cout << "Number: " << (*it).get_number() << std::endl << "Times: " << (*it).get_times() << std::endl << "Version: " << (*it).get_version() << std::endl << std::endl; } - //Отобразим информацию о том, есть ли у файла оверлей в конце (у некоторых инсталляторов, например, есть) + //Отобразим информацию Рѕ том, есть ли Сѓ файла оверлей РІ конце (Сѓ некоторых инсталляторов, например, есть) std::cout << "Has overlay in the end: " << (image->has_overlay() ? "YES" : "NO") << std::endl; } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/section_adder/main.cpp b/samples/section_adder/main.cpp index 8eeaf21..edd44f1 100644 --- a/samples/section_adder/main.cpp +++ b/samples/section_adder/main.cpp @@ -1,9 +1,9 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include "lib.h" -//Пример, показывающий, как добавить секцию в PE-файл и записать в нее какие-нибудь данные +//Пример, показывающий, как добавить секцию РІ PE-файл Рё записать РІ нее какие-РЅРёР±СѓРґСЊ данные int main(int argc, char* argv[]) { if(argc != 2) @@ -12,7 +12,7 @@ int main(int argc, char* argv[]) return 0; } - //Открываем файл + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -22,25 +22,25 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); - //Секцию можно добавить только после всех существующих, чтобы PE-файл не испортился - //Создаем новую секцию + //Секцию можно добавить только после всех существующих, чтобы PE-файл РЅРµ испортился + //Создаем РЅРѕРІСѓСЋ секцию pe_base::section new_section; - new_section.readable(true).writeable(true); //Делаем секцию доступной для чтения и записи - new_section.set_name("kaimi.ru"); //Ставим имя секции - максимум 8 символов - new_section.set_raw_data("Tralala"); //Устанавливаем данные секции + new_section.readable(true).writeable(true); //Делаем секцию доступной для чтения Рё записи + new_section.set_name("kaimi.ru"); //Ставим РёРјСЏ секции - максимум 8 символов + new_section.set_raw_data("Tralala"); //Устанавливаем данные секции - //Добавляем секцию. Все адреса пересчитаются автоматически - //Вызов вернет ссылку на уже добавленную секцию с пересчитанными адресами - //Совсем пустую секцию к образу добавить нельзя, у нее должен быть ненулевой размер данных или виртуальный размер + //Добавляем секцию. Р’СЃРµ адреса пересчитаются автоматически + //Вызов вернет ссылку РЅР° уже добавленную секцию СЃ пересчитанными адресами + //Совсем пустую секцию Рє образу добавить нельзя, Сѓ нее должен быть ненулевой размер данных или виртуальный размер pe_base::section& added_section = image->add_section(new_section); - //Если нужно изменить виртуальный размер секции, то делается это так: + //Если нужно изменить виртуальный размер секции, то делается это так: image->set_section_virtual_size(added_section, 0x1000); - //Создаем новый PE-файл + //Создаем новый PE-файл std::string base_file_name(argv[1]); std::string::size_type slash_pos; if((slash_pos = base_file_name.find_last_of("/\\")) != std::string::npos) @@ -54,14 +54,14 @@ int main(int argc, char* argv[]) return -1; } - //Пересобираем PE-файл + //Пересобираем PE-файл image->rebuild_pe(new_pe_file); std::cout << "PE was rebuilt and saved to " << base_file_name << std::endl; } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/sections_and_addresses/main.cpp b/samples/sections_and_addresses/main.cpp index cda14dc..43e2bd2 100644 --- a/samples/sections_and_addresses/main.cpp +++ b/samples/sections_and_addresses/main.cpp @@ -1,9 +1,9 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include "lib.h" -//Пример, показывающий, как работать с секциями в PE-файле +//Пример, показывающий, как работать СЃ секциями РІ PE-файле int main(int argc, char* argv[]) { if(argc != 2) @@ -12,7 +12,7 @@ int main(int argc, char* argv[]) return 0; } - //Открываем файл + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -22,22 +22,22 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); - //Выведем имя секции, в которой находится точка входа PE-файла - //В хитрых PE-файлах точка входа может находиться в заголовке, тогда section_from_rva бросит исключение + //Выведем РёРјСЏ секции, РІ которой находится точка РІС…РѕРґР° PE-файла + //Р’ хитрых PE-файлах точка РІС…РѕРґР° может находиться РІ заголовке, тогда section_from_rva Р±СЂРѕСЃРёС‚ исключение std::cout << "EP section name: " << image->section_from_rva(image->get_ep()).get_name() << std::endl; - //Длина "сырых" (raw) данных секции + //Длина "сырых" (raw) данных секции std::cout << "EP section data length: " << image->section_data_length_from_rva(image->get_ep()) << std::endl; - //Если у PE-файла есть импорты, выведем имя секции, в которой они находятся + //Если Сѓ PE-файла есть импорты, выведем РёРјСЏ секции, РІ которой РѕРЅРё находятся if(image->has_imports()) std::cout << "Import section name: " << image->section_from_directory(IMAGE_DIRECTORY_ENTRY_IMPORT).get_name() << std::endl; } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/tls_editor/main.cpp b/samples/tls_editor/main.cpp index e85a6ce..f122e81 100644 --- a/samples/tls_editor/main.cpp +++ b/samples/tls_editor/main.cpp @@ -1,21 +1,18 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include "lib.h" -//Пример, показывающий, как редактировать TLS (Thread Local Storage) у PE-файлов +//Пример, показывающий, как редактировать TLS (Thread Local Storage) Сѓ PE-файлов int main(int argc, char* argv[]) { - /* if(argc != 2) { std::cout << "Usage: tls_editor.exe PE_FILE" << std::endl; return 0; } - */ - //Открываем файл - argv[1] = "../../../mimimi/tests/Project1orig.exe"; + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -25,39 +22,39 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); - //Получим информацию о TLS PE-файла - //Если TLS нет, этот вызов выбросит исключение + //Получим информацию Рѕ TLS PE-файла + //Если TLS нет, этот вызов выбросит исключение pe_base::tls_info info = image->get_tls_info(); - //Пересоберем TLS - //Он, вероятно, будет иметь больший размер, чем до нашего редактирования, - //поэтому запишем его в новую секцию, чтобы все поместилось - //(мы не можем расширять существующие секции, если только секция не в самом конце файла) + //Пересоберем TLS + //РћРЅ, вероятно, будет иметь больший размер, чем РґРѕ нашего редактирования, + //поэтому запишем его РІ РЅРѕРІСѓСЋ секцию, чтобы РІСЃРµ поместилось + //(РјС‹ РЅРµ можем расширять существующие секции, если только секция РЅРµ РІ самом конце файла) pe_base::section new_tls; - new_tls.get_raw_data().resize(1); //Мы не можем добавлять пустые секции, поэтому пусть у нее будет начальный размер данных 1 - new_tls.set_name("new_tls"); //Имя секции - new_tls.readable(true); //Доступна на чтение - pe_base::section& attached_section = image->add_section(new_tls); //Добавим секцию и получим ссылку на добавленную секцию с просчитанными размерами + new_tls.get_raw_data().resize(1); //РњС‹ РЅРµ можем добавлять пустые секции, поэтому пусть Сѓ нее будет начальный размер данных 1 + new_tls.set_name("new_tls"); //РРјСЏ секции + new_tls.readable(true); //Доступна РЅР° чтение + pe_base::section& attached_section = image->add_section(new_tls); //Добавим секцию Рё получим ссылку РЅР° добавленную секцию СЃ просчитанными размерами - if(info.get_callbacks_rva() != 0) //Если у TLS есть хотя бы один коллбек - info.add_tls_callback(0x100); //Добавим новый коллбек в TLS - относительный адрес, скорее всего, некорректен, поэтому программа не запустится (просто для примера) + if(info.get_callbacks_rva() != 0) //Если Сѓ TLS есть хотя Р±С‹ РѕРґРёРЅ коллбек + info.add_tls_callback(0x100); //Добавим новый коллбек РІ TLS - относительный адрес, скорее всего, некорректен, поэтому программа РЅРµ запустится (просто для примера) - info.set_raw_data("Hello, world!"); //Установим или заменим "сырые" данные TLS - info.set_raw_data_start_rva(image->rva_from_section_offset(attached_section, 0)); //Расположим их с начала добавленной секции - info.recalc_raw_data_end_rva(); //Просчитаем новый конечный адрес "сырых" данных + info.set_raw_data("Hello, world!"); //Установим или заменим "сырые" данные TLS + info.set_raw_data_start_rva(image->rva_from_section_offset(attached_section, 0)); //Расположим РёС… СЃ начала добавленной секции + info.recalc_raw_data_end_rva(); //Просчитаем новый конечный адрес "сырых" данных - //Пересобираем TLS, расположив их с 50-го байта (будет выровнено, секция будет автоматически расширена) новой секции и записав новые данные TLS в PE-заголовок - //По умолчанию функция пересобирает также TLS-коллбеки и "сырые" данные TLS, располагая их по указанным в структуре info адресам - //Опция expand позволяет задать, как должны распологаться "сырые" данные - //tls_data_expand_raw позволяет увеличить "сырой" размер секции, то есть размер в файле - //tls_data_expand_virtual позволяет увеличить виртуальный размер секции с данными TLS - //Если не хватит места под данные TLS, будет записана только их часть, или вообще ничего записано не будет + //Пересобираем TLS, расположив РёС… СЃ 50-РіРѕ байта (будет выровнено, секция будет автоматически расширена) РЅРѕРІРѕР№ секции Рё записав новые данные TLS РІ PE-заголовок + //РџРѕ умолчанию функция пересобирает также TLS-коллбеки Рё "сырые" данные TLS, располагая РёС… РїРѕ указанным РІ структуре info адресам + //Опция expand позволяет задать, как должны распологаться "сырые" данные + //tls_data_expand_raw позволяет увеличить "сырой" размер секции, то есть размер РІ файле + //tls_data_expand_virtual позволяет увеличить виртуальный размер секции СЃ данными TLS + //Если РЅРµ хватит места РїРѕРґ данные TLS, будет записана только РёС… часть, или вообще ничего записано РЅРµ будет image->rebuild_tls(info, attached_section, 50); - //Создаем новый PE-файл + //Создаем новый PE-файл std::string base_file_name(argv[1]); std::string::size_type slash_pos; if((slash_pos = base_file_name.find_last_of("/\\")) != std::string::npos) @@ -71,14 +68,14 @@ int main(int argc, char* argv[]) return -1; } - //Пересобираем PE-файл + //Пересобираем PE-файл image->rebuild_pe(new_pe_file); std::cout << "PE was rebuilt and saved to " << base_file_name << std::endl; } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } diff --git a/samples/tls_reader/main.cpp b/samples/tls_reader/main.cpp index b2bb31e..c2ccc2d 100644 --- a/samples/tls_reader/main.cpp +++ b/samples/tls_reader/main.cpp @@ -1,10 +1,10 @@ -#include <iostream> +п»ї#include <iostream> #include <fstream> #include <pe_factory.h> #include "lib.h" -//Пример, показывающий, как считать и получить информацию о статическом TLS (Thread Local Storage, локальная память потока) -//PE или PE+ файла +//Пример, показывающий, как считать Рё получить информацию Рѕ статическом TLS (Thread Local Storage, локальная память потока) +//PE или PE+ файла int main(int argc, char* argv[]) { if(argc != 2) @@ -13,7 +13,7 @@ int main(int argc, char* argv[]) return 0; } - //Открываем файл + //Открываем файл std::ifstream pe_file(argv[1], std::ios::in | std::ios::binary); if(!pe_file) { @@ -23,29 +23,29 @@ int main(int argc, char* argv[]) try { - //Создаем экземпляр PE или PE+ класса с помощью фабрики + //Создаем экземпляр PE или PE+ класса СЃ помощью фабрики std::auto_ptr<pe_base> image = pe_factory::create_pe(pe_file); std::cout << "Reading PE TLS info..." << std::hex << std::showbase << std::endl << std::endl; - //Получаем информацию о TLS + //Получаем информацию Рѕ TLS const pe_base::tls_info info = image->get_tls_info(); - //Выводим информацию о TLS + //Выводим информацию Рѕ TLS std::cout << "Callbacks RVA: " << info.get_callbacks_rva() << std::endl << "Index RVA: " << info.get_index_rva() << std::endl << "Raw data start RVA: " << info.get_raw_data_start_rva() << std::endl << "Raw data end RVA: " << info.get_raw_data_end_rva() << std::endl << "Size of zero fill: " << info.get_size_of_zero_fill() << std::endl; - //Выведем TLS-коллбеки: + //Выведем TLS-коллбеки: const pe_base::tls_info::tls_callback_list& tls_callbacks = info.get_tls_callbacks(); for(pe_base::tls_info::tls_callback_list::const_iterator it = tls_callbacks.begin(); it != tls_callbacks.end(); ++it) std::cout << "Callback: " << (*it) << std::endl; } catch(const pe_exception& e) { - //Если возникла ошибка + //Если возникла ошибка std::cout << "Error: " << e.what() << std::endl; return -1; } -- GitLab