#android #linux #linux-kernel #glibc #libc
#Android #linux #linux-ядро #glibc #libc
Вопрос:
Я разрабатываю проект на Android.Которая будет перехватывать все запросы ввода-вывода (чтение / запись) в приложении.Теперь я решаю реализовать это с помощью функции чтения / записи libc.Но я обнаружил, что функция чтения / записи написана на языке ассемблера.
bionic/libc/arch-arm/системные вызовы/read.S
Наш проект сложный, что означает, что мы не можем создать его, изменив код на языке ассемблера.Я подумываю о переименовании системного вызова для чтения сборки в __read, затем напишите функцию C read(), чтобы заменить функцию assembly read(), все остальные вызовы read() будут вызывать C read() вместо assembly read().C read() просто вызывает assembly __read функцию.Чтобы я мог что-то сделать до вызова функции чтения.Но я не знаю, как это сделать. Пожалуйста, просмотрите и оставьте отзыв для получения инструкций по использованию или, если у вас есть какие-то другие идеи о том, как перехватить ввод-вывод в приложении, тоже подойдет.Я использую Android 6.0.1 на Nexus 6. Или Android 8 на Pixel2 тоже подойдет.
Комментарии:
1. Вы не можете этого сделать как разработчик приложения, потому что вы не контролируете используемую копию libc, потому что ваш процесс является всего лишь ответвлением процесса, в который уже был загружен системный libc. Еще во времена Android 1.3 на одном ядре мне удалось заставить приложение исправлять свою собственную запущенную копию, не уверен, что это сработает сегодня. Вероятно, вам следует найти другой способ достижения вашей реальной цели.
2. Но если вы системный разработчик, создающий AOSP из исходного кода и не пытающийся создать приложение, которое работает на стандартной сборке Android, конечно, вы можете модифицировать libc. Просто поймите, что read() и write() — не единственные применимые вызовы. Отображение файлов непосредственно в память может немного усложнить ваши неустановленные цели…
Ответ №1:
Спасибо за вашу помощь.Я решил эту проблему.Сначала измените чтение.S для __чтения.S и замените read на __read в read.S. Затем напишите read.cpp в bionic / libc /bionic содержимое:
#include <unistd.h>
#include <sys/read.h>
#include "private/libc_logging.h"
extern "C" ssize_t __read(int, void *, size_t);
ssize_t read(int a, void * b, size_t c){
/* 测试时打印log用
const char * tag = "DebugRead";
const char * format = "%s";
const char * msg = "Cpp read() called";
__libc_format_log(ANDROID_LOG_DEBUG, tag, format, msg);
*/
return __read(a,b,c);
}
запись чтения.h в bionic / libc/include /sys.код является:
#ifndef _SYS_READ_H_
#define _SYS_READ_H_
#include <linux/unistd.h>
__BEGIN_DECLS
extern ssize_t __read(int, void *, size_t);
__END_DECLS
#endif /* _SYS_READ_H_ */
наконец, добавьте bionic/read.cpp в bionic/libc /Android.mk все в порядке.