2016-10-07 16 views
0

Я пытаюсь поймать все системные вызовы, вызванные данным PID, с помощью самодельной программы (я не могу использовать любой из strace, dtruss, gdb ...). Поэтому я использовал функцию
kern_return_t task_set_emulation(task_t target_port, vm_address_t routine_entry_pt, int routine_number), заявленный в /usr/include/mach/task.h.
Я написал небольшую программу, чтобы поймать системный вызов write:Поймать системные вызовы в 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); 
} 

Выход есть:

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

ошибка Kernel 46 соответствует макро KERN_NOT_SUPPORTED описано как «Empty активации потока (Нет нити, связанной с ней) "в /usr/include/mach/kern_return.h, и до того, как я позвоню write.
Мой вопрос: что я сделал неправильно в этом процессе? Kern_not_supported означает, что он еще не реализован, а не проблема бессмысленных потоков?

ответ

1

Исходный код в XNU для task_set_emulation является:

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; 
} 

task_set_emulation Это означает не поддерживается.