Как получить базовый адрес kernel процесса?

Мне нужно получить базовый адрес процесса ядра. Например, если вы используете dyld, то это делается с помощью _dyld_get_image_vmaddr_slide. Я написал код для получения порта задачи

#import <Foundation/Foundation.h>
#import <mach/mach.h>
#import <stdio.h>
#import <stdlib.h>
#import <mach/task_info.h>
#import <mach-o/dyld.h>

mach_port_t getTaskForPID(pid_t pid) {
    mach_port_t task;
    kern_return_t kr = task_for_pid(mach_task_self(), pid, &task);
    if (kr == KERN_SUCCESS) {
        return task;
    }

    return -1000032453;
}


int main(int argc, const char * argv[]) {
    @autoreleasepool {
        pid_t pid = getpid();
        mach_port_t task = getTaskForPID(pid);

        if (task != -1000032453) {
        //need get base addres
        
        } else {
            NSLog(@"Не удалось получить task port. Ошибка");
        }
    }
    return 0;
}

Я думал, что это можно сделать с помощью task_info

kern_return_t task_info(task_name_t target_task, task_flavor_t flavor, task_info_t task_info_out, mach_msg_type_number_t *task_info_outCnt);

Далее я понятия не имею, как реализовать получение базовых адресов, чтобы потом можно было прочитать значение офсета в запущенном процессе (например, приложении)

I need to get the base addresses of the kernel process. For example, if you use dyld, then this is done using _dyld_get_image_vmaddr_slide. I wrote the code for getting the task port

#import <Foundation/Foundation.h>
#import <mach/mach.h>
#import <stdio.h>
#import <stdlib.h>
#import <mach/task_info.h>
#import <mach-o/dyld.h>

mach_port_t getTaskForPID(pid_t pid) {
    mach_port_t task;
    kern_return_t kr = task_for_pid(mach_task_self(), pid, &task);
    if (kr == KERN_SUCCESS) {
        return task;
    }

    return -1000032453;
}


int main(int argc, const char * argv[]) {
    @autoreleasepool {
        pid_t pid = getpid();
        mach_port_t task = getTaskForPID(pid);

        if (task != -1000032453) {
        //need get base addres
        
        } else {
            NSLog(@"Не удалось получить task port. Ошибка");
        }
    }
    return 0;
}

I thought this could be done using task_info

kern_return_t task_info(task_name_t target_task, task_flavor_t flavor, task_info_t task_info_out, mach_msg_type_number_t *task_info_outCnt);

Next, I have no idea how to implement receiving base addres, so that later I can read the offset value in a running process (for example, an application)


Ответы (0 шт):