2016-10-07 3 views
0

J'essaie d'attraper tous les appels système appelés par un PID donné avec un programme self-made (je ne peux pas utiliser strace, dtruss, gdb ...). J'ai donc utilisé la fonction
kern_return_t task_set_emulation(task_t target_port, vm_address_t routine_entry_pt, int routine_number) déclarée en /usr/include/mach/task.h.
J'ai écrit un petit programme pour attraper le syscall write:Intercepter les appels système sur Mac OS X

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/syscall.h> 
#include <mach/mach.h> 
#include <mach/mach_vm.h> 

void do_exit(char *msg) 
{ 
    printf("Error::%s\n", msg); 
    exit(42); 
} 

int main(void) 
{ 
    mach_port_t the_task; 
    mach_vm_address_t address; 
    mach_vm_size_t size; 
    mach_port_t the_thread; 
    kern_return_t kerr; 

    //Initialisation 
    address = 0; 
    size = 1ul * 1024; 
    the_task = mach_task_self(); //Get the current program task 
    kerr = mach_vm_allocate(the_task, &address, size, VM_MEMORY_MALLOC); //Allocate a new address for the test 
    if (kerr != KERN_SUCCESS) 
    { do_exit("vm_allocate"); } 
    printf("address::%llx, size::%llu\n", address, size); //debug 

    //Process 
    kerr = task_set_emulation(the_task, address, SYS_write); //About to catch write syscalls 
    the_thread = mach_thread_self(); //Verify if a thread is opened (even if it's obvious) 
    printf("kerr::%d, thread::%d\n", kerr, the_thread); //debug 
    if (kerr != KERN_SUCCESS) 
    { do_exit("set_emulation"); } 

    //Use some writes for the example 
    write(1, "Bonjour\n", 8); 
    write(1, "Bonjour\n", 8); 
} 

La sortie est:

address::0x106abe000, size::1024 
kerr::46, thread::1295 
Error::set_emulation 

L'erreur du noyau 46 correspond à la KERN_NOT_SUPPORTED macro décrite comme un « vide activation de fil (Aucun fil lié à lui) "dans /usr/include/mach/kern_return.h, et se est passé avant même que j'appelle write.
Ma question est: Qu'est-ce que j'ai fait de mal dans ce processus? Kern_not_supported signifie que ce n'est pas encore implémenté, au lieu d'un problème de thread sans signification?

Répondre

1

Le code source XNU pour le task_set_emulation est:

kern_return_t 
task_set_emulation(                                       
    __unused task_t  task, 
    __unused vm_offset_t routine_entry_pt, 
    __unused int  routine_number) 
{ 
    return KERN_NOT_SUPPORTED; 
} 

Ce qui signifie task_set_emulation est pas pris en charge.