Як можна було б читати пам'ять із процесу? Чи відрізняється це ОС?


11

Як досвідчений веб-розробник, але початківець програміст "низького рівня", цей матеріал для мене все ще є вуду.

Мені цікаво, як би хтось навіть почав займатися пошуком блоку пам'яті, а потім його читанням (наприклад, читанням таймера в грі міни)? Чи відрізняється це версія OS / OS?

Відповіді:


14

Це дещо складне і навіть складне питання, в сенсі, що ви можете заглибитись із цим досить глибоко. Але трохи спростити речі:

Розглядаючи ваш приклад " читання таймера в грі в міни ":

Перший крок - знайти адресу пам'яті . Зазвичай це робиться за допомогою інструменту під назвою редактор пам'яті (налагоджувач також робиться в деяких випадках), який може використовувати різні методи для пошуку місця розташування змінної в технологічній пам'яті . Поширений спосіб полягає у пошуку певного значення (наприклад, значення таймера) у просторі пам'яті цільового процесу, а потім змінити цільове значення (наприклад, просунути таймер) та знову шукати відповідність. Цей процес забиває кандидатів кожну ітерацію, поки не залишиться лише точна змінна. Визначення адреси цієї змінної в просторі пам'яті процесу - це лише питання клацання миші за допомогою редактора пам'яті.

Другий крок - змінити дані в конкретній адресі . Як це зробити, залежить від операційної системи. У Windows існує виклик WinAPI, WriteProcessMemoryякий можна використовувати для запису заздалегідь визначених даних на задану адресу в просторі пам'яті цільового процесу. У нашому прикладі ви б скористалися цією функцією, щоб замінити змінну таймера в цільовому процесі власним потрібним значенням, ефективно змінюючи таймер у грі.

На практиці вам доведеться знайти ідентифікатор процесу цільового процесу , а потім приєднати свій негідний процес до цільового процесу, щоб отримати можливість змінювати його простір пам'яті. Це досить тривіальне завдання, але не сприяє відповіді на питання, тому я залишив це як вправу для читача. ;)


Чи буде розташування змінної однакове щоразу при запуску процесу?
brunoqc

1
@brunoqc Ні, майже впевнено ні.
Дан

2

Це зовсім інша ОС. Деякі не дозволять вам це зробити взагалі, і вам доведеться мати певні засоби знати, де потрібні дані знаходяться в пам'яті цілі.

Ось як це зробити в Linux: /unix/6301/how-do-i-read-from-proc-pid-mem-under-linux


яка ОС не дозволила б цього? Здається, що ви можете це зробити під Linux та Windows, принаймні
Єва

@Evan Кожна операційна система повинна дозволити (обмежено з міркувань безпеки) засоби для віддаленої зміни оперативної пам'яті з метою налагодження. Однак зауважте, що, наприклад, невідповідність привілеїв з міркувань безпеки може зробити це таким чином, що не можна читати / записувати пам'ять процесу вищого привілейованого процесу. Хорошим прикладом цього може бути не дозволяти процесу з привілеями гостьового користувача читати / записувати пам'ять процесу з правами адміністратора, оскільки це може поставити під загрозу всю систему та бути прямим способом для гостя, щоб користувач отримував права адміністратора на система.
zxcdw

1

Програмі додається діапазон пам'яті ОС. Як правило, програма повинна запитувати пам'ять, але ця функціональність може бути прихована програмістом через мову.

Такі мови, як C, дозволяють блокувати запити для конкретних розмірів, тоді як інші мови, такі як C ++, C # та Java, дозволяють запити за допомогою ключових слів типу new. Кожна мова має кілька способів розподілу пам'яті, тому це лише короткий огляд. Звільнення пам'яті назад в ОС може бути зроблено явно або через сміттєзбірник.

Доступ до пам'яті в програмі залежить від того, як вона була розподілена. C і C ++ є найбільш відомими для використання концепції покажчиків для позначення / відстеження, де знаходиться пам'ять. В іншому випадку доступ до пам'яті обробляється через створений клас або змінну.

Більшу частину часу вам не доведеться турбуватися про конкретний доступ до пам'яті у вашій програмі. Мовні конструкції та ОС ефективно приховують цю проблему.

Ваш приклад таймера в грі - чудовий приклад того, коли вам не потрібно буде турбуватися про основний розподіл пам'яті. У вас буде змінна, що представляє таймер, і ви просто прочитаєте зі змінної.

Моя відповідь стосується, коли ви пишете заявку, тоді як відповідь zxcdw є актуальною для доступу до пам'яті, що належить іншій програмі. Ваші умови LMGTFY - це "налагодження" та "зворотна інженерія", щоб заглибитись далі в цю тему.

Деякі додаткові читання:


відмінна відповідь, хоча так, в цьому випадку я більше переймаюся читанням пам’яті з програми, яку я сам не писав. Я піднесу пропозицію, як тільки у мене буде 15 реп;)
Єва

@Evan - обов'язково прочитайте статтю про віртуальну пам'ять тоді. Це дасть вам краще розуміння карти, що триває. Ви повинні зрозуміти відображення, щоб виділити додаток. Більшість налагоджувачів дозволять вам приєднатись до запущеного процесу, що дозволить побачити інструкції та пам'ять програми.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.