Nano Hash - криптовалюты, майнинг, программирование

Перемещение данных между разделами Portable Executable (PE)

У меня есть несколько вопросов относительно структуры Portable Executable.

Я нашел отличное начало благодаря паре хорошо написанных статей здесь и здесь; однако у меня все еще нет ответа.

Я полагаю, и пожалуйста, поправьте меня, если я ошибаюсь, что данные в определенном разделе структуры PE загружаются и выполняются операционной системой. Например, возьмем разделы .text и .data.

Судя по тому, что я прочитал, раздел .data содержит какие-то инструкции, а раздел .text содержит фактические данные для запуска.

Мне любопытно узнать, возможно ли хранить данные файла в разделе .text и динамически перемещать его в раздел .text, который затем автоматически (загружает/запускает/запускает) данные файла, которые сейчас находятся в .text раздел.

Если вы не понимаете, о чем я спрашиваю, позвольте мне перефразировать.

  1. Где (в каком разделе) хранятся основные данные файла?
  2. Как мне перемещать данные между разделами на С#? Я предполагаю, что мне придется использовать указатели для этого.
  3. Правильно ли я думаю, что такая функция вообще будет работать?
01.02.2012

Ответы:


1

Правильно ли я думаю, что такая функция вообще будет работать?

No :)

Мне вообще непонятно, чего вы хотите достичь - вы говорите так, как будто говорите о собственных PE, потому что PE .NET на самом деле не имеют ничего, кроме данных в PE.

В любом случае PE сопоставляется Windows во время загрузки модуля (EXE или DLL), поэтому вы не можете модифицировать его на лету.

01.02.2012
  • Да, и чтобы уточнить, для нативных модулей сегмент .text обычно содержит двоичный код, а сегмент .data определяет неинициализированные переменные. Инициализированные переменные (константы) обычно определяются в сегменте .bss. 01.02.2012
  • Я знаю, что это можно сделать, хотя я видел приложения, которые делают именно это. Я не думаю, что будет справедливо сказать, что это невозможно ^^ ;) 01.02.2012
  • Пожалуйста, если у вас есть время, давайте продолжим это обсуждение здесь: chat.stackoverflow.com/rooms/7254/pe -header-discussion Я объясню, как смогу. 02.02.2012
  • Увы, бываю тут только время от времени между компиляциями и встречами и так далее :) 02.02.2012
  • Хорошо, дайте мне знать, когда вы вернетесь в онлайн, и я отправлю приглашение :) 04.02.2012

  • 2

    Для файлов PE или PE+ с собственным кодом ответы на эти вопросы будут сильно отличаться, и эти вещи будут правдоподобными.

    Однако для сборки .NET, инкапсулированной в PE, многое меняется. PE/PE+ — это просто контейнер для хранения, на который загрузчик ОС почти не ссылается.

    Вы можете загрузить в память сборку и выполнить ее, поэтому то, что вы предлагаете, теоретически возможно. ОДНАКО, это не имеет ничего общего с перемещением кода из одного раздела PE в другой.

    Вы бы динамически выделяли виртуальную память для чтения и записи, записывали в нее свой код, изменяли атрибуты на чтение и выполнение (добавляя выполнение, удаляя запись), а затем вызывали соответствующий код загрузчика сборки .NET. Найдите для этого различные методы Invoke.

    02.02.2012
  • Хорошо, тогда это звучит как план. Итак, используя приведенные выше предложения, я мог бы запустить (вставить) файл из другого файла? Таким образом, при запуске файла A файл B также будет внедрен. Я прав? 03.02.2012
  • Да, это работает. Как автор PECompact, именно так я реализовал элементарное сжатие .NET. Образ .NET PE сжимается и встраивается в новый собственный PE. Я распаковываю .NET PE, затем «запускаю» его из памяти (конечно, никогда не распаковывая на диск). 06.02.2012
  • Я предполагаю, что вы не хотели бы показать небольшой пример, чтобы начать меня? :) 06.02.2012
  • Извините за задержку. Я думаю, это зависит. Вы конкурент? РЖУ НЕ МОГУ. Ненавижу задавать такие вопросы, но в прошлом я помогал людям, а потом они приходили и соревновались со мной — хотя это ни для кого не ново, не так ли? Во всяком случае, в Интернете есть образец с открытым исходным кодом, я могу вам многое сказать ;) 15.03.2012
  • Я далеко не конкурент, хех. Как видите, я понятия не имею, что вообще делаю. В любом случае, с тех пор я ушел от этого вопроса. Хотя спасибо за ответ :) 15.03.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..