Відповіді:
Це дещо складне і навіть складне питання, в сенсі, що ви можете заглибитись із цим досить глибоко. Але трохи спростити речі:
Розглядаючи ваш приклад " читання таймера в грі в міни ":
Перший крок - знайти адресу пам'яті . Зазвичай це робиться за допомогою інструменту під назвою редактор пам'яті (налагоджувач також робиться в деяких випадках), який може використовувати різні методи для пошуку місця розташування змінної в технологічній пам'яті . Поширений спосіб полягає у пошуку певного значення (наприклад, значення таймера) у просторі пам'яті цільового процесу, а потім змінити цільове значення (наприклад, просунути таймер) та знову шукати відповідність. Цей процес забиває кандидатів кожну ітерацію, поки не залишиться лише точна змінна. Визначення адреси цієї змінної в просторі пам'яті процесу - це лише питання клацання миші за допомогою редактора пам'яті.
Другий крок - змінити дані в конкретній адресі . Як це зробити, залежить від операційної системи. У Windows існує виклик WinAPI, WriteProcessMemory
який можна використовувати для запису заздалегідь визначених даних на задану адресу в просторі пам'яті цільового процесу. У нашому прикладі ви б скористалися цією функцією, щоб замінити змінну таймера в цільовому процесі власним потрібним значенням, ефективно змінюючи таймер у грі.
На практиці вам доведеться знайти ідентифікатор процесу цільового процесу , а потім приєднати свій негідний процес до цільового процесу, щоб отримати можливість змінювати його простір пам'яті. Це досить тривіальне завдання, але не сприяє відповіді на питання, тому я залишив це як вправу для читача. ;)
Це зовсім інша ОС. Деякі не дозволять вам це зробити взагалі, і вам доведеться мати певні засоби знати, де потрібні дані знаходяться в пам'яті цілі.
Ось як це зробити в Linux: /unix/6301/how-do-i-read-from-proc-pid-mem-under-linux
Програмі додається діапазон пам'яті ОС. Як правило, програма повинна запитувати пам'ять, але ця функціональність може бути прихована програмістом через мову.
Такі мови, як C, дозволяють блокувати запити для конкретних розмірів, тоді як інші мови, такі як C ++, C # та Java, дозволяють запити за допомогою ключових слів типу new
. Кожна мова має кілька способів розподілу пам'яті, тому це лише короткий огляд. Звільнення пам'яті назад в ОС може бути зроблено явно або через сміттєзбірник.
Доступ до пам'яті в програмі залежить від того, як вона була розподілена. C і C ++ є найбільш відомими для використання концепції покажчиків для позначення / відстеження, де знаходиться пам'ять. В іншому випадку доступ до пам'яті обробляється через створений клас або змінну.
Більшу частину часу вам не доведеться турбуватися про конкретний доступ до пам'яті у вашій програмі. Мовні конструкції та ОС ефективно приховують цю проблему.
Ваш приклад таймера в грі - чудовий приклад того, коли вам не потрібно буде турбуватися про основний розподіл пам'яті. У вас буде змінна, що представляє таймер, і ви просто прочитаєте зі змінної.
Моя відповідь стосується, коли ви пишете заявку, тоді як відповідь zxcdw є актуальною для доступу до пам'яті, що належить іншій програмі. Ваші умови LMGTFY - це "налагодження" та "зворотна інженерія", щоб заглибитись далі в цю тему.
Деякі додаткові читання: