       


       Утилита для принудительного выставления на секцию флага записи
                          исходники прилагаются
         (специально для проекта С--, http://c--sphinx.narod.ru/)

            Andrey Ch sofandr@mail.ru, http://pascal.vov.ru/



Причины появления этой утилиты pewr v001.

Мне интересно было создать при помощи  С--, obj файл.
После некоторой переписке с Michael Sheker sheker@mail.ru
удалась создать obj файл а так же с помощью линковщика ALINK'а
получить исполняемый файл PE формата для WINDOWS.
Обрадовался этому, но Michael мне сказал что программа не будет
работать нормально так как секция кода не содержит флага записи.
Это  надо  так  как  отдельной  секции  данных нет. Все в одной секции, код
и данные. (так было понято мной)

Но вот и сделал утилиту pewr.exe которая добавляет флаг записи.

Нужно еще сказать что не нашел нужных опций у линкера ALINK, 
для того что бы указать флаг записи при линкови.
Это и послужило к идеи написания внешней утилиты.
Сама же идея принадлежит Michael S.
 
Ну вот и все.



                         ИНСТРУКЦИЯ

Использовать так:

pewr.exe <имя exe файла PE формата>  <имя секции>


c:\>pewr.exe HELLOW_32_2.EXE _TEXT


Версия 001 ---  22 Августа 2003 года

По указанию Michael Sheker: 
Если с флагами работать, как это делаешь ты, то конечно будут
проблемы. Если надо убрать какой-то бит, то делают AND с инверсным
значением. Если надо установить, то делают OR, а не сложение. И тогда,
хоть сто раз устанавливай флаг, проблем не будет.

В связи с этим подправил код.
Теперь флаг не добавляется оператором ADD а применяется лог OR.
То есть флаг добавится в случае его отсутствия.




Версия 000 ---
Внимание, программ не проверяет присутствует ли в секции флаг записи
если он есть то программа добавит флаг еще раз.
И получится непредвиденные результаты. Лично еще не проверял
что будет.

Значит перед использованием хорошо убедится что заданная секция
не содержит флага записи.
Для этого есть множество способов, в папке util есть утилита от 
VC 6.0 DUMPBIN.EXE, она хорошо покажет всю структуру файла PE.

Пример:
C:\>DUMPBIN.EXE /ALL /OUT:DUMP.TXT  HELLOW_32_2.EXE

получили на выходе файл DUMP.TXT
====================cut==============================

Dump of file HELLOW_32_2.EXE

PE signature found


.....пропуск..........................

SECTION HEADER #2
   _TEXT name
    1000 virtual size
    2000 virtual address
      4D size of raw data
     400 file pointer to raw data
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
60000060 flags
         Code
         Initialized Data
         Execute Read
;
====================cut==============================
 
Нашли ту секцию которая подлежит исправлению
смотрим на флаги:
60000060 flags
         Code
         Initialized Data
         Execute Read
Как видно нет флага записи.

значит эту секцию и будем изменять c помощью pewr.exe:

c:\pewr.exe HELLOW_32_2.EXE _TEXT
                             ^^^^^имя секции


Получили:
==========cut===========
D:\fasm\c--\MyProg\flagRW>pewr.exe HELLOW_32_2.EXE _TEXT
Andrey Ch, sofandr@mail.ru, http://pascal.vov.ru/
Successful, add flag write in section
^^^^^^^^^ это значит что удачно сделали изменение


Что бы убедится о верности делаем повторно дамп:
DUMPBIN.EXE /ALL /OUT:DUMP.TXT  HELLOW_32_2.EXE

========Cut dump.txt===================
SECTION HEADER #2
   _TEXT name
    1000 virtual size
    2000 virtual address
      4D size of raw data
     400 file pointer to raw data
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
E0000060 flags
         Code
         Initialized Data
         Execute Read Write
=========================================

E0000060 flags
         Code
         Initialized Data
         Execute Read Write
                      ^^^^^^^^^^^^^КАК видим все так как хотели.






;---------------------------------------------------------------------
;Далее инфа которая была вытащена с разных источников

PE можно представить как логический диск.

PE формат файлов:

DOS MZ-заголовок 
DOS stub 
Заголовок РE              ;загрузочный сектор    IMAGE_NET_HEADERS   
Таблица  секций           ;таблица  секций, представляющая собой
                          ;массив  структур.  Каждая  структура  содержит  
                          ;информацию  о каждой секции
                          ;в  РE-файле,  такую как ее атрибут, 
                          ;смещение в файле, виртуальное смещение.
                          ;Если  в  файле  5  секций, то будет ровно 5 членов
                          ;в этом массиве структур.
                          ;Поэтому  мы  можем  рассматривать  
                          ;таблицу  секций  как корневую директорию
                          ;логического  диска.  Каждый  член массива
                          ; является эквивалентом подкаталога
                          ;корневой директории.




Секция 1                  ;секции - это файлы на диске. 
Секция  2                 ;Файлы могут иметь различные атрибуты, такие как
                          ;"только чтение", системный, спрятанный, архивный
                          ;и т.п

Секция ... 
Секция n 


Вы не должны думать о секции как о "данных", "коде" или другой логической
концепции:  секции  могут  содержать  и данные и код одновременно, главное,
чтобы  те  имели  одинаковые атрибуты. Если у вас есть данные, и вы хотите,
чтобы  они  были доступны только для чтения, вы можете поместить эти данные
в секцию, помеченную соответствующим атрибутом.


Когда  РE-файл  запускается,  РE-загрузчик  проверяет DOS MZ-заголовок, для
того,   чтобы   определить   смещение   РE-заголовка.   Если  оно  найдено,
то  загрузчик  переходит  к  РE-заголовку. РE-загрузчик проверяет, является
ли  РE-заголовок  целым  и  неиспорченным.  Если  это  так, то он переходит
к  концу  РE-заголовка.  За  ним  незамедлительно  следует  таблица секций.
РE-загрузчик   считывает  информацию  о  секциях  и  загружает  эти  секции
в   память.  Также  он  устанавливает  каждой  секции  атрибуты,  указанные
в  таблице  секций. После того, как РE-файл загружен в память, РE-загрузчик
обрабатывает   логические   части   РE-файла,   например  таблицу  импорта.
Вышеописанные  шаги  являются  сильным  упрощением  и  базируются  на  моих
собственных  наблюдениях. Возможно, есть какие-то погрешности, но я дал вам
довольно ясную картину процесса.



Есть  слово, которое часто используется по отношению к формату PE: RVA. RVA
расшифровывается  как  относительный  виртуальный  адрес  (relative virtual
address). Вы знаете что такое виртуальный адрес. Сложное, на первый взгляд,
словосочетание   RVA  служит  для  обозначения  простой  концепции.  Просто
представьте,  что  RVA  - это расстояние до ссылающейся точки в виртуальном
адресном  пространстве.  Я уверен, что вы знакомы с файловым смещением: RVA
точно  тоже  самое,  что  и  файловое  смещение. Тем не менее, RVA задается
относительно  положения  в  виртуальном  адресном пространстве, а не файла.
Я   покажу   вам   пример.  Если  PE-файл  загружается  по  адресу  400000h
в  виртуальном  адресном  пространстве  и  программа  начинает  выполняться
с  адреса  401000h,  мы  можем  сказать, что программа начинает выполняться
с  RVA  1000h. RVA определяется относительно стартового виртуального адреса
модуля.


