eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
обновлён 2 декабря!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: daFix (+4 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

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

Ранг: 3.0 (гость)
Статус: Участник

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

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


Ранг: 539.0 (!)
Статус: Участник
_Вечный_Студент_

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

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

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

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

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

Ранг: 3.0 (гость)
Статус: Участник

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

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


Ранг: 539.0 (!)
Статус: Участник
_Вечный_Студент_

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

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

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


Ранг: 227.8 (наставник)
Статус: Участник

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

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


Ранг: 598.5 (!)
Статус: Модератор
Research & Development

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

AlexsandrS

[Как я понял]

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

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

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


Ранг: 539.0 (!)
Статус: Участник
_Вечный_Студент_

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

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

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

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


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


Ранг: 598.5 (!)
Статус: Модератор
Research & Development

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

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

Ранг: 3.0 (гость)
Статус: Участник

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

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

Ранг: 68.4 (постоянный)
Статус: Участник

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

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

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

Ранг: 15.1 (новичок)
Статус: Участник

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

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

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

Ранг: 5.4 (гость)
Статус: Участник

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

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

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


Ранг: 227.8 (наставник)
Статус: Участник

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

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

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

Ранг: 24.1 (новичок)
Статус: Участник

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

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


Ранг: 1995.9 (!!!!)
Статус: Модератор
retired

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

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

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


Ранг: 0.2 (гость)
Статус: Участник

Создано: 1 декабря 2019 11:40 New!
Цитата · Личное сообщение · #16

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

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS