В обработчике SIGILL как можно пропустить оскорбительную инструкцию? - PullRequest
4 голосов
/ 16 февраля 2012

Я собираюсь генерировать код JIT и хочу вставить недопустимые коды операций в поток, чтобы выполнить некоторую мета-отладку.Все хорошо и хорошо до тех пор, пока не попадет в инструкцию, после чего вещь входит в бесконечный цикл недопустимых инструкций для обработки сигнала обработчиком и обратно.

Можно ли как-то настроить эту вещь, чтобы просто пропустить плохую инструкцию?

Ответы [ 2 ]

10 голосов
/ 16 февраля 2012

Это очень хакерское и НЕПРАВИЛЬНОЕ, но:

void sighandler (int signo, siginfo_t si, void *data) {
    ucontext_t *uc = (ucontext_t *)data;

    int instruction_length = /* the length of the "instruction" to skip */

    uc->uc_mcontext.gregs[REG_RIP] += instruction_length;
}

установить sighandler так:

struct sigaction sa, osa;
sa.sa_flags = SA_ONSTACK | SA_RESTART | SA_SIGINFO;
sa.sa_sigaction = sighandler;
sigaction(SIGILL, &sa, &osa);

Это может сработать, если вы знаете, как далеко пропустить (и это процесс Intel): -)

0 голосов
/ 28 марта 2019

Вы также можете попробовать другой подход (если он применим к вашему делу): Вы можете использовать SIGTRAP, которым проще управлять.

void sigtrap_handler(int sig){
    printf("Process %d received sigtrap %d.\n", getpid(),sig);
}

signal(SIGTRAP,sigtrap_handler);
asm("int3"); // causes a SIGTRAP
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...