Имеется прожка для моделирования (методом конечных элементов), которая в бесплатной версии ограничиват расчет неким числом, выше которого прога выводит сообщение, что превешено максимальное количество элементов. Эта проблема решена. Теперь можно разбивать модель на любое количество элементов, но вот решать с любым количеством элементов она не хочет. Вылетает с следующим сообщением (адреса меняются): В Windows ------------------------------------------------------- Error signature AppName: elcut.exe AppVer: 5.1.4.137 ModName: elcut.exe ModVer: 5.1.4.137 Offset: 0007f22d ------------------------------------------------------- В дебаггере IDA ------------------------------------------------------- Elcut.exe: The instruction at 0X7C9377C9 referenced at 0X0100FCC. The memory could not be written. (0X7C9377C9 -> 0X0100FCC) ------------------------------------------------------- Опытным путем удалось выяснтить, что максимальное число элементов, при котором можно решить модель (и программа не вылетает) находится в диапазоне 300-500 в зависимости от модели. Как я понимаю разработчики выложили версию программы, в которой статически в каком-то месте выделяется блок памяти фиксированного размера. Как можно узнать в каком месте программы и сколько памяти выделяется? Существуют ли программы, которые могут визуально показать блоки программ и данных с адресами начала и конца в виде некого столбца (как обычно рисуют в учебниках, для объяснения с каких адресов что начинается)? Может есть какой-то более-менее стандартный набор команд на ассемблере для выделения памяти, по которому можно провести поиск в дизассемблированной программе?
Команд нет, есть API: GlobalAlloc, VirtualAlloc, HeapAlloc Данные так же могут храниться непосредственно в секции данных неинициализированными данными. Вот такой каламбур Если действительно ограничение количества элементов не является конкретным числом, то задача требует более детального исследования. Если бы удалось узнать сколько именно выделяется на этот массив, задача бы была упрощена. Для начала поюзай TaskManager, чтобы хоть примерно оценить размер этого массива.
Нормальное явление Если элементы можно называть, то можно после создания элемента найти название в оперативе заюзав SoftIce. Тут практически сразу можно будет выяснить лежит ли этот массив в неинициализированных данных или же он выделен одной из вышеуказанных функций. Для этого достаточно посмотреть, принадлежит ли виртуальный адрес объекта виртуальному адресу модуля. Тоесть, попадает ли адрес элемента в адресное пространство модуля. Если нет - то это выделенная память и скорее всего достаточно будет поменять один дворд, Если да, то это часть exe-шника и тут сложнее. Придется переассемблировать экзешник. Занятие не из приятных.
to _DEN_ "Придется переассемблировать экзешник. Занятие не из приятных" А по подробней можно? Как-то с таким еще не сталкивался.
Существуют ли программы, которые могут визуально показать блоки программ и данных с адресами начала и конца в виде некого столбца (как обычно рисуют в учебниках, для объяснения с каких адресов что начинается)? угу называется Soft-Ice команда map32
ну не так все плохо. Обучно проще расширить секцию и поправить все обращения к блоку на новую область. И ничего перекомпилировать не надо.
infern0 А как там на счет данных / секций, идущих за расширяемым блоком? Надо ведь и все обращения к ним поправить? А если там вобще код идет? Вероятность конечно мала, но вот тогда точно без геморойных свечей не обойтись
Да и кстати, что значит "поправить"? Это значит дизассемблировать exe-шник, посмотреть на каждую mov/add/sub/push/pop/etc и посмотреть, не лезит ли она в новую область? Если лезит то поправить. А если где-то размер старой области фигурировал? Тоже править. Если бы у hiew был плагиновый интерфейс, то это бы очень помогло --- правка: аттач откуда-то нарисовался
volodya угу называется Soft-Ice команда map32 Можно, конечно, и термоядерной бомбой тараканов охреначивать - подохнут, падлы, однозначно Но я бы во вражью программу сначала API-шпиончика попробовал заслать и в его логи позаглядывать.
> "Существуют ли программы, которые могут визуально показать блоки программ и данных ..." угу называется OllyDbg команда меню View\Memory Или это тоже из области термояда ?
to leo. Пасиб за совет. Классная штучка OllyDbg. Недавно качнул и забыл про нее. Все Ice да Ida. А тут такое средство, еще и мало занимает. А опция View\Memory вообще супер. Именно такое и хотелось.
to CyberManiac "API-шпиончика попробовал заслать" С помощью какого софта можно такого шпиончика на прогу натравить? Если off-line, то я пользуюсь eXeScope, можно посмотреть импортируемые функции, но, конечно, в реальном времени оно было бы лучше наблюдать за процессом.
никак. ДОбавь новую секцию в самый конец и поправь все ссылки на блок на новый VA. Из мухи слона делаете... с точностью до наоборот. Нужно смотреть все xref-ы на блок памяти. В иде это достаточно просто. Да, безусловно гимор есть, но если прога на HLL то особо ничего править и не придется. Более того - если это делфи, то она имеет свойство хранить адрес блока в отдельном дворде и адресоватся типа mov eax, [pblock]; mov bl, [eax+nnn]; - тогда вообще детский сад.
infern0 Я к тому что своими силамии это довольно муторно делать. Может быть есть софт коротый сам все это сделает Тогда кочесно просто...
lan255 Классная штучка OllyDbg. Недавно качнул и забыл про нее. Ну и зря. На редкость удобная штука, особенно для отладки своих проектов. Когда можно обойтись без Айса - только им и пользуюсь. lan255 С помощью какого софта можно такого шпиончика на прогу натравить? С помощью любого, который может быть назван словами API Spy, к примеру, Bounds Checker или APIS32, некоторые есть на wasm.ru. Володя буквально на днях перехватчик API с исходниками выложил, но там немного попрограммировать придется, чтобы оно логи в файл скидывало. Если речь про Delphi\Builder - просто берешь DeDe и смотришь, что почем.
to CyberManiac "OllyDbg ... На редкость удобная штука" Сегодня полазил по нету, а работу с этой пргой на русском еще никто нигде не описал. Ток страничку одну нашел с описанием кнопочек. К сайсу навалом, а к етой удобной штуке нет. Эт я не из-за того, что англ не знаю. Наоборот. Просто странно.