LINUX.ORG.RU

Перехват вызова static функции в .so

 , , , ,


0

2

Перехватить вызов функции из .so не проблема, если эту функцию дёргают за пределами самой либы. А кому-то удавалось так проманипулировать загруженный elf(?) got(?)/.., чтобы можно было сохранить и подменить адрес на свой?

Можно под gdb. Разумеется только если функция предварительно не инлайнена. Но думаю, если я в дизассемблере вижу тело функции, вызовы с её именем, значит, она там целиком.

★★★★★

Первые инструкции кода функции считываешь, свои для вызова записываешь, старую можно вызывать или не вызывать по необходимости, нужны права на запись в сегмент кода.

ilovewindows ★★★★★ ()
Последнее исправление: ilovewindows (всего исправлений: 1)

Если включен NX, то скорее всего не получится. Но можно поменять адрес в файле.

hateyoufeel ★★★★★ ()

Systemtap умеет.

mv ★★★★★ ()
Ответ на: комментарий от ilovewindows

Такой сценарий очевиден. Но когда такого еще не делал, интересны ссылки на конкретные примеры. Например, gdb скриптов, а то кое-какой питон код под gdb медленный (по крайней мере печать имен функций из бэктрэйса).

gag ★★★★★ ()
Ответ на: комментарий от hateyoufeel

Если включен NX, то скорее всего не получится.

Думаю, по-умолчанию, он включен.

Но можно поменять адрес в файле.

Т.е. взять, скомпилировать свой трамплин, потом objcopy дописать его в .so(???), посмотреть его адрес, а потом пройтись и заменить адреса. Реально?

gag ★★★★★ ()
Ответ на: комментарий от Deleted

Если уж писать в страницы кода, я бы PTRACE_POKETEXT выбрал (не помню, обещает ли что-нибудь mprotect про синхронизацию I-Cache, например).

LeninGad ()
Ответ на: комментарий от mv

Эх, вот уже сколько лет говорю себе: попробуй этот systemtap. Но при виде его синтаксиса, а также, что под Дебианом часто какая-то уже устаревшая версия, а также засело в голове, что он в первую очередь для трэйсинга ядерных фуцнкций. Короче, отговорки.

Но всё, спасибо за пинок, надо таки взяться. И - вау! Стартует он несколько секунд для скриптика в две строчки. Но зато он видит вызов статической функции, и с "-g" даже можно получить аргументы в переменных. Жаль, мой закрытый исходник хоть и не стрипнутый, но с debug info мне не повезло.

Так, хорошо, но т.к. systemtap работает через ядро и гасит прерывания, то взять в этом колбэке и дёрнуть нужный мне hook не выйдет? Да и не вижу я в доке, как вызвать внешнюю C-функцию (не встроенную в скрипте). Хмм, этот скриптик транслируется в нормальный C. Ну вот зачем вообще изобретать эти скрипты, а не дать нормальный C-API, в котором можно было бы гибко выбирать, хочешь ли ты просто трейсинг, или немного больше. Вопрос, так можно ли обойтись без ручной модификации?

gag ★★★★★ ()
Ответ на: комментарий от Deleted

А значит, ко всему прочему добавляется вычисление адреса страницы.

gag ★★★★★ ()
Ответ на: комментарий от LeninGad

Если уж писать в страницы кода, я бы PTRACE_POKETEXT выбрал

Это удобно, но из gdb скрипта нельзя, а надо писать свой «дебаггер»? Микро, но всё же. Хотя, тогда как-то попросторней будет. Вот только основной процесс у меня - это java, которая и форкает (кажись) и кучу потоков порождает, некоторые из них падают.

gag ★★★★★ ()
Ответ на: комментарий от gag

но т.к. systemtap работает через ядро и гасит прерывания, то взять в этом колбэке и дёрнуть нужный мне hook не выйдет?

Ничё не понял.

Ну вот зачем вообще изобретать эти скрипты, а не дать нормальный C-API

man kprobes/uprobes.

mv ★★★★★ ()
Ответ на: комментарий от mv

но т.к. systemtap работает через ядро и гасит прерывания, то взять в этом колбэке и дёрнуть нужный мне hook не выйдет?

Ничё не понял.

probe process(".../mytest").function("foo2")
{
// вызвали функцию, которую я хочу подменить полностью, но здесь нельзя вызвать мою foo2_replace(), а потом прыгнуть в конец вызванной foo2
}

Ну вот зачем вообще изобретать эти скрипты, а не дать нормальный C-API

man kprobes/uprobes.

Ага, utrace устарел, а uprobe, похоже, замена, и systemtap их и использует. Спасибо, гляну. Хотя, простых примеров по urpobes что-то не нахожу.

gag ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.