![]() |
eXeL@B —› Программирование —› Как программно увеличить размер уже выделенной области памяти |
Посл.ответ | Сообщение |
|
Создано: 16 февраля 2009 16:20 · Поправил: vnekrilov · Личное сообщение · #1 Вопрос для знающих. При загрузке программы в память машины, с помощью функции VirtualAlloc выделяется какая-то область памяти (например, по адресу 00F10000, и размером - 1000h байтов). Эта область имеет доступ - чтение, запись и исполнение (RWE). Нужно увеличить размер этой области памяти, например, до 3000h байтов. Подскажите, как это можно программно сделать? ![]() |
|
Создано: 16 февраля 2009 16:53 · Личное сообщение · #2 |
|
Создано: 16 февраля 2009 16:56 · Личное сообщение · #3 |
|
Создано: 16 февраля 2009 17:11 · Личное сообщение · #4 |
|
Создано: 16 февраля 2009 17:14 · Личное сообщение · #5 > Резервируешь область памяти максимального размера, резервирование не выделяет память, а помечает диапазон адресов как занятый. Это делоется посредством NtAllocateVirtualMemory с флагом MEM_RESERVE. > При необходимости выделяешь область памяти с помощью тогоже сервиса в зарезервированном регионе, указав флаг MEM_COMMIT. Для каждой страницы из зарезервированного диапазона адресов MEMORY_BASIC_INFORMATION.AllocationBase будет одинакова. ![]() |
|
Создано: 16 февраля 2009 21:51 · Личное сообщение · #6 Пример Code:
----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 16 февраля 2009 22:25 · Поправил: Clerk · Личное сообщение · #7 mak Ога, тока ты не показал главного - два смежные(страницы рядом) региона памяти обьеденяются в один, это и есть расширение области памяти ![]() Если автору необходима расширяемая память не большого размера, то оптимально использовать стек - в нём создатся пограничная траница и если происходит к ней обращение ядро автоматически выделит есчо память. ![]() |
|
Создано: 16 февраля 2009 22:52 · Личное сообщение · #8 Вопрос стоял не конкретно, поэтому как вариант спокойно ![]() Code:
----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 17 февраля 2009 00:39 · Личное сообщение · #9 |
|
Создано: 17 февраля 2009 08:04 · Личное сообщение · #10 mak пишет: Вопрос стоял не конкретно, поэтому как вариант спокойно Уточню вопрос. Имеется такая ситуация. Протектор Asprotect, при запуске программы, создает области памяти, куда помещает украденный код. На эти области памяти имеются прыжки в главной области программы. При восстановлении эмулированных инструкций в этих областях памяти, восстановленные инструкции записываются в конец конкретной области памяти. В некоторых случаях свободного места в конце области памяти - недостаточно. Нужно добавить 500 - 1000 КБ памяти, и все становится ОК. Скрипт, который я пишу для этих целей, должен увеличить размер той области памяти, в которой не хватает свободного места. Сама проверка размера свободного места - тривиальная, но после выполнения этой проверки, если места мало, то его нужно добавить. В предыдущих моих скриптах, там, где не хватало свободного места, я дописывал восстановленные инструкции в последней секции распаковываемого файла, но мне встречаются программы, где не хватает этой 1000h байтов. Пока я это делал так. Находил место в коде Asprotect.dll, где создается область памяти с недостающим размером, и вручную исправлял параметр размера создаваемой области памяти. Однако - это гемморно. Вот почему и возник этот вопрос. Хочется, чтобы все было красиво. ![]() |
|
Создано: 17 февраля 2009 15:03 · Личное сообщение · #11 Это другой вопрос тогда , а как ты правил размер ? скриптом самим имеется ввиду вручную ? Если память динамическая , то в какой промежуток создается буффер ? Что приходит на голову так это наверное полностью убирать аллокацию памяти скриптом или пропускать , и алокацию самому делать со своими параметрами , играясь как те вздумается с памятью. Я так пологаю колы в область тоже динамические , поэтому сьедят и твои буфера с памятью. Подставной буфер короче будет. С одной стоороны тож геморойно а с другой ок .. ![]() ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 17 февраля 2009 15:53 · Личное сообщение · #12 |
|
Создано: 17 февраля 2009 16:32 · Поправил: Smon · Личное сообщение · #13 vnekrilov пишет: Пока я это делал так. Находил место в коде Asprotect.dll, где создается область памяти с недостающим размером, и вручную исправлял параметр размера создаваемой области памяти Единственное верное решение для этого случая имхо, только искать и править не вручную а скриптом по сигне, расширить по другому уже выделенный аспром регион не выйдет (сам он ничего не резервирует, копирование кода в больший регион и смена значения адреса в переменных аспра тоже вызовет глюки если код не базонезависисимый, поэтому лучшее решение - искать по сигне скриптом ту точку в библиотеке и править её на нужную до выделения. Можно и хук поставить на саму процедуру (если заранее неизвестен нужный размер) после распаковки аспр.длл, можно и просто в 10 раз больше выделять сразу и всё ![]() ----- "Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels ![]() |
|
Создано: 18 февраля 2009 02:10 · Личное сообщение · #14 А можно мне - мну в вопросе сабжа не шаред %)), но.. Smon пишет: поэтому лучшее решение - искать по сигне скриптом ту точку в библиотеке и править её на нужную до выделения А че мешает грамотно захучить "по-условию" VirtualAlloc и когда условие становиццо истеным.. – подменить 1000h байтов на 3000h байтов(при передаче параметров), мну лично так и сделал бы тупо с разбегу (в лучших традициях дзена %) вроде как, да универсальность имеецца), а вообще хз может эти олькины скрипты такую задачу и не асилят? Тогда ф топку их нах %))) шучу! При этом выделять память больше всегда(тут и тривиальные проверки в скрипте уже нах не нужны будут), а потом когда выделилось 3000h байтов просто снимать/килять хук(если больше не нужен) да и фсе.. ЗЫ: К примеру ставим бряк на "волшебную точку" после нее(как сработает) на VirtualAlloc и как только сработает бряк на VirtualAlloc удаляем его и в стеке меняем параметр 1000h на 3000h и далее RUN И че-то подобное, где-то уже в ахренено здоровой теме по аспру обсуждалось, только там вообще ПЕ заголовок расширить надо было чтоли, если память не изменяет... Короче как-то так наверное ![]() ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com ![]() |
|
Создано: 18 февраля 2009 07:53 · Личное сообщение · #15 Demon666 пишет: А че мешает грамотно захучить "по-условию" VirtualAlloc и когда условие становиццо истеным.. – подменить 1000h байтов на 3000h Можно еще проще сделать тогда - захучить VA и все 1000h подменять на 3000h без дополнительных проверок ![]() ----- "Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels ![]() |
|
Создано: 18 февраля 2009 09:19 · Поправил: vnekrilov · Личное сообщение · #16 Demon666 пишет: VirtualAlloc удаляем его и в стеке меняем параметр 1000h на 3000h и далее RUN Я кстати так и делал. Только делал это вручную. Кстати, в одной программе у меня было 28 областей памяти со спертыми байтами. Во всех областях хватало свободного места, чтобы записать туда восстановленные инструкции. А вот в одной области памяти - НЕТ. Кроме того, размеры все областей памяти были разными - от 1000h байтов до 6000h байтов. Поэтому все-таки есть резон выполнять проверку свободного места в конце области памяти (оно должно быть примерно 30% от размера этой области памяти), т.е.нужно каждую такую область памяти увеличивать в 1,3 раза. Но дело еще обстоит в том, что протектор создает много разных областей памяти, но для стыренных байтов их всего лишь несколько, остальные такие области памяти создаются для других целей (например, для записи кода подпрограмм, которые извлекают информацию из массивов данных), где увеличивать размер области памяти нет необходимости. ![]() |
|
Создано: 18 февраля 2009 11:42 · Поправил: Demon666 · Личное сообщение · #17 Smon Если честно, то у моего бота crackrss было в логах Smon пишет: Единственное верное решение для этого случая имхо ;) Хз. остальная часть мессаги где-то в сети потом значит отламилась ![]() Мну написал постенг - когда зашел.. вижу, а у тебя считай что тоже самое написано ![]() Но я все равно, взял да и отпостил ;) vnekrilov Но ты же должен понимать что это я так для примера написал ;) написать можно что хочеццо, а тебе уже потом решать что юзать или вообще не юзать ;) vnekrilov пишет: Поэтому все-таки есть резон выполнять проверку свободного места в конце области памяти (оно должно быть примерно 30% от размера этой области памяти), т.е.нужно каждую такую область памяти увеличивать в 1,3 раза Ну можно просто - узнаем длину выделяемой памяти и умножаем ее на(ну к примеру) 1,5 vnekrilov пишет: Однако - это гемморно. Вот почему и возник этот вопрос. Хочется, чтобы все было красиво Хз просто в кодинге(чтобы было красиво) всегда такие весчи заворачивают в тег try и если уже когда конкретно не хватило памяти(произошло исключение), дополнительно ее выделяют в except, finally, etc.. Я хз есть ли у оли механизм обработки исключений, но во всех скриптовых движках, которые я знаю - он присутствует, если нет - то его надо дописывать(если юзаешь часто этот скриптовый двиг) Механизм обработчика исключений в скриптовом двиге позволяет значительно сократить объемы написания скриптого кодеса(до 50%) и упростить понимание логики скрипта третьим лицам ;) – ИМХО.. ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com ![]() |
|
Создано: 18 февраля 2009 13:24 · Личное сообщение · #18 я аспр ломал т.о. - в virtualloc в кернел32.длл вставляется джамп на мой код в библе, котрый эмулировал вызовы virtualloc из аспра, а другие пропускал, и создавал кучу в предварительно добавленной дополнительной секции. при этом весь распакованный и сворованный код уже оказывается в экзешнике )) который дампишь потом и все При запуске подгружается моя длл, далее вызывается heapcreate, в то месте где HeapCreate вызывает zwallocatevirtualmemory надо подсунуть адрес дополнительной секции далее вызовы аспром virtualalloc переделываешь в heapalloc ![]() |
![]() |
eXeL@B —› Программирование —› Как программно увеличить размер уже выделенной области памяти |
Эта тема закрыта. Ответы больше не принимаются. |