Код и данные в одной секции

Тема в разделе "WASM.WIN32", создана пользователем Zombook, 21 авг 2004.

  1. Zombook

    Zombook New Member

    Публикаций:
    0
    Регистрация:
    21 авг 2004
    Сообщения:
    4
    Пытаюсь объединить данные и код в одну секцию. Данные должны поддаваться изменению.



    .386

    .model flat, stdcall

    extern GetModuleHandleA:proc, ExitProcess:proc



    .code

    start:

    call GetModuleHandleA, 0

    mov hInst, eax

    call ExitProcess, 0

    hInst dd ?

    end start



    При старте выскакивает ошибка "00401007h couldn't be written".

    У секции code поле flag = 60000020h, я поменял на E0000020h.

    Ошибка изменилась на "00000000h couldn't be written".

    Та же ошибка при flag=F0000060h, F00000E0h, E00000E0h.

    У меня щас 3 вопроса

    1. Возможно ли вообще объединить код и изменяемые из него данные?

    2. Какой же всё-таки должен flag у секции?

    3. Можно ли заставить tasm прописывать нужный flag при создании EXE?



    P.S. И, кстати, как грамотрее называть поле flag (название взято из hiew)?

    PE Tools->Pe Editor называет его "Characteristics".

    Мне лично нравится "Attributes".
     
  2. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
    У Billy Belcebu упоминалась утилита pewrsec которая нужным образом меняет атрибуты.



    Сделать такой изврат проще с помощью fasm-а:



    section '.code' code readable writeable executable

    Здесь идет сначала код, а затем (после ExitProcess) данные

    У такой секции flag=E0000060



    Еще это умеет делать мелкософтовский линкер, а насчет tlink-а не знаю, не пробовал.
     
  3. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    в масме есть утилитка editbin - запусти с /? узнай ключи - любой секции любой параметр можно включить/выключить и еще кое-что
     
  4. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Zombook, набери в поиске "merge".
     
  5. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Zombook





    Вообще возможно всё обьеденить в одну секцию .

    Секции "не отвечают" за то , что например содержат в себе импорт или данные . Для этого существует Data Directories в PE . Правда если есть ресурсы , то наверное они должны располагаться первыми , чтоб была видна иконка у ехе .



    А у секции (страницы в памяти) главное чтоб стоял доступ на запись если требуеться . И достигнуть этого , до момента исполнения кода , наверное можно только одним способом - установкой требуемой характеристики секции в PE , тогда это сделает лоадер .



    Теоретически ... Но а практически , в аттаче пример :

    - всё в одной секции

    - атрибут на запись НЕ стоит

    - и это работает (тестил w95,NT4.0,w2ksp4)

    [​IMG] _752585500__project.zip
     
  6. Zombook

    Zombook New Member

    Публикаций:
    0
    Регистрация:
    21 авг 2004
    Сообщения:
    4
    Это я тормозил... Tasm, оказывается, не добавляет import table (.idata), если в исходнике нет .data или .data ничего не содержит. И несмотря на extern GetModuleHandleA:proc, ExitProcess:proc полученный EXE содержит лишь одну секцию - CODE (!). Из-за этого и было обращение к 00000000.



    Синтаксис Fasm показался мне неудобным, непривычно как-то.

    Но, похоже, придётся его юзать, раз Tasm такой тупой :)

    Да, еще одна проблема - Fasm добавляет лишнюю секцию .reloc, приходится каждый раз убирать с помощью PE Tools->Rebuild PE.



    Всем спасибо!
     
  7. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine




    Да ну , кажеться FASM сам добавляет только секцию .flat с неинициализированными данными , если такие будут перед первой секцией .
    Код (Text):
    1. format PE GUI 4.0
    2. rb 1000h
    3. section  '.code' code readable writeable


    Т.е. rb 1000h попадут в секцию flat , а самом файле их не будет .
     
  8. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    bogrus >




    Похоже, что для иконки это не важно (см. аттач), а вот для Version Info необходимо, т.к. если IMAGE_RESOURCE_DIRECTORY находится НЕ в начале секции, то виндос не показывает инфу по правому клику :dntknw:





    Zombook >




    FASM добавляет релоки, если fixups указано для какой-нибудь секции.

    [​IMG] _865613036__window.zip
     
  9. one

    one New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2004
    Сообщения:
    4
    Читай информацию в MSDN по темам: Virtual, Alloc, Protect...



    В твоём случае поможет функция VirtualProtect

    Syntax: BOOL VirtualProtect( LPVOID lpAddress, DWORD dwSize, DWORD flNewProtect, PDWORD lpflOldProtect);



    .386

    .model flat, stdcall



    include c:\masm32\include\windows.inc

    include c:\masm32\include\kernel32.inc



    includelib c:\masm32\lib\kernel32.lib





    .code

    start:



    invoke GetModuleHandle, 0

    ;-------------

    push 0

    push PAGE_READWRITE

    push 4

    push offset hInst

    call VirtualProtect

    ;-------------

    mov hInst, eax

    invoke ExitProcess,eax

    hInst dd ?

    end start



    end start
     
  10. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    S_T_A_S_





    Привет . Я вот думаю , а какая разница в начале секции или нет . Врядли ресурсных api-шек это интересует . Они скорее смотрят смещение таблицы ресурсов в Data Directories PE заголовка , а потом от него перебирают на предмет RT_ICON,RT_GROUP_ICON,RT_DIALOG и т.д. , смотря что они ищут . Т.е. по аналогии с таблицей импорта , идёт перебор модулей , ф-ций и заметь , они не глючат где бы не располагались .



    FASM кажеться ещё не умеет (или я не знаю как) хранить в одном ресурсе RT_GROUP_ICON несколько записей об RT_ICON .

    Т.е. чтобы можно было по разным своим идентификаторам обращаться к разным иконкам одного и того же .ico файла .

    А в твоём аттаче ресурсы интересные , PE Explorer говорит они повреждены или пожаты , а на файле window2.exe вообще их не может найти .



    Я к тому , что может макросы FASM-а пока не отлажены как следует , т.е. надо будет ещё попробывать с ресурсами внешнего редактора .
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    one



    Это круто, для своего же процесса VirtualAlloc юзать :derisive:
     
  12. one

    one New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2004
    Сообщения:
    4
    А чем, Asterix, не нравиться идея изменение доступа из кода программ?
     
  13. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    bogrus >




    Дык вот сам не пойму, почему так. Но факт.

    Скомпилировал ещё один вариант, там и иконка и version info есть, но т.к. IMAGE_RESOURCE_DIRECTORY сдвинута, то version info не показывает (в XP по крайней мере).

    Хотя оно там всё есть, и смещения вроде правильные (всё это одни и теже макросы делают).

    У меня были проблемы с ресурсами из-за того, что не выравнивал данные по DWORD, но тут уже такого нет.



    Макросы для ресурсов я делал сам, есть тут.

    Всё по Microsoft Portable Executable and Common Object File Format Specification.

    Но там явно указано, что под ресурсы должна быть отдельная секция, таким образом IMAGE_RESOURCE_DIRECTORY обязательно будет в начале!

    Ещё где-то встечал упоминания про то, что название этой секции важно, т.к. в какой-то dll якобы есть привязка именно к нему, но на практике я с проблемами из-за этого не сталкивался, подозреваю, что это для виндос 95 какого-нибудь.





    PE Explorer у мя нет, да после такой рекламы и качать что-то не охота :).

    Смотрю всё PEview, маленький и на асме написан :).

    У него, кстати, есть один глюк, связанный с определением IMAGE_RESOURCE_DATA_ENTRY, я сообщал автору, но он вроде бы так и не испровавил.

    Мои макросы сейчас построены с учетом того, чтобы этот глюк не проявлялся.





    one >




    Дык проще сразу указать R/W/E атрибуты для секции :derisive:

    [​IMG] _1899992397__window2.zip
     
  14. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    S_T_A_S_

    Теоретически, ведь никто не мешает сделать в файле всего одну секцию, обозвать ее .rsrc, причем ресурсы расположить строго вначале секции, а код сразу за ресурсами, тогда вроде все формальности будут соблюдены и файл должен быть валиден для всех систем, вот только антивири могут ругатца :)
     
  15. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    S_T_A_S_




    Тогда мне не понятно , почему PE Explorer на них злиться , а те что с фасмом идут - глотает нормально .

    PE Explorer явно должен вести себя соответственно MSPECOFF .







    Я не могу найти такого упоминания







    Нагуглил "oleaut32.dll rsrc TYPELIBS" , но не знаю каким боком oleaut32.dll к этому относиться . Я тестил имя секции отличное от .rsrc (даже пробывал в VB-шной проге менять) и никаких проблем не возникло .



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

    И побочная проблема , а может и нет : Не всякий пакер такой файл запакует , а редактор ресурсов поправит . PE Explorer в таком случае удаляет из файла всё кроме ресурсов , ессно файл становиться не рабочий , а ResHacker вообще ресурсов не видит .



    Asterix

    KAV не ругаитца :) , об других антивирях интересно услышать .

    [​IMG] 1437781759__project.zip
     
  16. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    bogrus

    > KAV не ругаитца :) , об других антивирях интересно услышать.



    Каспер ругаитца и ещё как, ибо других антивирей не держим.

    Хошь выложу calc.exe от XP, в котором я в секцию ресурсов добавил немножко кода, Каспер сказал что файл подозрительно похож на вирус :) хотя возможно твой файл у него и не вызывает подозрений :derisive:
     
  17. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Asterix >




    Дык с этим никто не спорит. Проблема в том, что если делать по другому, то работает не всегда. :)







    bogrus >




    IMHO глючный он!

    Потому что не вычисляет адрес для каждого ресурса в отдельности через их каталог, а полагается на их определённый порядок в файле.

    Если используется кампиляторы ресурсов, то этот порядок строго определён.

    Я же писАл про PEview - он тоже не всё корректно обрабатывает.

    Автор так и ответил - никогда просто не видел подобного строения директории, хотя с точки зрения формата, она правильна.





    >




    Я немного не так выразился.

    Стр. 60, 6.8. The .rsrc Section:

    <font face="monospace]
    Код (Text):
    1. The general structure of the .rsrc section is:
    2. ---------------------------------------------------------------------- --------------------
    3. Data                            | Description
    4. ---------------------------------------------------------------------- --------------------
    5. Resource Directory Tables (and  | A series of tables, one for each group of nodes in the
    6. Resource Directory Entries)     | tree. All top-level (Type) nodes are listed in the first table.
    </font><!--face-->Нигде не сказано, что ресурсы могут находиться где-то ещё кроме указанной секции.





    >




    Я слегка подправил аттач, теперь version info видно.

    Таблицы IMAGE_RESOURCE_DIRECTORY Language с LANG_NEUTRAL для иконки можно бы и убрать совсем, но стандартные макросы FASM это не позволяют вроде бы.

    Для Version Info и других строковых - наличае бязательно. Это в общем-то логично, хотя судя по спецификации директории ресурсов - не обязательно.





    >




    Я бы сказал, это проблема не наща :)

    It's not a bug, it's a feature!



    [​IMG] 722204859__project.asm
     
  18. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Вся проблема в LOAD_LIBRARY_AS_DATAFILE и в RVA Offset to Data из IMAGE_RESOURCE_DATA_ENTRY .



    Если модуль с ресурсами был загружен как DATAFILE , то эти RVA можно было бы увеличить на размер того , что мы напихали перед ресурсами в этой одной секции , тогда работает . Может будет понятней на макросе Resource.inc :
    Код (Text):
    1. macro version label,fileos,filetype,filesubtype,lang,cp,[name,value]
    2.  { common
    3.     local data,size,vivalue,visize
    4.     label dd [b]RVA data[/b],size,0,0
    Т.е. сделать RVA data+sizeof.напиханое или , что ещё хуже , уменьшить RVA таблицы ресурсов в PE хидере (например было 0040105Bh , а поставить 00401000h) , тогда версия отображеться (но сам файл не грузиться :)



    А по правом клику (для Version Info) модуль загружаеться именно как DATAFILE . Но иконка файла ищеться через SHGetFileInfo , а там модуль загружаеться как обычно , если также исправить макрос и для иконок , то RVA уже будут не те и иконка пропадёт .



    Палка двухконцовая , короче лучше делать ресурсы в начале секции и не е.м.



    А всё потому , что в дубовом LoadResource при расчёте учавствуют эти RVA , начало секции и смещение таблицы ресурсов . А они и не сходяться , т.к. есть разница грузить файл (как есть на винте) тупо в память например по адресу 40000h , или грузить PE header по 40000h , а секцию по 401000h .