Как добавить программу на C между libc и syscall в Android? - PullRequest
0 голосов
/ 14 марта 2019

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

бионическая / Libc / арка рука / системные вызовы / read.S

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

1 Ответ

0 голосов
/ 16 марта 2019

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

, запишите read.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 - все в порядке.

...