Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2009, 04:03   #1
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию Адреса для секций

Как можно принудительно, выделить в секции какой то объем адресного пространства, не увеличивая размер exe? Скажем мне нужно между секцией данных и кода разместить еще одну свою секцию размером 10000h байт.
Ассемблер FASM.
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 14.05.2009, 05:40   #2
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Может так :
Код:
section '.data' data readable writeable
     ........
section '.data?' data readable writeable
  Var         db  10000h DUP(?)

section '.code' code readable executable  
start:
....
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 15.05.2009 в 05:23.
Goodwin98 вне форума Ответить с цитированием
Старый 14.05.2009, 09:45   #3
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

под что пишем DOS?
изменить размер сегмента после загрузки
данные перенести в конец, доступ к данным по смещению +10000h
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 14.05.2009, 12:55   #4
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Под виндой - ручками увеличить значение VirtualSize - после загрузки в память будет место, размер экзешника не изменится. Секции неинициализированных данных тоже имеют нулевой размер в файле
пыщь
JTG вне форума Ответить с цитированием
Старый 14.05.2009, 21:54   #5
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Goodwin98, JTG вы правильно советуете, но по-моему эти способы увеличивают размер exe. Можно воспользоваться функцией
Код:
VirtualAlloc(lpvaddres: pointer;// начальный адрес региона для резервирования помяти
dwSize: DWORD; // размер региона резервируемой памяти
flAllocationType: DWORD;// способ выделения памяти
flProtect: DWORD;// атрибуты доступа
):Pointer; stdcall;
Лучше создавать секцию на лету, прямо в отладчике(Я юзаю OllyDbg). Сначала нужно написать инструкцию перехода на адрес где мы расположим код(лучше вбивать в самом начале). Затем поместим инструкции, которые мы заменили условным переходом, а затем введем параметры, которые получит VirtualAlloc. Пример:
push 4 - это атрибут защиты новой секции
push 1000 -способ выделения памяти
push 10000 -размер секции равен 10000h байт
push 123000- начиная с этого адреса, будет располагаться секция
call VirtualAlloc- вызов ф-ии, создающей секцию
и нужно завершить джампом к началу программы(в основной код). Вот после этого и создается новая секция с адреса 123000
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 14.05.2009, 22:16   #6
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Цитата:
Goodwin98, JTG вы правильно советуете, но по-моему эти способы увеличивают размер exe
Нет не увеличивают.
Насчет VirtualAlloc. Во-первых это все же телодвижения, а во-вторых иногда случается, что нужные аддреса кем-то заняты.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 14.05.2009 в 22:19.
Goodwin98 вне форума Ответить с цитированием
Старый 14.05.2009, 22:28   #7
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Цитата:
Нет не увеличивают
Аааа! Спасибо, Goodwin98, а я и не знал.
Цитата:
иногда случается, что нужные аддреса кем-то заняты
Ну и что? Вы же ищете через отладчик по всей памяти. Если есть определенная секция, то зачем ее создавать?! В Olly нужно нажмать M и там покажутся все секции
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 14.05.2009, 22:36   #8
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Цитата:
Ну и что? Вы же ищете через отладчик по всей памяти.
Эти аддреса на разных компах могут быть разными, нада делать проверку в коде, а это еще телодвижения.
Цитата:
Если есть определенная секция, то зачем ее создавать?!
Вот именно! Зачем мучится с VirtualAlloc, если система может сама все сделать при запуске проги?
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 15.05.2009, 05:23   #9
qpokyc
Форумчанин
 
Аватар для qpokyc
 
Регистрация: 07.04.2009
Сообщений: 117
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
Под виндой - ручками увеличить значение VirtualSize - после загрузки в память будет место, размер экзешника не изменится. Секции неинициализированных данных тоже имеют нулевой размер в файле
С чего вы взяли, что за концом секции есть кусок свободного адресного пространства (помоему, его там небывает никогда), а память, кстати, плоская! Т.е. при этом придется передвинуть все секции, идущие следом, следовательно:
1) Исправить ImageSize
2) Сдвинуть все далее идущие секции (изменив их RVA, при этом соблюдая кратность выравнивания) на размер выделяемой памяти, при этом не забыв:
a) Исправить поля в DataDirectoryTable
b) Исправить таблицу релокаций
с) Исправить все инструкции (!), ссылающиеся в их часть адресного пространства и вообще заново (ручками, или другими средствами) перелинковать прогу.
d) Исправить таблицу экспорта и исчо (страшно представить) кучу чего нужно будет исправить, прежде чем прога хотя бы сможет нормально загрузиться.

В этом плане, VirtualAlloc выглядит очень даже симпатично.

ЗЫ: Это если речь о откмпилированном ехешнике.
Цитата:
под что пишем DOS?
изменить размер сегмента после загрузки
данные перенести в конец, доступ к данным по смещению +10000h
Объясните поподробней?
Copyright © qpokyc (qpy[the dog]bk.ru), 2008-2009 г.

Последний раз редактировалось qpokyc; 15.05.2009 в 05:34.
qpokyc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Установка IP адреса Raivolo Работа с сетью в Delphi 11 11.02.2009 18:03
абсолютные адреса kano Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 01.07.2008 20:49
Смена IP-адреса Македонский Работа с сетью в Delphi 13 06.02.2008 19:02
2 одинаковых Ip адреса Alar Работа с сетью в Delphi 12 24.12.2006 10:21