2017-05-19 4 views
0

Ich schreibe ein Kernelmodul, das Teile des virtuellen Speichers eines Prozesses liest. Ich versuche, die Methode access_process_vm im Kernel zu verwenden, aber es liest immer 0 Bytes.Understanding_process_vm Linux Kernel?

target = get_pid_task(find_get_pid(target_pid),PIDTYPE_PID); 
    if (target == NULL) { 
     printk(KERN_ALERT "no such task %d\n",target_pid); 
     return -1; 
    } 
    printk(KERN_INFO "opened task with pid %d\n",target->pid); 

    len = vm_end-vm_start; 
    buf = kmalloc(len ,GFP_KERNEL); 
    if (!buf) { 
     printk(KERN_ALERT "unable to allocate memory\n"); 
     return -1; 
    } 
    printk(KERN_INFO "allocated memory\n"); 

    bytes = access_process_vm(target,addr,buf,len,FOLL_FORCE); 
    if (bytes != len) { 
     printk(KERN_ALERT "could only read %d of %ld bytes\n",bytes,len); 
     kfree(buf); 
     return -1; 
    } 
    printk(KERN_INFO "read %d bytes successfully\n",bytes); 

Was mache ich falsch?

Antwort

0

Ich sehe nicht, was das Problem ist, das unten aufspürt.

Lassen Sie uns auf den ersten zwei Ausfallmodi in access_process_vm einen Blick selbst:

if (addr + len < addr) 
      return 0; 

Sie die Len auf vm_end und vm_start Basis berechnen, aber Sie von Adr lesen beginnen. Was ist los mit der Diskrepanz? Vielleicht scheitern Sie diese Prüfung?

mm = get_task_mm(tsk); 
    if (!mm)   
      return 0; 

Wie wäre es damit? Was ist, wenn es keine mm gibt?

Und so weiter.

Beachten Sie auch, dass Sie -1 anstelle eines tatsächlichen Fehlers zurückgeben. Bei einem Fehler wird ein Verweis auf den Zielthread ausgegeben.