Пытаюсь объединить данные и код в одну секцию. Данные должны поддаваться изменению. .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".
У Billy Belcebu упоминалась утилита pewrsec которая нужным образом меняет атрибуты. Сделать такой изврат проще с помощью fasm-а: section '.code' code readable writeable executable Здесь идет сначала код, а затем (после ExitProcess) данные У такой секции flag=E0000060 Еще это умеет делать мелкософтовский линкер, а насчет tlink-а не знаю, не пробовал.
в масме есть утилитка editbin - запусти с /? узнай ключи - любой секции любой параметр можно включить/выключить и еще кое-что
Zombook Вообще возможно всё обьеденить в одну секцию . Секции "не отвечают" за то , что например содержат в себе импорт или данные . Для этого существует Data Directories в PE . Правда если есть ресурсы , то наверное они должны располагаться первыми , чтоб была видна иконка у ехе . А у секции (страницы в памяти) главное чтоб стоял доступ на запись если требуеться . И достигнуть этого , до момента исполнения кода , наверное можно только одним способом - установкой требуемой характеристики секции в PE , тогда это сделает лоадер . Теоретически ... Но а практически , в аттаче пример : - всё в одной секции - атрибут на запись НЕ стоит - и это работает (тестил w95,NT4.0,w2ksp4) _752585500__project.zip
Это я тормозил... Tasm, оказывается, не добавляет import table (.idata), если в исходнике нет .data или .data ничего не содержит. И несмотря на extern GetModuleHandleA:proc, ExitProcess:proc полученный EXE содержит лишь одну секцию - CODE (!). Из-за этого и было обращение к 00000000. Синтаксис Fasm показался мне неудобным, непривычно как-то. Но, похоже, придётся его юзать, раз Tasm такой тупой Да, еще одна проблема - Fasm добавляет лишнюю секцию .reloc, приходится каждый раз убирать с помощью PE Tools->Rebuild PE. Всем спасибо!
Да ну , кажеться FASM сам добавляет только секцию .flat с неинициализированными данными , если такие будут перед первой секцией . Код (Text): format PE GUI 4.0 rb 1000h section '.code' code readable writeable Т.е. rb 1000h попадут в секцию flat , а самом файле их не будет .
bogrus > Похоже, что для иконки это не важно (см. аттач), а вот для Version Info необходимо, т.к. если IMAGE_RESOURCE_DIRECTORY находится НЕ в начале секции, то виндос не показывает инфу по правому клику Zombook > FASM добавляет релоки, если fixups указано для какой-нибудь секции. _865613036__window.zip
Читай информацию в 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
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-а пока не отлажены как следует , т.е. надо будет ещё попробывать с ресурсами внешнего редактора .
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 атрибуты для секции _1899992397__window2.zip
S_T_A_S_ Теоретически, ведь никто не мешает сделать в файле всего одну секцию, обозвать ее .rsrc, причем ресурсы расположить строго вначале секции, а код сразу за ресурсами, тогда вроде все формальности будут соблюдены и файл должен быть валиден для всех систем, вот только антивири могут ругатца
S_T_A_S_ Тогда мне не понятно , почему PE Explorer на них злиться , а те что с фасмом идут - глотает нормально . PE Explorer явно должен вести себя соответственно MSPECOFF . Я не могу найти такого упоминания Нагуглил "oleaut32.dll rsrc TYPELIBS" , но не знаю каким боком oleaut32.dll к этому относиться . Я тестил имя секции отличное от .rsrc (даже пробывал в VB-шной проге менять) и никаких проблем не возникло . Видимо существует одна проблема в которой надо разобраться : Пропадает отображение Version_Info по правому клику , если ресурсы находяться не в начале секции . И побочная проблема , а может и нет : Не всякий пакер такой файл запакует , а редактор ресурсов поправит . PE Explorer в таком случае удаляет из файла всё кроме ресурсов , ессно файл становиться не рабочий , а ResHacker вообще ресурсов не видит . Asterix KAV не ругаитца , об других антивирях интересно услышать . 1437781759__project.zip
bogrus > KAV не ругаитца , об других антивирях интересно услышать. Каспер ругаитца и ещё как, ибо других антивирей не держим. Хошь выложу calc.exe от XP, в котором я в секцию ресурсов добавил немножко кода, Каспер сказал что файл подозрительно похож на вирус хотя возможно твой файл у него и не вызывает подозрений
Asterix > Дык с этим никто не спорит. Проблема в том, что если делать по другому, то работает не всегда. bogrus > IMHO глючный он! Потому что не вычисляет адрес для каждого ресурса в отдельности через их каталог, а полагается на их определённый порядок в файле. Если используется кампиляторы ресурсов, то этот порядок строго определён. Я же писАл про PEview - он тоже не всё корректно обрабатывает. Автор так и ответил - никогда просто не видел подобного строения директории, хотя с точки зрения формата, она правильна. > Я немного не так выразился. Стр. 60, 6.8. The .rsrc Section: <font face="monospace] Код (Text): The general structure of the .rsrc section is: ---------------------------------------------------------------------- -------------------- Data | Description ---------------------------------------------------------------------- -------------------- Resource Directory Tables (and | A series of tables, one for each group of nodes in the 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! 722204859__project.asm
Вся проблема в LOAD_LIBRARY_AS_DATAFILE и в RVA Offset to Data из IMAGE_RESOURCE_DATA_ENTRY . Если модуль с ресурсами был загружен как DATAFILE , то эти RVA можно было бы увеличить на размер того , что мы напихали перед ресурсами в этой одной секции , тогда работает . Может будет понятней на макросе Resource.inc : Код (Text): macro version label,fileos,filetype,filesubtype,lang,cp,[name,value] { common local data,size,vivalue,visize 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 .