2Derec
Тааак. Нет млин просто переменной. Какая она, локальная, глобальная, может память для неё в куче динамически выделяется? От этого будет зависеть, как ты будешь из другого процесса её смотреть. Общего алгоритма нет, тк от типа (тип в смысле расположения в памяти, см. ранее) переменной зависит её адресация в программе. Глобальные переменные адресуюца по абсолютным смещениям и располагаются (обычно) в отдельной секции. В этом случае всё просто : OpenProcess, ReadProcessMemory(..., addrvalue, ...). НО есть нюансы. Эти абсолютные адреса валидны только если модуль загрузился по предпочитаемому адресу загрузки, указанному в IMAGE_OPTIONAL_HEADER.ImageBase. Обычно exe по нему и грузятся, но в случае с dll всё наоборот и скорее всего она загрузиццо по адресу отличному от базы образа. Если модуль загрузился по адресу отличному от базы образа, то загрузчик патчит абсолютные адреса переменных на некоторую дельту используя информацию из директории релоков (ака перемещаемых элементов, го ту спецификация на PE формат). Другими словами чтобы прочитать или записать по константному адресу, ктр ты узнал ручками до этого, в общем случае нужно 1. найти базу образа (самое первое, что пришло в голову toolhelp api) 2. разбирать заголовок исполняемого модуля и в случае если база образа не совпала с предпочитаемой -> 3. пропатчить адрес на дельту между предпочитаемой и реальной базой образа.
Если это локальная переменная, то всё несколько сложнее. Локальные переменные хранятся в стеке, а он во-первых - постоянно изменяется, во-вторых - для каждого потока свой, а в-третьих ... а вообщемто первых двух пунктов достаточно. Так что простого способа чтения извне стековых переменных нет. Тут либо трассировшик, либо внедрение своего кода.
Ну и с кучей задача немного более проста. Нужно лишь перехватить соответствующую функцию (импорт, сплайсинг) и зная логику проги запомнить один из её вызовов и возвращаемое значение.
------------------------------------
таким образом три типа адресов какбэ (в свете твоего вопроса естественно) - глобальные (для глобальных переменных), начиная от верхушки стека в сторону младших адресов (для локальных) и начиная от начала блока памяти, выделенной системой посредством апишных функций (для динамики).
ЗЫ. Формулируй вопрос конкретней. С твоих объяснений непонятно то ли тебе нужно с интерфейсом общаться гуишным, толи прочитать переменную по некоторому адресу, толи найти в памяти некоторое значение. Два поста и три варианта млин.
И что значит...
... адрессу, выделенному под программу-цель.
...я так и не допер
ЗЫЫ
Исходников программы пока не имеется, они и не к чему для ответа на вопрос Spider, потому что мне не важна практическая реализация, я хотел чтобы кто-нибуль смог бы объяснить это теоретически..
Ыыыыы ^______^