Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2011, 20:36   #1
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
Вопрос Поиск сигнатуры в памяти процесса

Подскажите самый оптимальный способ поиска сигнатуры в памяти процесса.
Ситуация такая - есть некий процесс в памяти которого есть некая строчка "XXX", нужно произвести поиск этой строчки во всех работающих процессах таким образом определив какой из них наша программа.
Я делаю так:
for i:=1 to количество процессов
1. Создаю полный дамп памяти процесса в файл
2. В полученном файле произвожу поиск нужной строчки
end;

Это решение работает крайне медленно и по этому мне не подходит, как можно сузить область поиска в каждом отдельно взятом процессе?
Может быть можно открыв файл программы которую пытаюсь обнаружить в hex редакторе или какой-нибудь еще программе можно узнать постоянный адрес 1 байта этой самой строчки(думаю это все же нереально, но мало ли) или если узнать регион в котором находится эта строчка то можно ли потом его использовать для сужения области поиска(т.е. искать только в этом регионе)? Про регион спрашиваю т.к. не знаю может ли моя строчка при каких-либо условиях переместится в другой регион.
В общем заранее спасибо за любую информацию по вопросу как можно вышеописанный процесс оптимизировать.
Crystallon вне форума Ответить с цитированием
Старый 24.09.2011, 06:20   #2
@san4ez
Пользователь
 
Аватар для @san4ez
 
Регистрация: 09.05.2011
Сообщений: 24
По умолчанию

Ищи в Hex редакторе нужную сигнатуру>Запоминай адрес>Бери полный список процессов>И ищи в них этот адрес>Совпадает? -выполняй действие
тем более у тебя сигнатура из 3-х символов, % промаха будет очень мал.
@san4ez вне форума Ответить с цитированием
Старый 24.09.2011, 12:44   #3
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию

Цитата:
Сообщение от @san4ez Посмотреть сообщение
Ищи в Hex редакторе нужную сигнатуру>Запоминай адрес>Бери полный список процессов>И ищи в них этот адрес>Совпадает? -выполняй действие
тем более у тебя сигнатура из 3-х символов, % промаха будет очень мал.
То есть и в exeшнике и в процессе адрес будет одинаковым? Я просто предполагал что он меняется...
P.S. Помоему при 3 символах шанс промаха какраз таки огромен... Я XXX написал просто для примера, у меня сигнатуры будут побольше т.к. по 3м символам искать по моему бред.

Последний раз редактировалось Crystallon; 24.09.2011 в 12:48.
Crystallon вне форума Ответить с цитированием
Старый 24.09.2011, 12:58   #4
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
и в exeшнике и в процессе адрес будет одинаковым?
Да не будет он одинаковым. Ерунда это полная.
mss вне форума Ответить с цитированием
Старый 24.09.2011, 16:50   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

ТС, а зачем делать дамп и там искать? Это очень медленно. И 1 работу делаете 2 раза.

В вашей теме: http://programmersforum.ru/showthread.php?t=164291 я писал код функции для дампа страницы. Его вполне достаточно.

В дополнение нам не нужно сбрасывать страницы памяти в файл, нужно для каждой страницы делать динам. буфер байт, размер которого будет равен размеру читаемой страницы, и искать байты там.

1. Цикл по страницам памяти
2. Ловим страницы к которым есть доступ(ко всем, с которых можно читать).
2.1. делаем дамп этой страницы в буфер
2.2. ищем заданные байты в этом буфере.
Нашли? - длаем что-то ,ненашли продолжаем цикл.


ВСЕ.

Единственное, что имогу сказать - это то, что есть много способов защитить участки памяти программы от чтения/записи.
Человек_Борща вне форума Ответить с цитированием
Старый 24.09.2011, 21:24   #6
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию

Даже если не писать в файл это все равно очень медленно... Вот вы говорите "страницы памяти", я так понимаю это тоже самое что и регион? Если я найду в процессе выше описанным способом нужную сигнатуру и запомню регион в которой она находится, если при следующем поиске я буду искать сразу в этом регионе это прокатит? Т.е. если упростить вопрос то - будет ли при следующем запуске процесса сигнатура в том-же регионе или уже в другом?
Crystallon вне форума Ответить с цитированием
Старый 24.09.2011, 21:48   #7
Silver_S
Форумчанин
 
Регистрация: 14.03.2011
Сообщений: 104
По умолчанию

Думаю будет ли сигнатура в том же регионе или нет сказать точно нельзя. Например Если ваша сигнатура находится в коде или глобальных данных программы, то, думаю, ее адрес меняться не будет, но скорее всего он будет меняться при динамическом выделении памяти или загрузке библиотек.
Если адрес сигнатуры меняется, то, возможно, вам поможет Artmoney с поиском указателя на адрес или блок памяти.
Silver_S вне форума Ответить с цитированием
Старый 24.09.2011, 21:50   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Смотря, что вы ищите, чем ищите и где ищите.
Я предпологаю, что при каждом новом запуске регионы памяти приложения меняются...

Но другого ничего я придумать не смог.

Как вариант, посмотрите исходники CheatEngine(FreePascal) там точно найдёте механизм, которым так быстро ищется что-то в памяти.
Человек_Борща вне форума Ответить с цитированием
Старый 26.09.2011, 23:01   #9
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию

CheatEngine и вправду ищет быстро...вот только я несколько раз мерезапускал программу, даже для верности выполнял в ней разные действия(ну малоли) и все время адрес вхождения сигнатуры был одинаков, это не может не радовать, осталось разобраться как получить конкретное значение находящееся на конкретном адресе :D
Crystallon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Редактирование памяти процесса Dima DDM Общие вопросы Delphi 0 25.12.2010 16:54
Размер памяти процесса ZaRDaK Общие вопросы Delphi 5 25.09.2010 23:48
Защита памяти процесса. worldhero Фриланс 2 25.07.2010 11:15
Создание сигнатуры функций для поиска их в памяти процесса Zlyden' Общие вопросы C/C++ 10 01.03.2010 21:27
Редактирование памяти процесса Air Win Api 6 16.02.2008 20:15