eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС
выпущен 4 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме:
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Основной форум —› Увеличение размера массива созданного на стеке
Посл.ответ Сообщение

Ранг: 2.6 (гость)
Статус: Участник

Создано: 19 июля 2010 03:14 New!
Цитата · Личное сообщение · #1

Есть необходимость изменения программы к которой нет исходных текстов. Прога достает из файлов формата DLIS некоторые данные. В проге есть ограничение на число каналов в файле - 1024 канала. Я хочу изменить ограничение, скажем до 2048 каналов. Проблема в том, что массив размером 1024*4 создается на стеке, а затем, в этой же функции (EBP не меняется - 12FF80), на стеке, создается еще куча данных, и обращение к этим данным едет через EBP - смещение. Я увеличил размер массива до 2048, это было не сложно. Заменить "EBP - смещение" на "EBP - 1024 - смещение" оказалось гораздо сложнее, и походу я что-то упустил - прога падает. Опыт работы с ассемблером у меня небольшой, я пишу на с++. И у меня два вопроса:
1. Эта задача вообще решается? Может есть другой способ?
2. Как мне отследить все обращения к стеку, которые адресуются через 12FF80 - смещение.

Ранг: 2.4 (гость)
Статус: Участник

Создано: 19 июля 2010 07:42 New!
Цитата · Личное сообщение · #2

перенесите массив после всех переменных, а не все переменные отодвигайте. Отследить зависимости будет проще.

Ранг: 129.7 (ветеран)
Статус: Участник

Создано: 19 июля 2010 10:04 New!
Цитата · Личное сообщение · #3

Возможно адреса некоторых переменных хранятся где-нибудь в этом же стеке. Например если в функции есть переменная и указатель на нее. Посмотрите отладчиком на какой инструкции прога падает и мысленно пролистайте код обратно.

Ранг: 26.5 (посетитель)
Статус: Участник

Создано: 19 июля 2010 10:14 New!
Цитата · Личное сообщение · #4

"EBP - 4096 - смещение" ?

Ранг: 129.7 (ветеран)
Статус: Участник

Создано: 19 июля 2010 10:36 New!
Цитата · Личное сообщение · #5

ant_man пишет:
"EBP - 4096 - смещение" ?

тогда уж 8192 (2048*4)

Ранг: 2.6 (гость)
Статус: Участник

Создано: 19 июля 2010 12:30 New!
Цитата · Личное сообщение · #6

ant_man Вы правы, конечно - "EBP - 1024*4 - смещение".

Azur1d Нет, именно "EBP - 1024*4 - смещение", поскольку оригинальная адресация "EBP - смещение". Т.е. в смещениии уже учтен оригинальный массив размером 1024 элемента.

izl3sa Спасибо. Очень дельный совет. То есть, нужно создать новый массив на 2048 элементов (8192 байт) после всех переменных, причем создание старого на 1024 элемента, нужно оставить как есть. Тогда смещения для переменных не изменятся.

Azur1d Искал, но не смог найти, как поймать unhandled exception в Syser'e. Или для этого нужен OlyDbg?


Ранг: 481.4 (мудрец)
Статус: Участник
Тот самый :)

Создано: 19 июля 2010 14:45 New!
Цитата · Личное сообщение · #7

А я бы решил по-програмистски: выделял бы массив в памяти, в конце функции память высвобождал. Тогда бы и стек не пришлось двигать, только регистр, в котором указатель на массив заменил бы... Хотя это на код посмотреть, может там так просто и не выкрутиться.

Ранг: 255.8 (наставник)
Статус: Участник
vx

Создано: 20 июля 2010 17:45 New!
Цитата · Личное сообщение · #8

Снизу стек ограничен сторожевой страницей(PAGE_GUARD). При обращении к ней ядро расширяет стек на одну страницу. Ниже память не выделена, при обращении к ней возникнет #AV. Тоже самое происходит изза размера локального фрейма превышающего размер страницы(0x1000). Выполняйте обращение к стеку последовательно начиная с текущей границы с шагом в одну страницу. Число итераций берите равным REGION_SIZE/X86_PAGE_SIZE(0x1000). После этого загружайте в стек необходимые данные.

Ранг: 2.6 (гость)
Статус: Участник

Создано: 20 июля 2010 18:01 New!
Цитата · Личное сообщение · #9

Сделал как предлагал izl3sa. Вроде все работает. Мне повезло, поскольку все обращения к массиву были только через "EBP - смещение", и я просто изменил это смещение. Всего около 130 мест. Причем использовались разные команды (регистры). Мне кажется, что это оптимальный вариант, в отличии от выделения памяти, как предложил Hexxx. Скажите если я не прав, но мне кажется, в этом случае пришлось бы где то хранить адрес массива, постоянно доставать его оттуда в какой-то регистр, а это инструкции для которых нет места. Придется раздвигать код, и т.д.

Всем спасибо!!!

Ранг: 2.6 (гость)
Статус: Участник

Создано: 20 июля 2010 18:17 · Поправил: Модератор New!
Цитата · Личное сообщение · #10

Clerk
Этого я не знал, но я так понял, что код выполняющий эти итерации уже есть в этой проге.

Вот так в оригинале выделяется на стеке область размером 16FC
Code:
  1. 00402301   . 8BEC                MOV EBP,ESP
  2. 00402303   . B8 FC360000         MOV EAX,<b>16FC </b>
  3. 00402308   . E8 43F40000         CALL 00411750


Я лишь заменил 16FC на 36FC. А итерации в 0х1000, происходят внутри процедуры по адресу 411750

Code:
  1. 00411750  /$ 51                  PUSH ECX
  2. 00411751  |. 3D 00100000         CMP EAX,1000
  3. 00411756  |. 8D4C24 08           LEA ECX,DWORD PTR SS:[ESP+8]
  4. 0041175A  |. 72 14               JB SHORT 00411770
  5. 0041175C  |> 81E9 00100000       SUB ECX,1000
  6. 00411762  |. 2D 00100000         SUB EAX,1000
  7. 00411767  |. 8501                TEST DWORD PTR DS:[ECX],EAX
  8. 00411769  |. 3D 00100000         CMP EAX,1000
  9. 0041176E  |.^73 EC               JNB SHORT 0041175C
  10. 00411770  |> 2BC8                SUB ECX,EAX
  11. 00411772  |. 8BC4                MOV EAX,ESP
  12. 00411774  |. 8501                TEST DWORD PTR DS:[ECX],EAX
  13. 00411776  |. 8BE1                MOV ESP,ECX
  14. 00411778  |. 8B08                MOV ECX,DWORD PTR DS:[EAX]
  15. 0041177A  |. 8B40 04             MOV EAX,DWORD PTR DS:[EAX+4]
  16. 0041177D  |. 50                  PUSH EAX
  17. 0041177E  \. C3                  RETN


От модератора: если забыл, для этого Правка есть

Ранг: 2.6 (гость)
Статус: Участник

Создано: 20 июля 2010 20:00 New!
Цитата · Личное сообщение · #11

Модератор
Спасибо. Жаль что предпросмотра нет.
 eXeL@B —› Основной форум —› Увеличение размера массива созданного на стеке

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS