Форум на Kuban.ru (http://forums.kuban.ru/)
-   Разработка программ (http://forums.kuban.ru/f1024/)
-   -   Pointer и все все все... :) (http://forums.kuban.ru/f1024/pointer_i_vse_vse_vse-2620073.html)

dr1 17.05.2012 23:30

Pointer и все все все... :)
 
Допустим есть глобальная переменная:
var i:Integer;

Тогда при запуске приложения ее адрес будет статическим на любой машине (поправьте если я не прав), вроде $00440055 и, если мне нужно поменять ее значение (или считать), я открываю процесс "OpenProcess" и делаю "WriteProcessMemory/ReadProcessMemory".

Но если эта переменная - переменная класса/ячейка динамического массива/переменная загружаемой dll/... то ее адрес на разных машинах будет различный.

Вопрос: Как узнать адрес этой переменной не зависимо от того, где запущено приложение?

Возможно ли это в принципе? (берем в рассмотрение только более менее адекватные варианты :) )

dr1 18.05.2012 16:52

ответ прост: найти в памяти чтото статичное (само по-себе и относительно нужной переменной) и от него отсчитывать позицию переменной.

TVV1 18.05.2012 20:38

Не все так просто если объекты создаются динамически и размер динамического массива плавает. Такие задачи зачастую имеют корректное решение только при определенных условиях. И все перестает работать при очередном апдейте

dr1 18.05.2012 21:23

Да, да... это понятно. Все изменится в следующей версии ПО. Но по крайней мере так.

Вот что еще не понятно:
в Windows XP адрес нужной мне переменной всегда одинаков на конкретной машине, даже после перезагрузки.
а вот в семерке - адрес меняется даже после перезапуска приложения! я в недоумении О_о

orangemoon 19.05.2012 07:48

3 ASLR

dr1 19.05.2012 10:13

2 Orange MoonЖ о. спс. не знал о таком.

TVV1 19.05.2012 16:28

Да и в XP это могло быть не всегда так. В общем подобная задача неплохо решена в ArtMoney [url]http://www.artmoney.ru/rus.htm[/url]


Текущее время: 01:15. Часовой пояс GMT +3.