Задача: есть .so, которая грузится процессом. Эта сошка должна изменить код процесса, т.е. вписать в нужные места jmp-ы. В винде я бы воспользовался WriteProcessMemory, а в линуксе? Я пробовал открывать /proc/<PID>/mem при помощи open/read/write/close. read вполне даже считывает код процесса, но вот write записывать отказывается. Пробовал вставлять ptrace(PTRACE_POKEDATA, pid, adr_strangepacket, buffer);, всё равно ноль эффекта. Что делать, уже не знаю.
Дело в том, что мне нужно создать naked-функцию, т.е. без прологов и эпилогов. Почему-то создатели g++ отказываются реализовывать поддержку атрибута naked для платформы IA32, поэтому приходится реализовывать функцию целиком на ассемблере. Но когда из-за «call AddWarns\n» появлялась ошибка undefined symbol: AddWarns, мне пришлось, погуглив, переделать её в «call %P0\n» : : «i»(AddWarns). Однако такая запись ну никак не хочет работать, если эта строка объявлена не в теле функции. Т.е. такая запись:
Необходимо вызвать несколько функций из находящейся в памяти процесса SO и изменить в ней несколько переменных. Проблема в том, что библиотека уже загружена в память, и хендла к ней нет. Работаю из другой библиотеки. Неплохо было бы найти какой-нибудь аналог GetModuleHandle. Или узнать точку входа этой библиотеки, тогда все функции и переменные можно будет легко достать по смещению (оно известно)