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 WriteProcessMemory
yang 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. ;)
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
sumber
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:
sumber