![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить список всех переменных чужой програмы?
Miralex © (2003-08-27 14:00:00)
У меня такая проблема:
хендл програмы я нашел а как найти область памяти, где ета программа хранит свои переменные?
Как получить список етих переменных и их значения?
И как работать с ними?
Digitman (2003-08-29 11:12:00) [21]
> Тутошний Начальник
эк загнул !)
Тутошний Начальник (2003-08-29 11:09:00) [22]
> nSize количество копируемых байтиков
> lpNumberOfBytesRead - не понял для чего!
параметром nSize ты указываешь, сколько байт начиная с адреса lpBaseAddress ты желал бы прочитать
параметром lpNumberOfBytesRead ты указываешь системе адрес переменной типа Integer в своейпрограмме, куда ф-ция ReadProcessMemory() в ходе своей работы вернет число байт, реально прочитанныхначиная с указанного тобой адреса
т.е . по разным причинам реально прочитанное число байт будет меньше или равно тому числу байт, которое ты запрашиваешь параметром nSize
> lpBaseAddress - откуда он береться?
берется он из результата работы вызываемой передэтим ф-ции VirtualQueryEx().
> как узнать начальный адресс где программа хранит данные?
> и как узнать ее конечный адресс?
опять же - см. ф-цию VirtualQueryEx(). Она вернет параметры региона, в диапазон которого входит переданный ей параметром адрес : базовый адрес региона, размер региона, число страниц в регионе, статус региона и пр.
получая эти результаты циклическим вызовом VirtualQueryEx() (первый вызов - с параметром lpAddress = nil, тот же параметр для последующих вызовов ф-ции зависит от результата предыдущих, т.е. вычисляемый на базе ранее полученного адреса, размера и статуса региона) , ты как раз и имеешь базовый адрес и размер области памяти, отведенный под регион. То что имеешь, как раз и передаешь следом в ф-цию ReadProcessMemory() параметрами.
каждый следующий запрашиваемый в цикле регион имеет баз.адрес, равный баз.адресу предыд. региона + размер предыд.региона
> lpBuffer - как с ним работать?
у себя в приложении следует выделить память, размер которой больше или равен размеру того региона, который собираешься считывать. Указатель на этот блок памяти ты передаешь параметром lpBuffer. В эту память ф-ция ReadProcessMemory() скопирует содержание региона, который ты задаешь параметрами баз.адрес + размер
Miralex (2003-08-29 10:45:00) [23]
Вот по функции ReadProcessMemory() у меня и есть пару вопросов:
ReadProcessMemory(hProcess,lpBaseAddress,lpBuffer,nSize,lpNumberOfByte sRead);
Значит начинаем подробно:
hProcess - хендл
lpBaseAddress - начальный адресс
lpBuffer - буфер куда будем загонять данные!
nSize количество копируемых байтиков
lpNumberOfBytesRead - не понял для чего!
А теперь вопросы:
lpBaseAddress - откуда он береться? как узнать начальный адресс где программа хранит данные? и как узнать ее конечный адресс?
lpBuffer - как с ним работать?
lpNumberOfBytesRead - что ето такое?
Мне надо будет копировать все данные и обрабатывать!
Как их правильно копировать в буфер? все сразу или по кускам размером например в 2 байта?
Digitman (2003-08-28 16:05:00) [24]
> Но так и не понял
значит ты не понял, что делает ReadProcessMemory()
она - ключевая среди прочих указанных.
вникни в назначение этой ф-ции ! она скопирует из чужого ВАП в твое ВАП любой доступный участок памяти чужого процесса, после чего в копии можно любым удобным способом искать все что тебе вздумается и как вздумается
Miralex (2003-08-28 15:48:00) [25]
С применение тех функций вроде чуток разобрался! Но так и не понял как с помошью них например найти мне область данных в памяти нужной программы?
Если кто может напишите мне кусок кода где бы по хендлу находились в памяти и грузились во "что-то" данные нужной программы!
Digitman (2003-08-28 14:38:00) [26]
> Miralex
> Если честно - ничего не понял
что конкретно не понял ? ты разбирался вообще с назначением упомянутых ф-ций и назначением их параметров/результатов ?
> Обьясните пожалуйста поподробнее
Задавай предметный вопрос - объясним.
> кинуть готовый код чтоб я разобрался
в чем конкретно ? в последовательности вызовов тех или иных ф-ций ? а смысл ? если тебе в принципе не понятно пока применение той или иной ? ведь лавину вопросов вызовет любой такой "пример" !
Jeer (2003-08-28 14:34:00) [27]
Мда..
Готовое бывает только у мамми на кухне.
denny (2003-08-28 14:03:00) [28]
Вобще судя по всему ты очен зеленый новичек (не обижайся но это видно по рассуждению о переменных и их способам хранения), а эта задача очень сложная даже для хорошего профи!!! Так что не думаю, что если АртМани не справляется то код написанный табой справится.
Не трать время на собственный код, лучше попробуй с другого "входа". Поищи готовые программы. Но это лучше делать в других форумах
Miralex (2003-08-28 10:06:00) [29]
Если честно - ничего не понял!
Обьясните пожалуйста поподробнее!
Ктото может кинуть готовый код чтоб я разобрался?
Digitman (2003-08-27 16:35:00) [30]
перебирай регионы циклическими вызовами VirtualQueryEx(), считывай существующие регионы вызовами ReadProcessMemory() и сканируй прочитанную копию в своем адресном пр-ве как тебе уже вздумается
Miralex (2003-08-27 16:11:00) [31]
> Digitman
ну а как мне устроить поиск значения по всем местам где может быть ето значение в памяти программы?
Есть какойто готовый модуль типа как в АртМоней?
Digitman (2003-08-27 15:58:00) [32]
> Я наскока понял
неправильно ты понял)
к тому же откуда ты знаешь, как, в каком порядке и в каких модулях программист, разрабатывавший "чужое" приложение, объявлял "переменные" ? и в какую секцию поместил линкер ее ? и поместил ли вообще ?
ко всему прочему, почему бы искомой "переменной" не быть локальной ? это же тоже "переменная" ! А время жизни лок.переменной равно времени жизни подпрограммы, ее использующей
а если адрес искомой переменной лежит в другой переменной указательного типа ? память-то под первую вполне может выделяться и динамически !
в общем так - раз ты кроме слова "переменная" видеть и знать ничего не желаешь, разбирайся сам и пляши от OpenProcess(), VirtualQueryEx(), VirtualProtectEx(), AdustTokenPrivelegies(), ReadProcessMemory(), WriteProcessMemory()
Anatoly Podgoretsky (2003-08-27 15:46:00) [33]
Этот список хранится отдельно от программы в мап файле, если конечно он есть.
Miralex (2003-08-27 15:37:00) [34]
> > Digitman
>
>
> предположим, ты получил список из десятка тысяч адресов
> в чужом ВАП, по которым на момент поиска обнаружены, к примеру,
> искомые 4-байтовые значения
Вот как етот список получить? зная тока хендл программы!
Miralex (2003-08-27 15:32:00) [35]
> > програма хранит переменные в определеном порядке в области
>
> > памяти, которая выделяет ей винда
>
>
> вот здесь поподробней ...
Я наскока понял что когда ты обьявляешь переменные , то они в том же порядке фиксируються в памяти, когда выполняеться программа!
Если программа одна и таже, то один раз можно найти ету переменую и потом знать где она будет уже лежать!
> > далее отслеживать их изменение
>
>
> как ты себе это видишь ? по таймеру что ли ?
Также как и в Artmoney
HolACost! (2003-08-27 15:29:00) [36]
Mission Impossible III or Terminator and Programmer!
Digitman (2003-08-27 15:03:00) [37]
> програма хранит переменные в определеном порядке в области
> памяти, которая выделяет ей винда
вот здесь поподробней ...
что за "определенный порядок" ?
каким образом "выделяет ей винда" ?
> далее отслеживать их изменение
как ты себе это видишь ? по таймеру что ли ?
Miralex (2003-08-27 14:59:00) [38]
> Digitman
я знаю что програма хранит переменные в определеном порядке в области памяти, которая выделяет ей винда!
Мне надо найти ету область памяти и просканировать и найти там свои переменные!
и далее отслеживать их изменение!....
а как найти саму область ету?
и как с ней работать?
Digitman (2003-08-27 14:53:00) [39]
> Digitman
предположим, ты получил список из десятка тысяч адресов в чужом ВАП, по которым на момент поиска обнаружены, к примеру, искомые 4-байтовые значения ... дальше что ?
Miralex (2003-08-27 14:46:00) [40]
> HolACost!
а как найти етот адресс процесса?
Я так понял надо найти область в памяти которую занимает етот процесс!
а как ето сделать?
как найти где начинаються возможные его данные, где заканчиваються?