Je travaille sur Debian GNU/Hurd avec Mach. On m'a demandé d'écrire un programme qui, étant donné un PID et une adresse, exécute vm_read sur l'adresse et imprime le résultat.

Voici le code que j'ai écrit:

#include <mach_error.h>
#include <mach/mig_errors.h>
#include <mach/thread_status.h>
#include <mach/processor_info.h>
#include <mach/i386/vm_param.h>
#include <stdio.h>
#include <stdlib.h>
#include <hurd.h>
#include <string.h>

int main(int argc, char * argv[]) {

    if(argc != 3) {
        printf ("Wrong arguments: ./vm_read PID address\n");
        exit(1);
    }
    
    int res;
    mach_port_t target_task = pid2task(atoi(argv[1]));

    vm_address_t addr = atoi(argv[2]);
    vm_offset_t *data;
    mach_msg_type_number_t data_count;
    res = vm_read (target_task, addr, sizeof(int), &data, &data_count);

    if (res != KERN_SUCCESS) {
            printf ("Error reading virtual mem (0x%x), %s \n", res, 
            mach_error_string(res));
            exit(1);
    }
    printf("done\n");

    for (int i=0; i<data_count; ++i){
        printf("byte %d : %x\n",i,((char*)data)[i]);
    }
}

Cela fonctionne correctement, mais maintenant on me demande s'il est possible d'écrire une version pour Unix/Linux et une autre pour Windows qui font la même chose.

J'ai cherché et il semble que cela ne devrait pas poser de problème car les deux utilisent de la mémoire virtuelle dans leurs processus, mais je ne sais pas s'il pourrait y avoir des complications avec les autorisations ou autre chose.

0
acampana 20 mars 2021 à 22:20

2 réponses

Meilleure réponse

Pour Windows, si vous avez besoin de lire la mémoire d'un processus, vous devrez demander le PROCESS_VM_READ lorsque vous obtenez votre descripteur du processus (ReadProcessMemory est l'appel approprié). Pour obtenir ce Handle, il est généralement plus facile de démarrer le processus vous-même avec OpenProcess.

1
Colin Sergi 20 mars 2021 à 20:19

Il n'y a pas de moyen standard d'accéder à la mémoire d'un autre processus sous UNIX, mais sous Linux, vous pouvez le faire en lisant le fichier spécial /proc/pid/mem :

char memfile[32];
snprintf(memfile, sizeof(memfile), "/proc/%s/mem", argv[1]);
int mfd = open(memfile, O_RDONLY);
if (mfd < 0) {
    perror("Can't open pid/mem file");
    exit(1); }
if (lseek(mfd, (off_t)strtoull(argv[2], 0, 0), SEEK_SET) {
    perror("Can't seek to address");
    exit(1); }
if (read(mfd, &data, sizeof(data)) <= 0) {
    fprintf(stderr, "No data at address %s\n", argv[2]);
    exit(1); }
1
Chris Dodd 21 mars 2021 à 01:41