Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Melaksanakan Binari Terus dari Memori dalam C di Linux?

Bagaimanakah Saya Boleh Melaksanakan Binari Terus dari Memori dalam C di Linux?

Linda Hamilton
Linda Hamiltonasal
2024-11-28 02:37:18665semak imbas

How Can I Execute a Binary Directly from Memory in C on Linux?

Melaksanakan Binari Dalam Memori

Pembangun selalunya perlu melaksanakan binari sebagai sebahagian daripada aplikasi mereka. Walau bagaimanapun, pendekatan tradisional untuk menyimpan binari ke cakera dan kemudian memanggil "exec" atau "fork" boleh menjadi tidak cekap. Artikel ini meneroka kaedah untuk melaksanakan binari terus daripada memori, menghapuskan keperluan untuk menulis cakera.

Latar Belakang

Dalam coretan kod yang disediakan, data binari disimpan dalam pembolehubah bernama "myExec." Matlamatnya adalah untuk melaksanakan binari ini tanpa menulisnya kembali ke sistem fail.

Penyelesaian dalam C dan Linux

Dalam C, panggilan sistem mprotect() membenarkan anda untuk mengubah suai perlindungan kawasan ingatan. Ini bermakna anda boleh menukar rantau data kepada rantau kod. Setelah penukaran ini selesai, anda boleh melaksanakan kawasan memori dengan melompat ke dalamnya.

Berikut ialah contoh cara ini boleh dilakukan:

#include <sys/mman.h>

int main() {
  // Assume we have an array of bytes representing the binary data.
  char myExec[] = {'s', 'o', 'm', 'e', ' ', 'b', 'y', 't', 'e', 's'};
  
  // Convert the data region into a code region.
  mprotect(myExec, sizeof(myExec), PROT_READ | PROT_WRITE | PROT_EXEC);
  
  // Execute the code.
  ((void (*)())myExec)();
  
  return 0;
}

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Binari Terus dari Memori dalam C di Linux?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn