Сейчас на форуме: asfa, _MBK_ (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Вопрос по изменению динамической памяти в программе
Посл.ответ Сообщение

Ранг: 1.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 04 марта 2010 00:42
· Личное сообщение · #1

Вопрос такой:

Мне надо изменить заранее известный текст в памяти программы (длина фиксирована). Тип - строка в delphi На первый взгляд ничего сложного: с помощью той же ArtMoney нахожу адрес искомого куска, меняю текст, по четырехбайтовому сдвигу до него пишу новый размер текста. Все работает, но только в том случае, если текст НА который я меняю МЕНЬШЕ изначального. В ином случае новые байты залезают на "территорию" следующей строки, расположенной рядом. Тогда во время работы, программа пишет ошибки о выделении памяти и работает некорректно.

Как решить проблему? Вроде как надо увеличить размер отводимый под изначальную строку еще перед запуском, но где и как это реализовать? Есть ли другие пути решения? (например поиск указателей на строку и подмена их на другие)

Заранее спасибо!



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 04 марта 2010 11:32
· Личное сообщение · #2

Есть ли другие пути решения? Есть и единственный - прочесть ПРАВИЛА и раздел Новичку.
Любой другой ответ тебе будет непонятен. Например такой : надо пропатчить программу, а для этого нужно хоть немного разобрать логику - это вам не Артмани тупо юзать.
Если строки в ресурсах, то в утилитах найдешь редактор ресурсов и поправишь.

например поиск указателей на строку и подмена их на другие Умение писать нужные слова не означает их понимание. Указатели Артмани умеет искать, но "вживлять" новые строки нет. На что ты собрался менять указатели?



Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 04 марта 2010 11:33
· Личное сообщение · #3

Fruit пишет:
Есть ли другие пути решения? (например поиск указателей на строку и подмена их на другие)

Вы сами себе ответили на Ваш вопрос. Решение очевидно: добавляйте новую секцию, пишите туда новые строки, а в ЕХЕ правьте указатели на строку.
Если у Вас возникли сложности - выложите программу, или сами что-то в delphi наваляйте (отобразите только суть проблемы).

-----
все багрепорты - в личные сообщения




Ранг: 1.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 04 марта 2010 13:17
· Личное сообщение · #4

tundra37 пишет:
На что ты собрался менять указатели?


Ищу в том же процессе не занятый участок памяти, пишу туда нужные мне строки, меняю указатели на новые, с адресами этих строк. Или я чего-то не понимаю?

HandMill пишет:
Решение очевидно: добавляйте новую секцию, пишите туда новые строки, а в ЕХЕ правьте указатели на строку.
Если у Вас возникли сложности - выложите программу, или сами что-то в delphi наваляйте (отобразите только суть проблемы).


Вообще я имел ввиду изменение указателей в динамической памяти во время выполнения. А Вы говорите об изменении самого exe, я правильно понял? Но ведь там не должно быть указателей на строку: сама память (и соответственно указатель на нее) будут выделены после запуска программы. Или я неправ?




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 04 марта 2010 14:46
· Личное сообщение · #5

Fruit Делайте лодер и патчите на лету , хучите выделение памяти ... что то подобное ...или также лодером выделяйте нужное место аллокацией и меняйте ссылки на строки.

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 1.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 05 марта 2010 15:55
· Личное сообщение · #6

Тааак. Написал лодер. Он создает строки в пустых участках памяти, и меняет все найденые указатели с изначальных на новые. Тем не менее при работе программы память читается именно со "старых" участков. Вопрос: как еще может программа обращаться к памяти, кроме как через указатели?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 05 марта 2010 19:04
· Личное сообщение · #7

Возьми поставь бряк на обращение да посмотри, как это обращение получилось.



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 09 марта 2010 13:47
· Личное сообщение · #8

Вопрос: как еще может программа обращаться к памяти, кроме как через указатели?
То что есть указатель на строку не значит, что программа его всегда использует. Она может напрямую туда обратиться - по адресу. Указатели могут быть переинициализированы программой и т.д. и т.п.
Может ты и не указатели нашел, а следы на стеке



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 12 марта 2010 01:55 · Поправил: Clerk
· Личное сообщение · #9

Перехватить целевой код не можем, но можем перехватить код ранее
o Генерация и отлов исключения.
o Бактрейс и захват адреса возврата.
o Трассировка.



Ранг: 1.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 марта 2010 09:34
· Личное сообщение · #10

Всем спасибо за ответы. Вопрос решен. Действительно надо было искать указатели в памяти и менять их на новые. В этом случае все работает. В процессе работы выяснил, что к строкам программа может обращаться либо напрямую, либо через указатели и никак иначе. Так что поиск/замена их в памяти является универсальным решением.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 12 марта 2010 20:02
· Личное сообщение · #11

Раз решён, тогда закрою.


 eXeL@B —› Вопросы новичков —› Вопрос по изменению динамической памяти в программе
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати