З поверненням.
Давайте тепер розглянемо інструкції CMPS.
CMPS розшифровується як Compare Strings, і існує три варіанти:
Compare string byte, Compare string word і Compare string dword.
Практичний приклад.
У цьому прикладі ми переміщуємо вихідний рядок, який хочемо порівняти, у -, а цільовий рядок,
який хочемо порівняти, у -.
Отже, перший варіант - це -.
Другий знаходиться в -.
Потім ми пересуваємо кількість слів, які будемо порівнювати.
Отже, кожне d-слово складається з чотирьох
байт, тому максимальна довжина рядка, яку ви хочете порівняти, дорівнює чотири рази по 3, 12 символів або
12 байт, тому що кожне d-слово складається з чотирьох байт.
Отже, чотири рази по три - це 12 символів або 12 байт.
А потім викликаємо рядок порівняння REP.
Так буде повторюватися до тих пір, поки - не дорівнює нулю.
Зауважте, що кожного разу, коли ми збільшуємо - зменшуємо -, воно буде зменшуватися на dword, тому що тут ми використовуємо
D.
Якщо це a-SB байт, то він зменшиться на одиницю, на один байт, а не на одне слово.
Отже, тут compare-CMPS має той самий ефект, що й CMP, оскільки вона також впливає на нульовий прапорець.
Якщо цільовий рядок не знайдено, нульовий прапорець скидається.
Однак, якщо цільовий рядок знайдено, встановлюється нульовий прапорець.
Отже, у нас є три варіанти.
CMPS B порівнює рядок за адресою - з -.
Той самий ефект, що й у CMP, порівнює ось так, і встановлює
прапорець відповідним чином.
А потім - і - збільшуються на один байт після цієї інструкції.
CMPS W - це те саме.
Єдина відмінність полягає в тому, що - і - збільшуються на два байти
після виконання кожної інструкції, а CMPS D - в тому, що в цьому випадку - і - збільшуються на чотири байти.
Отже, після кожної операції регістри - і - автоматично збільшуються або зменшуються, залежно від прапорця
напрямку в регістрі прапорів.
Отже, CMPS D має такий самий ефект, як і CMP.
Зауважте, що якщо цільовий рядок не знайдено, нульовий прапорець скидається.
Якщо цільовий рядок знайдено, встановлюється нульовий прапорець.
Так само, як і в CMP, наприклад, CMP -, -.
Беремо - мінус -.
Якщо - дорівнює -, ми отримуємо нуль і встановлюється нульовий
прапорець.
Отже, давайте спробуємо зробити це у нашому x64dbg.
Ми спробуємо це зробити.
Тож відкрийте ваш x64dbg і введіть код тут.
Отже, цю адресу ви можете знайти на карті пам'яті, в сегменті даних.
Отже, я ввів рядок "Hello world" за цією адресою пам'яті, і за цією адресою пам'яті я також ввів рядок "Hello
world", так що вони однакові.
І тепер ви будете керувати цим.
Тож ми ставимо тут точку зупинки і біжимо.
Відійди.
Він переміщує джерело в -, -, а потім переступає через нього.
Тепер він переміщує пункт призначення до -.
Саме ці дві адреси ми зараз і порівняємо.
А тепер він переходить від 3 до -.
Іншими словами, він буде повторюватися тричі. При кожній ітерації вона збільшується на dword.
Таким чином, він збільшує адресу вказівника на - на d-слово.
Отже, перший приріст буде тут.
Перший приріст перемістить його сюди, другий приріст перемістить його сюди.
Те ж саме тут.
Перший приріст - піде сюди, а другий - сюди.
Отже, давайте виконаємо команду REP CMPS.
Зверніть увагу, що у x64dbg, коли ви вводите REPE, він замінює його на REP.
Отже, REP схожий на REPE. Те саме - це те саме, насправді, просто дві різні назви, ось і все.
Тож тепер ми переступимо через це і подивимося, що станеться з нульовим прапором.
Нульовий прапорець дорівнює одиниці означає, що рядок ідентичний.
Обидва рядки ідентичні.
Тепер давайте змінимо другу струну.
Тож ми збираємося обнулити все це тут.
Перш ніж це зробити, давайте спочатку перезавантажимось.
Просто перезавантажити.
Поверніться сюди, а тепер перейдіть до карти пам'яті.
А для другої струни ми збираємося перезавантажити - ми збираємося
змінити це.
Це означає, що ми збираємося обнулити все це, двійкову заливку з шаблоном 00, тому
ми обнуляємо її.
Гаразд,
тепер обидві струни різні.
Перша з них - "Привіт, світ. Другий
- "Пекло",
H-E-L-L. Тепер подивимось, чи зможе він знайти рядок.
Тож давай переступимо.
Вибачте, давайте
спочатку запустимо.
Давай дійдемо до брейк-пойнту, а потім переступимо, переступимо, переступимо, переступимо,
переступимо, переступимо,
переступимо, переступимо, переступимо.
А тепер запустимо цю інструкцію
і помітимо, що нульовий прапорець дорівнює нулю.
Це означає, що він не знайшов збігу між цими двома рядками, тому ми
отримуємо нульовий прапорець.
Ось як ми можемо використовувати CMPS D і REP для порівняння двох рядків.
Не забудьте зберегти цей файл як 65_cmps. exe.
На цьому відео все.
Дякуємо за перегляд.