Я пытаюсь сделать программу, которая может обнаруживать вызовы с помощью функции 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? По моим испытаниям, похоже, это не так, но я думаю, что так и должно быть.
На самом деле это подписанное смещение. –
@IgorSkochinsky Да, я понял это. Я просто пытался избежать реализации определенного поведения и забыл броски. Ред. благодаря – Guillaume