Сейчас на форуме: tyns777, bezumchik (+4 невидимых)

 eXeL@B —› Вопросы новичков —› Можно ли как то вычислить адрес команды другого процесса
Посл.ответ Сообщение

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

Создано: 29 ноября 2019 05:00
· Личное сообщение · #1

Добрый день. Допустим, есть программа 1, которая правит(считывает) какое либо значение в другой программе 2. Могу ли я, как то из запустив программу 2 в отладчике, вычислить адрес в программе 1 с которого идет обращение к памяти в программе 2. По сути нужен такой "брейкпойнт", который ставится на доступ к определенному участку памяти и показывает обращение к нему из вне.... Спасибо




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 29 ноября 2019 05:36 · Поправил: plutos
· Личное сообщение · #2

AlexsandrS пишет:
программа 1, которая правит(считывает) какое либо значение в другой программе 2.

как именно, через какой механизм?

AlexsandrS пишет:
Могу ли я, как то из запустив программу 2 в отладчике, вычислить адрес в программе 1 с которого идет обращение к памяти в программе 2.

Так может нужно программу 1 запускать в отладчике и в ней ставить breakpoint?

-----
Give me a HANDLE and I will move the Earth.




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

Создано: 29 ноября 2019 05:46
· Личное сообщение · #3

Через ReadProcessMemory... стандартными WinAPi . Да, я понимаю, что логично запустить программу 2 в отладчике, но интересно есть ли возможность как то из отладки в программе 2 через какие нибудь "точки останова" получить адреса в программе 1




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 29 ноября 2019 06:19 · Поправил: plutos
· Личное сообщение · #4

AlexsandrS пишет:
вычислить адрес в программе 1 с которого идет обращение к памяти в программе 2

не понимаю: если есть call ReadProcessMemory(), то вот тебе и адрес, на него и bp.
Может я неправильно понимаю постановку задачи.

-----
Give me a HANDLE and I will move the Earth.





Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 29 ноября 2019 07:54
· Личное сообщение · #5

Формально в юзермоде при ReadProcessMemory обращения к памяти чужого процесса нет, есть вызов сервиса ОС. А сервис ос копирует в указанный буфер данные, он не связан с памятью чужого процесса. Брейкпоинт это когда отладчик может вызвать исключение при каком-то действии и обработать его. То есть либо ты ставишь бряк на исполнение функции, а потом на обращение к буферу (самая приятная часть здесь в том, что содержимое буфера скорей всего будет еще 15 раз скопировано в другие буферы, прежде чем содержимое будет обрабатываться), либо хз чего тебе еще надо. Наверное можно написать скрипт для отладчика, который частично эти пляски автоматизирует, но не больше.

-----
2 оттенка серого





Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 29 ноября 2019 07:56
· Личное сообщение · #6

AlexsandrS

[Как я понял]

Дано:
App1 -> патчит App2

Задача:
Узнать, что именно App1 пропатчил в App2. Работать нужно только с App2.

Решение:
1. Сделать дамп App2 до запуска App1 (когда App1 ещё не пропатчил App2) и после запуска App1 (когда App1 уже пропатчил App2)
2. Сравнить полученные дампы. Увидеть разницу. Можно сравнивать конкретные секции или регионы памяти. Адреса получаются элементарно, поскольку в результате сравнения дампов становится понятно, где что изменилось.

-----
EnJoy!





Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 29 ноября 2019 08:32 · Поправил: plutos
· Личное сообщение · #7

f13nd пишет:
ты ставишь бряк на исполнение функции

ну и я об том же...

Jupiter пишет:
Узнать, что именно App1 пропатчил в App2


Дак у ТС не поймешь, толи "правит", толи "считывает"...

-----
Give me a HANDLE and I will move the Earth.





Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 29 ноября 2019 09:56
· Личное сообщение · #8

plutos
Неоднозначно сформулировано, согласен.
Но я предположил, что для начала нужно узнать адреса, которые App1 "правит" в App2, а потом уже можно будет обнаружить, откуда идёт запись/чтение этих адресов, если постановка задачи требует работы с App2 (жертва), а не с App1.

-----
EnJoy!




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

Создано: 29 ноября 2019 11:13
· Личное сообщение · #9

Ребят, спасибо за ответы, просто в CheatEngine есть возможность фиксировать определенный адрес и смотреть все обращения к этому адресу. Я знаю, что в отладчиках есть возможность так же поставить точку останова на определенный адрес и отслеживать обращения к этому участку памяти, но было интересно есть ли техническая возможность отлавливать обращения к участку памяти из другого процесса наподобие как это делается в рамках одного процесса.



Ранг: 71.2 (постоянный), 33thx
Активность: 0.050.12
Статус: Участник

Создано: 29 ноября 2019 11:21 · Поправил: kunix
· Личное сообщение · #10

Мне кажется, единственный нормальный вариант под Windows - это перехват системного вызова из своего драйвера ядре.
В Linux-ах это позволяет делать из юзермода механизм ptrace, но в Windows о таком не слышал.

Еще можно перехватить Read/WriteProcessMemory в нужном процессе, но это все хореографические постановки с ударными музыкальными инструментами.



Ранг: 19.5 (новичок), 8thx
Активность: 0.050.08
Статус: Участник

Создано: 29 ноября 2019 12:09 · Поправил: dezmand07
· Личное сообщение · #11

а вариант "по изучать" программу 1?
найти функу, которая правит программу 2 и хукнуть её.
или программа 1 запакована?

по поводу отладчика: я так понял здесь принцип получается как dll-хуки.
в таком случае надо посмотреть что там в стеке происходит.



Ранг: 10.8 (новичок), 4thx
Активность: 0.17=0.17
Статус: Участник

Создано: 29 ноября 2019 14:15
· Личное сообщение · #12

AlexsandrS пишет:
в CheatEngine есть возможность фиксировать определенный адрес и смотреть все обращения к этому адресу

Там же, наверное, банальное изменение содержимого контролируется?




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 30 ноября 2019 11:44
· Личное сообщение · #13

AlexsandrS пишет:
но было интересно есть ли техническая возможность отлавливать обращения к участку памяти из другого процесса

Обращение к памяти другого процесса действительно происходит, с кернел мода. Техническая возможность такое ловить однохуйственна фильтрованию аргументов ReadProcessMemory и отслеживанию того, что потом происходит с содержимым буфера. Нету идеального способа ассоциировать мгновенное значение произвольного байта из адресного пространства одного процесса с мгновенным значением байта в адресном пространстве другого.

-----
2 оттенка серого




Ранг: 43.1 (посетитель), 20thx
Активность: 0.160.29
Статус: Участник

Создано: 30 ноября 2019 13:13
· Личное сообщение · #14

Кстати, уточняющий вопрос по теме ТС.
Можно ли внутри своей программы понять, что к ней кто-то лезет извне? (при условии: драйвера у нас нет и во все процессы системы не внедряемся)
Интересует отслеживание OpenProcess, Read/WriteProcessMemory, VirtualAllocEx и VirtualProtectEx.
Т.е. например если внешний процесс пытается начать отладку моего процесса, я могу это узнать с помощью перехвата функции DbgUiRemoteBreakin, подобным же образом можно отследить запуск потока, загрузку dll. Но вот с вышеперечисленными функциями я ничего похожего не нашел.




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

Создано: 30 ноября 2019 13:16
· Личное сообщение · #15

user99
Нет. Отлаживать и грузить длл тоже можно незаметно. С незаметным стартом потока сложнее. Но при некоторых условиях и это решаемо.

| Сообщение посчитали полезным: user99

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

Создано: 01 декабря 2019 11:40
· Личное сообщение · #16

user99, прям отловить в момент вызова нельзя, можно сосредоточиться на детектировании конечного результата вызова функции. OpenProcess - создает объект handle -> перечислить все хендлы в системе, VirtualAllocEx - выделяет регион памяти -> перечислить всю память процесса, итд.


 eXeL@B —› Вопросы новичков —› Можно ли как то вычислить адрес команды другого процесса
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати