Melaksanakan Boleh Laku daripada Memori dalam Golang atau C
Dalam pengaturcaraan komputer, situasi timbul di mana keperluan untuk melaksanakan boleh laku daripada ingatan menjadi perlu. Artikel ini meneroka teknik untuk mencapai tugas ini menggunakan sama ada Go atau C dalam persekitaran Linux.
Pendekatan: Pengubahsuaian dan Pelaksanaan Memori
Untuk melaksanakan boleh laku daripada memori, anda perlu terlebih dahulu menukar kebenaran kawasan memori yang mengandungi binari boleh laku. Dengan cara ini, memori akan boleh diakses sebagai kod boleh laku. Dalam C, anda boleh menggunakan panggilan sistem mprotect() untuk tugasan ini.
Selepas mengubah suai kebenaran memori, anda boleh terus melaksanakan binari dengan melompat ke alamat memori di mana ia berada. Dalam Go, ini boleh dilakukan menggunakan panggilan sistem mmap() dan mprotect(). Panggilan mmap() memetakan memori ke dalam ruang alamat program, manakala mprotect() melaraskan perlindungan memori yang dipetakan.
Berikut ialah contoh cara anda boleh mencapai ini dalam Go:
import ( "syscall" "unsafe" ) func executeBuffer(buffer []byte) error { const RWX = syscall.PROT_READ | syscall.PROT_WRITE | syscall.PROT_EXEC // Map the memory addr, err := syscall.Mmap(0, 0, len(buffer), syscall.MAP_PRIVATE, syscall.MAP_ANONYMOUS) if err != nil { return err } // Copy the data into mapped memory copy(addr, buffer) // Change the protection err = syscall.Mprotect(addr, len(buffer), RWX) if err != nil { return err } (*func())(unsafe.Pointer(uintptr(addr)))() return nil }
Nota: Teknik ini paling baik digunakan untuk melaksanakan laksana kecil, kerana ia memerlukan pengubahsuaian kebenaran memori dan boleh menjejaskan kestabilan program anda. Selain itu, ia patut menyemak kemudahalihan pendekatan ini jika anda bercadang untuk menggunakannya dalam persekitaran bukan Linux.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Boleh Laku daripada Memori dalam Go atau C pada Linux?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!