Поделиться через


s (память поиска)

Команда s выполняет поиск по памяти, чтобы найти определенный шаблон байтов.

Не путайте эту команду с ~s (изменение текущего процессора), ~s (задать текущий поток), |s (задать текущий процесс) или ||команды (задать текущую систему).

s [-[[Flags]Type]] Range Pattern 
s -[[Flags]]v Range Object 
s -[[Flags]]sa Range 
s -[[Flags]]su Range 

Параметры

[ Флаги]
Указывает один или несколько вариантов поиска. Каждый флаг — это одна буква. Необходимо заключить флаги в один набор квадратных скобок ([]). Нельзя добавлять пробелы между скобками, за исключением n или l и его аргумента. Например, если вы хотите указать параметры s и w , используйте команду s -[sw]Type Range Pattern.

Можно указать один или несколько следующих флагов:

s
Сохраняет все результаты текущего поиска. Эти результаты можно использовать для повторения поиска позже.

r
Ограничивает текущий поиск результатами последнего сохраненного поиска. Флаги s и r нельзя использовать в той же команде. При использовании r значение Range игнорируется, а отладчик выполняет поиск только тех попаданий, которые были сохранены предыдущей командой.

n Хиты
Указывает количество попаданий для сохранения при использовании флага s . Значение по умолчанию — 1024 попаданий. Если вы используете n вместе с другими флагами, n должен быть последним флагом, а затем его аргумент Hits. Пространство между n и Хитами является необязательным, но вы не можете добавить другие пробелы в квадратных скобках. Если любой последующий поиск, использующий флаг s , обнаруживает больше указанного количества попаданий, отображается сообщение об ошибке Переполнения, чтобы уведомить вас о сохранении не всех попаданий.

длина l
Вызывает поиск произвольных строк ASCII или Юникода, возвращающих только строки, которые имеют длину по крайней мере символов длины . Длина по умолчанию — 3. Это значение влияет только на поиски, использующие флаги -sa или -su .

w
Выполняет поиск только записываемых регионов памяти. Необходимо заключить "w" в квадратные скобки.

1
Отображает только адреса совпадений поиска в выходных данных поиска. Этот параметр полезен, если вы используете токен foreach для передачи выходных данных команды в входные данные другой команды.

Тип
Указывает тип памяти для поиска. Добавьте дефис (-) перед типом . Можно использовать одно из следующих значений type .

Тип Описание

b

Байт (8 бит)

w

WORD (16 бит)

дн.

DWORD (32 бита)

к

QWORD (64 бита)

a

Строка ASCII (не обязательно строка, завершаемая значением NULL)

u

Строка Юникода (не обязательно строка, завершаемая null)

Если опустить тип, используются значения байтов. Однако если вы используете флаги, не удается опустить тип.

sa
Ищет любую память, содержащую печатные строки ASCII. Используйте флаг l Length, чтобы указать минимальную длину таких строк. Минимальная длина по умолчанию составляет 3 символа.

Су
Ищет любую память, содержащую печатные строки Юникода. Используйте флаг l Length, чтобы указать минимальную длину таких строк. Минимальная длина по умолчанию составляет 3 символа.

Диапазон
Задает область памяти для поиска. Этот диапазон не может превышать 256 МБ, если вы не используете синтаксис L? Дополнительные сведения об этом синтаксисе см. в разделе "Синтаксис адреса и диапазон адресов".

Рисунок
Указывает одно или несколько значений для поиска. По умолчанию эти значения являются байтами. В типе можно указать различные типы памяти. Если указать значение WORD, DWORD или QWORD в зависимости от выбранных других параметров, может потребоваться заключить шаблон поиска в одинарные кавычки (например, "H".

0:000> s -d @rsp L1000000 'H'  
0000003f`ff07ec00  00000048 00000000 500c0163 00000000  H.......c..P....
0000003f`ff07ec50  00000048 00000000 00000080 00000000  H...............
0000003f`ff07efc0  00000048 00000000 400c0060 00000000  H.......`..@....

Если указать строку, используя тип ascii, заключите ее в двойные кавычки (например, "B7".

0:000> s -a @rsp L10000000 "B7"  
0000003f`ff07ef0a  42 37 ff 7f 00 00 90 38-4e c2 6c 01 00 00 7d 26  B7.....8N.l...}&
0000003f`ff0ff322  42 37 ff 7f 00 00 f8 5d-42 37 ff 7f 00 00 20 41  B7.....]B7.... A
0000003f`ff0ff32a  42 37 ff 7f 00 00 20 41-42 37 ff 7f 00 00 98 59  B7.... AB7.....Y

-v
Выполняет поиск объектов того же типа, что и указанный объект.

Объект
Указывает адрес объекта или адрес указателя на объект. Затем отладчик ищет объекты того же типа, что и объект, который указывает объект .

Среда

Позиция Description
Режимы Режим пользователя, режим ядра
Целевые объекты Динамический, аварийный дампа
Платформы Все

Дополнительная информация

Дополнительные сведения о манипуляции с памятью и описании других команд, связанных с памятью, см. в разделе "Чтение и запись памяти".

Замечания

Если отладчик находит указанный шаблон байтов, отладчик отображает первый адрес памяти в области памяти range , где найден шаблон. Отладчик отображает фрагмент памяти, начинающийся с этого расположения в формате, который соответствует указанному типу памяти type . Если тип является или u, отображается содержимое памяти и соответствующие символы ASCII или Юникода.

Необходимо указать параметр Pattern в виде ряда байтов, если не указано другое значение type . Значения байтов можно вводить в виде числовых или ASCII символов:

  • Числовые значения интерпретируются как числа в текущем радиксе (16, 10 или 8). Чтобы изменить радикс по умолчанию, используйте команду n (Set Number Base). Можно переопределить радикс по умолчанию, указав префикс 0x (шестнадцатеричный), префикс 0n (десятичный ), префикс 0t (восьмерично) или 0y префикс (двоичный). Обратите внимание , что радикс по умолчанию работает по-разному при использовании выражений C++. Дополнительные сведения об этих выражениях и радиксе см. в разделе "Оценка выражений".

  • Необходимо заключать символы ASCII в одинарные кавычки. Не удается использовать escape-символы в стиле C (например, "\0" или "\n".

Если указать несколько байтов, их необходимо разделить по пробелам.

Команды s-a и s-u выполняют поиск указанных строк ASCII и Юникода соответственно. Эти строки не должны быть прерваны со значением NULL.

Команды s-sa и s-su выполняют поиск несопознанных строк ASCII и Юникода. Это полезно, если вы проверяете диапазон памяти, чтобы узнать, содержит ли он любые печатные символы. Параметры флагов позволяют указать минимальную длину строки для поиска.

Пример. Следующая команда находит строки ASCII, которые имеют длину >=3 в диапазоне, начиная с 0000000140000000 и заканчивая 400 байтами позже.

s-sa 0000000140000000 L400

Следующая команда находит строки ASCII длиной >=4 в диапазоне, начиная с 0000000140000000 и заканчивая 400 байтами позже

s -[l4]sa 0000000140000000 L400

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

s -[wl4]sa 0000000140000000 L400

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

s -[1wl4]sa 0000000140000000 L400

Команда s-v ищет объекты того же типа данных, что и объект Object . Эту команду можно использовать только в том случае, если нужный объект является классом C++ или другим объектом, связанным с таблицами виртуальных функций (Vtables). Команда s-v выполняет поиск области памяти Range для адресов Vtable этого класса. Если в этом классе существует несколько vtables, алгоритм поиска ищет все эти значения указателя, разделенные соответствующим количеством байтов. При обнаружении совпадений отладчик возвращает базовый адрес объекта и полную информацию об этом объекте, аналогично выходным данным команды dt (display Type).

Пример. Предположим, что текущий радикс равен 16. Следующая три команды выполняют то же самое: поиск расположений памяти 0012FF40 до 0012FF5F для Hello.

0:000> s 0012ff40 L20 'H' 'e' 'l' 'l' 'o' 
0:000> s 0012ff40 L20 48 65 6c 6c 6f 
0:000> s -a 0012ff40 L20 "Hello" 

Эти команды находят каждый внешний вид "Hello" и возвращают адрес каждого такого шаблона, т. е. адрес буквы "H".

Отладчик возвращает только шаблоны, полностью содержащиеся в диапазоне поиска. Перекрывающиеся шаблоны найдены правильно. (Другими словами, шаблон "QQQ" найден в три раза в QQQQQ".)

В следующем примере показан поиск, использующий параметр Type . Эта команда ищет расположения памяти 0012FF40 до 0012FF5F для двойного слова VUTS:

0:000> s -d 0012ff40 L20 'VUTS' 

На маленьких компьютерах "VUTS" совпадает с шаблоном байтов "S" "T" "U" "V". Однако поиск WORD, DWORD и QWORD возвращают только результаты, которые правильно выровнены по байтам.