2013-06-17 7 views
0

Я пытаюсь сделать программу, которая может обнаруживать вызовы с помощью функции ptrace. Использование PTRACE_SINGLESTEP Я могу запускать инструкции программы по инструкциям, а затем, когда я получаю OP_CODE 0xe8, указанный регистром RIP, я использую PTRACE_PEEKTEXT, чтобы получить 4 следующих байта после того, как адрес был указан RIP. Затем, согласно документации, которую я нашел в Интернете, 4 байта присваивают смещение, относящееся к местоположению для перехода. Кажется, что PTRACE_PEEKTEXT возвращает некоторые странные значения, и я получаю слишком большие смещения. Вот мой код ниже:Обнаруживать смещение звонка с помощью ptrace

instr_num = ptrace(PTRACE_PEEKTEXT, this->pid, regs.rip, 0); 
    dest = ptrace(PTRACE_PEEKTEXT, this->pid, regs.rip + 1, 0); 
    if (instr_num == 0xe8) 
    { 
     printf("call : %ld\n", regs.rip + dest); 
    } 

И вот результат:

call : -2853719444197214464 
call : -2853719444197214464 
call : -2853719444197214464 

И это objdump -Д выход, и как вы можете видеть, что есть 15 байт смещения между вызова от основной и начало функции FUNC:

00000000004004c4 <func>: 
4004c4:  55      push %rbp 
4004c5:  48 89 e5    mov %rsp,%rbp 
4004c8:  5d      pop %rbp 
4004c9:  c3      retq 

00000000004004ca <main>: 
4004ca:  55      push %rbp 
4004cb:  48 89 e5    mov %rsp,%rbp 
4004ce:  b8 00 00 00 00   mov $0x0,%eax 
4004d3:  e8 ec ff ff ff   callq 4004c4 <func> 
4004d8:  5d      pop %rbp 
4004d9:  c3      retq 

Если только после того, как я обнаружил вызов, я делаю ptrace (PTRACE_SINGLESTEP) один раз, будет ли мой RIP содержать адрес функции я просто перепрыгнул т o? По моим испытаниям, похоже, это не так, но я думаю, что так и должно быть.

ответ

0

Попытка:

printf("call : 0x%lx\n", regs.rip + (long) (int) (dest & (unsigned long) UINT_MAX); 

dest представляет собой 64-битное значение, но смещение кодируется здесь на 32 бита. Печать в шестнадцатеричном коде гораздо приятнее для такого кода

+0

На самом деле это подписанное смещение. –

+0

@IgorSkochinsky Да, я понял это. Я просто пытался избежать реализации определенного поведения и забыл броски. Ред. благодаря – Guillaume

 Смежные вопросы

  • Нет связанных вопросов^_^