Подскажите, что можно придумать, чтобы перехватывать syscall в АРМе?
задача в следующем: я хочу загрузить код приложения и линкуемых системных библиотек от PSVita на андроиде, и хочу его выполнить (напрямую процессором, без эмуляции). Подменить экспорт из библиотеки, к примеру, ::open(...) на свою реализацию ещё можно, но вот начальную инициализацию библиотек уже подменить нельзя, и если там встретится syscall, всё плохо.
Как бы обойти эту ситуацию попроще?
Единственное, что мне приходит в голову, проанализировать весь код загружаемой библиотеки программным дизассемблером, найти там эти syscall и заменить на что-то. На крайний случай вручную поменять, чтобы уже пропатченные загружались.
На что можно заменить, так чтобы моя программа смогла перехватить? Breakpoint, invalid instruction, ещё что-то? (да, хостовая программа, загружающая и исполняющая код, на C++, но, думаю, можно что-то и с ассемблером подумать, главное, чтобы это можно было провернуть в usermode)
если что-то подобное можно провернуть и на x64, тоже интересно, там ровно та же проблема, но для системных библиотек от PS4 — функции инициализации библиотек вызывают syscall
Здравствуйте, vsb, Вы писали:
vsb>strace разве не это делает?
глянул мельком исходники, и похоже, что нет. Он перехватывает более высокий уровень, экспорты ФУНКЦИЙ из системных библиотек, это просто и такое и мне придется делать, чтобы не падало об различия ОС, мне же нужно либо перехватить этот ОПКОД, либо изменить его так, чтобы вместо него вызывался мой обработчик.
Если использовать эмулятор, как это делает Vita3k, то там прямо бэкенд Dynamic перехватывает svc:
Здравствуйте, wl., Вы писали:
vsb>>strace разве не это делает?
wl.>глянул мельком исходники, и похоже, что нет. Он перехватывает более высокий уровень, экспорты ФУНКЦИЙ из системных библиотек, это просто и такое и мне придется делать, чтобы не падало об различия ОС, мне же нужно либо перехватить этот ОПКОД, либо изменить его так, чтобы вместо него вызывался мой обработчик.
strace использует специальные системные вызовы, при которых ядро останавливает выполнение, когда целевая программа производит системный вызов и даёт возможность произвести какие-то действия. По крайней мере на x86 должно быть так. Конечно это требует ядра с нужными опциями, как там в андроиде — не знаю.