Как добавить программу C между libc и системным вызовом в Android?

Я разрабатываю проект в android. Который будет перехватывать все запросы ввода-вывода (чтение/запись) в приложении. Теперь я решил добиться этого в функции чтения/записи libc. Но я обнаружил, что функция чтения/записи написан на языке ассемблера.

bionic/libc/arch-arm/syscalls/read.S

Наш проект сложный, что означает, что мы не можем сделать это, изменив код языка ассемблера. Я подумываю о переименовании системного вызова чтения сборки в __read, а затем написать функцию C read(), чтобы заменить функцию чтения() сборки, все другого вызова read() вызовет C read() вместо сборки read(). C read() просто вызывает функцию сборки __read. Чтобы я мог что-то сделать до вызова функции чтения. Но я не т знаю, как это сделать. Пожалуйста, просмотрите и дайте отзыв для инструкций, которые будут использоваться, или если у вас есть другие идеи о том, как перехватить ввод-вывод в приложении, это тоже нормально. Я использую Android 6.0.1 на Nexus 6 или Android 8 на Pixel2. тоже хорошо.


person Gary.Lee    schedule 14.03.2019    source источник
comment
Вы не можете сделать это как разработчик приложения, потому что вы не контролируете используемую копию libc, потому что ваш процесс является лишь ответвлением процесса, в который уже загружена системная libc. Еще в дни Android 1.3 на одном ядре мне удалось заставить приложение исправлять свою собственную работающую копию, но не уверен, что это сработает сегодня. Скорее всего, вам следует найти другой способ достижения вашей фактической цели.   -  person Chris Stratton    schedule 15.03.2019
comment
Но если вы являетесь системным разработчиком, создающим AOSP из исходного кода и не пытаетесь создать приложение, работающее на стандартной сборке Android, конечно, вы можете изменить libc. Просто поймите, что read() и write() — не единственные применимые вызовы. Отображение файлов непосредственно в памяти может немного усложнить ваши неустановленные цели...   -  person Chris Stratton    schedule 15.03.2019


Ответы (1)


Спасибо за вашу помощь. Я решил эту проблему. Сначала измените read.S на __read.S и замените чтение на __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);
}

напишите read.h в коде bionic/libc/include/sys.the:

#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 можно.

person Gary.Lee    schedule 16.03.2019