Bagaimana orang membaca memori dari suatu proses? Apakah berbeda dengan OS?

11

Sebagai pengembang web yang berpengalaman, tetapi pemrogram pemula "tingkat rendah", hal ini masih menjadi semacam voodoo bagi saya.

Saya ingin tahu tentang bagaimana orang akan mulai mencari blok memori, dan kemudian membacanya (misalnya, membaca timer dalam permainan ranjau)? Apakah ini berbeda dengan versi OS / OS?

Eva
sumber

Jawaban:

14

Ini adalah pertanyaan yang agak rumit dan bahkan rumit, dalam arti bahwa Anda bisa cukup mendalam dengan ini. Tetapi untuk menyederhanakan banyak hal:

Mempertimbangkan contoh Anda " membaca timer dalam permainan ranjau ":

Langkah pertama adalah menemukan alamat memori . Ini biasanya dilakukan dengan alat yang disebut memori editor (debugger akan melakukannya juga, dalam beberapa kasus) yang dapat menggunakan berbagai metode untuk menemukan lokasi variabel dalam memori proses . Cara yang umum adalah mencari nilai tertentu (misalnya nilai timer) di ruang memori proses target, lalu ubah nilai target (mis. Lanjutkan timer) dan cari kecocokan lagi. Proses ini menjabarkan calon setiap iterasi hingga hanya tersisa variabel yang tepat. Mengambil alamat variabel itu dalam ruang memori proses hanyalah masalah klik mouse dengan editor memori.

Langkah kedua adalah memodifikasi data di alamat tertentu . Bagaimana ini dilakukan tergantung pada sistem operasi. Dengan Windows , ada panggilan WinAPI bernama WriteProcessMemoryyang dapat digunakan untuk menulis data yang telah ditentukan ke alamat yang diberikan dalam ruang memori proses target. Dalam contoh kami, Anda akan menggunakan fungsi ini untuk menimpa variabel timer dalam proses target dengan nilai yang Anda inginkan, secara efektif mengubah timer di dalam game.

Dalam praktiknya Anda harus menemukan proses ID proses target , dan kemudian melampirkan proses nakal Anda ke proses target untuk mendapatkan kemampuan untuk mengubah ruang memorinya. Ini adalah tugas yang cukup sepele, tetapi tidak berkontribusi untuk menjawab pertanyaan jadi saya meninggalkannya sebagai latihan untuk pembaca. ;)

zxcdw
sumber
Apakah lokasi variabel akan sama setiap kali proses berjalan?
brunoqc
1
@brunoqc Tidak, hampir pasti tidak.
Dan
2

Sama sekali berbeda dengan OS. Beberapa tidak akan membiarkan Anda melakukannya sama sekali, dan Anda harus memiliki beberapa cara untuk mengetahui di mana data yang Anda inginkan berada dalam ruang memori target.

Inilah cara melakukannya di Linux: /unix/6301/how-do-i-read-from-proc-pid-mem-under-linux

pjc50
sumber
OS apa yang tidak mengizinkannya? Tampaknya Anda dapat melakukannya di Linux dan Windows, setidaknya
Eva
@ Evan Setiap sistem operasi harus mengizinkan (dibatasi, untuk alasan keamanan) sarana untuk modifikasi memori proses jarak jauh untuk keperluan debugging. Namun, perlu dicatat bahwa misalnya ketidaksesuaian hak istimewa untuk alasan keamanan dapat membuatnya sehingga seseorang tidak dapat membaca / menulis memori proses dari proses istimewa yang lebih tinggi. Contoh yang baik dari ini adalah untuk tidak membiarkan proses dengan hak pengguna tamu untuk membaca / menulis memori dari suatu proses dengan hak administrator, karena itu berpotensi membahayakan seluruh sistem dan menjadi cara langsung bagi pengguna tamu untuk mendapatkan hak istimewa admin pada sistem.
zxcdw
1

Aplikasi diberikan berbagai memori oleh OS. Secara umum, aplikasi harus meminta memori tetapi fungsi itu mungkin dikaburkan oleh programmer karena bahasanya.

Bahasa seperti C memungkinkan permintaan blokir untuk ukuran tertentu, sedangkan bahasa lain seperti C ++, C #, dan Java memungkinkan permintaan melalui penggunaan kata kunci seperti new. Setiap bahasa memiliki sejumlah cara untuk mengalokasikan memori, jadi ini hanya gambaran singkat. Melepaskan memori kembali ke OS dapat dilakukan secara eksplisit atau melalui pengumpul sampah.

Mengakses memori dalam aplikasi tergantung pada bagaimana itu dialokasikan. C dan C ++ adalah yang paling dikenal karena menggunakan konsep pointer untuk menunjukkan / melacak di mana memori berada. Jika tidak, akses memori ditangani melalui kelas atau variabel yang telah dibuat.

Sebagian besar waktu, Anda tidak perlu khawatir tentang akses memori spesifik dalam program Anda. Konstruksi bahasa dan OS secara efektif mengaburkan kekhawatiran itu untuk Anda.

Contoh penghitung waktu Anda dalam gim adalah contoh yang bagus di mana Anda tidak perlu khawatir tentang alokasi memori yang mendasarinya. Anda akan memiliki variabel yang mewakili timer, dan Anda hanya akan membaca dari variabel.

Jawaban saya relevan ketika Anda menulis aplikasi, sedangkan jawaban zxcdw relevan untuk mengakses memori yang dimiliki aplikasi lain. Istilah LMGTFY Anda akan menjadi "debugging" dan "reverse-engineering" untuk mempelajari lebih jauh topik itu.

Beberapa bacaan tambahan:

  • Artikel Wikipedia tentang Memori Komputer akan memberi Anda tinjauan umum yang baik.
  • Kemudian lihat ke artikel Wikipedia tentang Memory I-O yang dipetakan untuk mendapatkan pemahaman yang lebih dalam tentang intrik yang terjadi.
  • Terakhir, lihat artikel tentang Memori Virtual untuk mendapatkan jawaban yang lebih baik tentang bagaimana setiap OS akan menangani pemetaan memori sedikit berbeda dari yang lain.

sumber
jawaban yang sangat baik, walaupun ya, dalam hal ini saya lebih peduli dengan membaca memori dari aplikasi yang saya tidak menulis sendiri. Saya akan angkat suara segera setelah saya punya 15 perwakilan;)
Eva
@Van - pasti membaca artikel tentang Memori Virtual lalu. Itu akan memberi Anda pemahaman yang lebih baik tentang pemetaan yang berlangsung. Anda harus memahami pemetaan untuk memilih aplikasi. Sebagian besar debugger akan memungkinkan Anda untuk melampirkan ke proses yang berjalan yang akan memungkinkan Anda untuk melihat instruksi dan memori aplikasi.