Maison >développement back-end >Golang >Comment puis-je exécuter un binaire depuis la mémoire sans écrire sur le disque ?
Exécuter des binaires à partir de la mémoire sans écriture sur disque
Dans votre programme, vous avez intégré un binaire dans une variable et cherchez un moyen d'exécuter sans écriture sur disque. Cela implique de trouver un mécanisme pour exécuter le binaire directement à partir de la mémoire.
Approche C/C (utilisation de l'appel système mprotect())
Utilisation de C ou C (via CGO dans Go), vous pouvez exploiter l'appel système mprotect() sous Linux pour manipuler la protection de la mémoire. Cet appel vous permet de modifier les autorisations d'une région mémoire, la rendant exécutable. Une fois la région protégée comme exécutable, vous pouvez l'exécuter en y accédant.
#include <sys/mman.h> int main() { // ... (Load binary into memory) // Change memory protection to executable mprotect(binary_buffer, binary_size, PROT_READ | PROT_WRITE | PROT_EXEC); // Jump into the executable region ((void (*)(void))binary_buffer)(); }
Approche Go (techniques d'assemblage)
Dans Go, il n'y a pas appels système directs qui vous permettent de spécifier la protection de la mémoire. Cependant, vous pouvez utiliser des techniques d'assemblage pour manipuler la protection de la mémoire à l'aide de la fonction syscall.Syscall pour appeler l'appel système mprotect() à partir du code Go.
import ( "syscall" "unsafe" ) // ... (Load binary into memory) // Change memory protection to executable syscall.Syscall(syscall.SYS_MPROTECT, uintptr(unsafe.Pointer(&binary_buffer[0])), uintptr(binary_size), syscall.PROT_READ|syscall.PROT_WRITE|syscall.PROT_EXEC) // Jump into the executable region (((func()) unsafe.Pointer(&binary_buffer[0])))()
Remarque :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!