eXeL@B —› Основной форум —› Увеличение размера массива созданного на стеке |
Посл.ответ | Сообщение |
|
Создано: 19 июля 2010 03:14 · Личное сообщение · #1 Есть необходимость изменения программы к которой нет исходных текстов. Прога достает из файлов формата DLIS некоторые данные. В проге есть ограничение на число каналов в файле - 1024 канала. Я хочу изменить ограничение, скажем до 2048 каналов. Проблема в том, что массив размером 1024*4 создается на стеке, а затем, в этой же функции (EBP не меняется - 12FF80), на стеке, создается еще куча данных, и обращение к этим данным едет через EBP - смещение. Я увеличил размер массива до 2048, это было не сложно. Заменить "EBP - смещение" на "EBP - 1024 - смещение" оказалось гораздо сложнее, и походу я что-то упустил - прога падает. Опыт работы с ассемблером у меня небольшой, я пишу на с++. И у меня два вопроса: 1. Эта задача вообще решается? Может есть другой способ? 2. Как мне отследить все обращения к стеку, которые адресуются через 12FF80 - смещение. |
|
Создано: 19 июля 2010 07:42 · Личное сообщение · #2 |
|
Создано: 19 июля 2010 10:04 · Личное сообщение · #3 |
|
Создано: 19 июля 2010 10:14 · Личное сообщение · #4 |
|
Создано: 19 июля 2010 10:36 · Личное сообщение · #5 |
|
Создано: 19 июля 2010 12:30 · Личное сообщение · #6 ant_man Вы правы, конечно - "EBP - 1024*4 - смещение". Azur1d Нет, именно "EBP - 1024*4 - смещение", поскольку оригинальная адресация "EBP - смещение". Т.е. в смещениии уже учтен оригинальный массив размером 1024 элемента. izl3sa Спасибо. Очень дельный совет. То есть, нужно создать новый массив на 2048 элементов (8192 байт) после всех переменных, причем создание старого на 1024 элемента, нужно оставить как есть. Тогда смещения для переменных не изменятся. Azur1d Искал, но не смог найти, как поймать unhandled exception в Syser'e. Или для этого нужен OlyDbg? |
|
Создано: 19 июля 2010 14:45 · Личное сообщение · #7 А я бы решил по-програмистски: выделял бы массив в памяти, в конце функции память высвобождал. Тогда бы и стек не пришлось двигать, только регистр, в котором указатель на массив заменил бы... Хотя это на код посмотреть, может там так просто и не выкрутиться. ----- Реверсивная инженерия - написание кода идентичного натуральному |
|
Создано: 20 июля 2010 17:45 · Личное сообщение · #8 Снизу стек ограничен сторожевой страницей(PAGE_GUARD). При обращении к ней ядро расширяет стек на одну страницу. Ниже память не выделена, при обращении к ней возникнет #AV. Тоже самое происходит изза размера локального фрейма превышающего размер страницы(0x1000). Выполняйте обращение к стеку последовательно начиная с текущей границы с шагом в одну страницу. Число итераций берите равным REGION_SIZE/X86_PAGE_SIZE(0x1000). После этого загружайте в стек необходимые данные. |
|
Создано: 20 июля 2010 18:01 · Личное сообщение · #9 Сделал как предлагал izl3sa. Вроде все работает. Мне повезло, поскольку все обращения к массиву были только через "EBP - смещение", и я просто изменил это смещение. Всего около 130 мест. Причем использовались разные команды (регистры). Мне кажется, что это оптимальный вариант, в отличии от выделения памяти, как предложил Hexxx. Скажите если я не прав, но мне кажется, в этом случае пришлось бы где то хранить адрес массива, постоянно доставать его оттуда в какой-то регистр, а это инструкции для которых нет места. Придется раздвигать код, и т.д. Всем спасибо!!! |
|
Создано: 20 июля 2010 18:17 · Поправил: Модератор · Личное сообщение · #10 Clerk Этого я не знал, но я так понял, что код выполняющий эти итерации уже есть в этой проге. Вот так в оригинале выделяется на стеке область размером 16FC Code:
Я лишь заменил 16FC на 36FC. А итерации в 0х1000, происходят внутри процедуры по адресу 411750 Code:
От модератора: если забыл, для этого Правка есть |
|
Создано: 20 июля 2010 20:00 · Личное сообщение · #11 |
eXeL@B —› Основной форум —› Увеличение размера массива созданного на стеке |