Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
 Аватар для netBool
325 / 304 / 173
Регистрация: 16.11.2010
Сообщений: 1,069
Записей в блоге: 9

Изменение PE-заголовка в процессе выполнения программы

16.07.2017, 07:53. Показов 2367. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Задался задачей изменить часть PE-заголовка в процессе выполнения программы (сразу хочу оговориться, что это не вирус). Все примеры самомодифицирующегося кода, кот. я нашел в интернете происходят в .code.
Задача усложняется тем, что программа при запуске сначала считывает заголовки (и как я понял, делает это один раз при запуске и больше к ним не возвращается). Таким образом если я изменю заголовок после запуска, толку не будет никакого.
Была идея сделать модификацию заголовка с помощью дос заглушки, но как ее запустить так, чтобы по ее завершению продолжала выполняться основная программа, я не нашел..
Решил спросить у более грамотных людей, чем я, может быть есть еще какие-нибудь варианты решения?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.07.2017, 07:53
Ответы с готовыми решениями:

Ошибка в процессе выполнения программы
Здравствуйте, не могу понять, почему выводится ошибка, что команда не найдена в 4 строке, где if, как я понимаю он ругается на -lt, что...

Прерывание программы в процессе выполнения
Доброго времени суток! Подскажите, есть ли возможность прерывать программу во время выполнения? Т.е. у меня в программе есть цикл,...

Консоль закрывается в процессе выполнения программы - С++
В Visual Studio в процессе выполнения программы и в процессе работы закрывается через какое- то время консоль, сразу же открывается как...

8
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
16.07.2017, 09:29
PE заголовок считывает не программа, а ОС при настройке окружения для запуска программы пользователя. Поэтому все изменения вступят в силу лишь при следующем запуске. Это при условии, что ОС позволит модифицировать используемый файл.
DOS заглушка запускается лишь ОС, которая не умеет запускать файлы формата PE, но умеет запускать файлы формата MZ - т.е. DOS. Поэтому и название - DOS-заглушка.

Думаю, что нужно "копать" в направлении упаковщиков файлов - подобия upx. Когда-то попадались статьи, в которых пояснялось пошаговое написание подобных пакеров (кажется, в электронной версии журнала "Хакер" за начало века).
1
 Аватар для netBool
325 / 304 / 173
Регистрация: 16.11.2010
Сообщений: 1,069
Записей в блоге: 9
16.07.2017, 09:50  [ТС]
Основную идею пакеров запаковки и распаковки функций я, как мне кажется, уловил. Хотя и не реализовывал.

Моей целью является конспирация .Нет приложения. А там своя специфика запаковки и распаковки, в принципе тоже вполне реализуемая. Но она не конспирирует .Нет.(((

Я видел некоторые обфускаторы, которые выдавали .НЕТ приложения за обычные PE (не NET), и при этом они успешно запускались... в общем-то в связи с чем и связаны мои поиски..
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
16.07.2017, 10:21
Цитата Сообщение от netBool Посмотреть сообщение
Моей целью является конспирация .Нет приложения.
Что конкретно ты подразумеваешь под конспирацией?

Даже если я запустил приложение, которое "не выглядит" как .NET, я могу, например,
посмотреть (Process Explorer, Process Hacker, Toolhelp API и т.д.) список загруженных
модулей или стеки потоков и увидеть там mscoree.dll. И таким образом узнать,
что это все-таки .NET...

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Поэтому все изменения вступят в силу лишь при следующем запуске. Это при условии, что ОС позволит модифицировать используемый файл.
Это если мы пытаемся модифицировать файл на диске. Что ОС, естественно, сделать не даст.
Но можно исхитриться и попробовать модифицировать PE-заголовок в памяти процесса еще до того,
как загрузчик вытащит из него нужные данные, которые относятся к .NET.

В общем, сложно, но не невозможно, скорее всего. IDA Pro + отладчик и вперед с песней
1
 Аватар для netBool
325 / 304 / 173
Регистрация: 16.11.2010
Сообщений: 1,069
Записей в блоге: 9
16.07.2017, 12:12  [ТС]
Даже если я запустил приложение, которое "не выглядит" как .NET, я могу, например,
посмотреть (Process Explorer, Process Hacker, Toolhelp API и т.д.) список загруженных
модулей или стеки потоков и увидеть там mscoree.dll. И таким образом узнать,
что это все-таки .NET...
Да, от этого не защититься... 100% защитить .NET приложение наверное невозможно

Но можно исхитриться и попробовать модифицировать PE-заголовок в памяти процесса еще до того,
как загрузчик вытащит из него нужные данные, которые относятся к .NET.
Верно, такая и задумка. Но способа я так и не придумал..
Были мысли по поводу перехвата CreateProcess, потом проверка - если это мое приложение, то меняем ПЕ-заголовок (добавляю офсет на .НЕТ метаданные) и запускаем как .НЕТ. Но способ не оч. хорош, т.к. на любой хук будут ругаться все известные антивирусы. Это не то, чтобы неприемлемо. Но неприятно
До этого была идея как-то изменить заголовок с помощью дос-заглушки. Но если есть значение на PE File Header в DOS-заголовке, то дос программа не запускается. А если нет, то запускается и.... закрывается. Если из нее прыгнуть на адрес с PE-программой, то она будет пытаться тоже выполнятсься как дос... И тут тупик
Потом появились идея запустить дос, изменить заголовок и потом из доса уже вызвать повторно CreateProcess. Даже не знаю, прокатит ли. Тут я уперся элементарно в то, как вызвать АПИ из доса . Технология устаревает, уже мало информации в сети. Вроде как теоретически вызывать можно, но не все..

Пока на этом встал
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
16.07.2017, 19:35
Цитата Сообщение от netBool Посмотреть сообщение
Была идея сделать модификацию заголовка с помощью дос заглушки, но как ее запустить так, чтобы по ее завершению продолжала выполняться основная программа, я не нашел..
Даже если найдете, это не будет работать под WinX64, там нет vdm.
Цитата Сообщение от netBool Посмотреть сообщение
Я видел некоторые обфускаторы, которые выдавали .НЕТ приложения за обычные PE (не NET), и при этом они успешно запускались... в общем-то в связи с чем и связаны мои поиски..
Это сделать несложно. Можно использовать классический алгоритм загрузки PE (мэппинг образа, настройка релоков/импорта, правка PEB etc) с небольшим дополнением. Дело в том, что NET-приложение, в процессе работы, периодически мэппингует свой PE с диска. И для корректной работы придется хучить ZwMapViewOfSection и подсовывать оригинальный образ. В добавок можно присвоить LDR_DATA_TABLE_ENTRY.Flags флаг LDRP_COR_IMAGE. Хотя последнее, возможно, необязательно. Будет работать от XP до 10.

Добавлено через 33 минуты
Да, забыл один нюанс. Для NET PE64 вместо передачи управления на AddressOfEntryPoint, нужно вызывать _CorExeMain из mscoree.dll.
0
 Аватар для netBool
325 / 304 / 173
Регистрация: 16.11.2010
Сообщений: 1,069
Записей в блоге: 9
16.07.2017, 19:50  [ТС]
Цитата Сообщение от jupman Посмотреть сообщение
Это сделать несложно. Можно использовать классический алгоритм загрузки PE (мэппинг образа, настройка релоков/импорта, правка PEB etc) с небольшим дополнением. Дело в том, что NET-приложение, в процессе работы, периодически мэппингует свой PE с диска.
Что-то у меня пробел какой-то в матчасти по мэппингу... Если я правильно понимаю, это проецирование программы в опер. памяти с перераспределением адресов? Тогда можно править PE-заголовок непосредственно в этом образе?
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
16.07.2017, 20:25
Цитата Сообщение от jupman Посмотреть сообщение
Для NET PE64 вместо передачи управления на AddressOfEntryPoint, нужно вызывать _CorExeMain из mscoree.dll.
Я ошибся, нужно всегда вызывать _CorExeMain из mscoree.dll вместо передачи на AddressOfEntryPoint.

Добавлено через 7 минут
Цитата Сообщение от netBool Посмотреть сообщение
Если я правильно понимаю, это проецирование программы в опер. памяти с перераспределением адресов?
Да. Выделяешь память размером с SizeOfImage, размещаешь секции, настраиваешь протекции.
Цитата Сообщение от netBool Посмотреть сообщение
Тогда можно править PE-заголовок непосредственно в этом образе?
Исходного заголовка вообще не будет, ты его расшифруешь в рантайме.
1
 Аватар для netBool
325 / 304 / 173
Регистрация: 16.11.2010
Сообщений: 1,069
Записей в блоге: 9
17.07.2017, 09:35  [ТС]
Спасибо! Буду разбираться! Мне всегда было интересно, как можно запустить программу из образа. В частности и из образов, созданных с помощью ngen. Попробую разобраться
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.07.2017, 09:35
Помогаю со студенческими работами здесь

Создание структур в процессе выполнения программы
Решал одну задачу и возникла проблема. В сети в разное количество времени присутствует разное количество абонентов, как только приходит...

В процессе выполнения программы открыть ехешник
Доброго времени суток! Необходимо открыть ехешный файл во время выполнения программы. Вот как я хотел сделать: Var x: text; ...

Создание массивов в процессе выполнения программы
Здравствуйте. Передо мной постала задача такого рода: Есть массив строк определенного размера, который заполняется и когда наполняется...

Создание объекта в процессе выполнения программы
Допустим нужно в процессе выполнения программы показать на форме компонент TImage(который ранее не создан), а затем вывести из памяти. ...

Создание массива в процессе выполнения программы
К примеру нужно в процессе выполнения программы создать массив. Т.е. этот массив не определен заранее. Ситуация - таких массивов может быть...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru