![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 05.04.2010
Сообщений: 273
|
![]()
Подскажите самый оптимальный способ поиска сигнатуры в памяти процесса.
Ситуация такая - есть некий процесс в памяти которого есть некая строчка "XXX", нужно произвести поиск этой строчки во всех работающих процессах таким образом определив какой из них наша программа. Я делаю так: for i:=1 to количество процессов 1. Создаю полный дамп памяти процесса в файл 2. В полученном файле произвожу поиск нужной строчки end; Это решение работает крайне медленно и по этому мне не подходит, как можно сузить область поиска в каждом отдельно взятом процессе? Может быть можно открыв файл программы которую пытаюсь обнаружить в hex редакторе или какой-нибудь еще программе можно узнать постоянный адрес 1 байта этой самой строчки(думаю это все же нереально, но мало ли) или если узнать регион в котором находится эта строчка то можно ли потом его использовать для сужения области поиска(т.е. искать только в этом регионе)? Про регион спрашиваю т.к. не знаю может ли моя строчка при каких-либо условиях переместится в другой регион. В общем заранее спасибо за любую информацию по вопросу как можно вышеописанный процесс оптимизировать. |
![]() |
![]() |
![]() |
#2 |
Пользователь
Регистрация: 09.05.2011
Сообщений: 24
|
![]()
Ищи в Hex редакторе нужную сигнатуру>Запоминай адрес>Бери полный список процессов>И ищи в них этот адрес>Совпадает? -выполняй действие
![]() тем более у тебя сигнатура из 3-х символов, % промаха будет очень мал. |
![]() |
![]() |
![]() |
#3 | |
Форумчанин
Регистрация: 05.04.2010
Сообщений: 273
|
![]() Цитата:
P.S. Помоему при 3 символах шанс промаха какраз таки огромен... Я XXX написал просто для примера, у меня сигнатуры будут побольше т.к. по 3м символам искать по моему бред. Последний раз редактировалось Crystallon; 24.09.2011 в 12:48. |
|
![]() |
![]() |
![]() |
#4 | |
Заблокирован
Регистрация: 27.05.2010
Сообщений: 1,099
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#5 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,434
|
![]()
ТС, а зачем делать дамп и там искать? Это очень медленно. И 1 работу делаете 2 раза.
В вашей теме: http://programmersforum.ru/showthread.php?t=164291 я писал код функции для дампа страницы. Его вполне достаточно. В дополнение нам не нужно сбрасывать страницы памяти в файл, нужно для каждой страницы делать динам. буфер байт, размер которого будет равен размеру читаемой страницы, и искать байты там. 1. Цикл по страницам памяти 2. Ловим страницы к которым есть доступ(ко всем, с которых можно читать). 2.1. делаем дамп этой страницы в буфер 2.2. ищем заданные байты в этом буфере. Нашли? - длаем что-то ,ненашли продолжаем цикл. ВСЕ. Единственное, что имогу сказать - это то, что есть много способов защитить участки памяти программы от чтения/записи. |
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 05.04.2010
Сообщений: 273
|
![]()
Даже если не писать в файл это все равно очень медленно... Вот вы говорите "страницы памяти", я так понимаю это тоже самое что и регион? Если я найду в процессе выше описанным способом нужную сигнатуру и запомню регион в которой она находится, если при следующем поиске я буду искать сразу в этом регионе это прокатит? Т.е. если упростить вопрос то - будет ли при следующем запуске процесса сигнатура в том-же регионе или уже в другом?
|
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 14.03.2011
Сообщений: 104
|
![]()
Думаю будет ли сигнатура в том же регионе или нет сказать точно нельзя. Например Если ваша сигнатура находится в коде или глобальных данных программы, то, думаю, ее адрес меняться не будет, но скорее всего он будет меняться при динамическом выделении памяти или загрузке библиотек.
Если адрес сигнатуры меняется, то, возможно, вам поможет Artmoney с поиском указателя на адрес или блок памяти. |
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,434
|
![]()
Смотря, что вы ищите, чем ищите и где ищите.
Я предпологаю, что при каждом новом запуске регионы памяти приложения меняются... Но другого ничего я придумать не смог. Как вариант, посмотрите исходники CheatEngine(FreePascal) там точно найдёте механизм, которым так быстро ищется что-то в памяти. |
![]() |
![]() |
![]() |
#9 |
Форумчанин
Регистрация: 05.04.2010
Сообщений: 273
|
![]()
CheatEngine и вправду ищет быстро...вот только я несколько раз мерезапускал программу, даже для верности выполнял в ней разные действия(ну малоли) и все время адрес вхождения сигнатуры был одинаков, это не может не радовать, осталось разобраться как получить конкретное значение находящееся на конкретном адресе :D
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Редактирование памяти процесса | 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 |