В настоящее время я могу найти значения регистров для программы, которая была написана, но не для других процессов.

На данный момент я написал следующее:

#include 


struct task_struct *task_list;

for_each_process(task_list){
        register int* pc asm("%pc");
        register int mar asm("%mar");
        register int mdr asm("%mdr");
        register int cir asm("%cir");
        register int acc asm("%acc");
        register int ir asm("%ir");
        register int eax asm("%eax");
        register int ebx asm("%ebx");
        register int ecx asm("%ecx");
        register int edx asm("%edx");
        register int ip asm("%ip");
        register int esp asm("%esp");
        register int ebp asm("%ebp");
        register int esi asm("%esi");
        register int edi asm("%edi");
        register int of asm("%of");
        register int df asm("%df");
        register int _if asm("%if");
        register int tf asm("%tf");
        register int sf asm("%sf");
        register int zf asm("%zf");
        register int af asm("%af");
        register int pf asm("%pf");
        register int cf asm("%cf");
}

Я понимаю, что мне нужно использовать task_list и указать на элемент в структуре здесь, но я не могу найти, какой элемент содержит регистры.

Ответы (1)

Вы можете получить доступ к регистрам из task_struct с помощью макроса task_pt_regs(). Он выдает указатель на структуру pt_regs (определение), которая является сохраненной копией всех регистров потока с момента его входа в ядро.

Например:

    struct task_struct *t = /* find the one you want */ ;
    unsigned long tasks_eax = task_pt_regs(t)->ax;

Несмотря на название, член ax является полным 32-битным регистром eax (на x86-32) или 64-битным регистром rax (на x86-64).

Смотрите также:

2022 WebDevInsider