android - 如何在 Android 的 libc 和 syscall 之间添加一个 C 程序?

标签 android linux linux-kernel glibc libc

我正在用android开发一个项目。它将拦截应用程序中所有的I/O请求(读/写)。现在我决定在libc的读/写功能中实现它。但是我发现读/write 函数由汇编语言编写。

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

我们的项目很复杂,这意味着我们不能通过更改汇编语言代码来实现。我正在考虑将程序集读取系统调用重命名为__read,然后编写一个C函数read()来替换程序集read()函数,read() 的所有其他调用将调用 C read() 而不是程序集 read()。C read() 只需调用程序集 __read 函数。这样我就可以在调用 read 函数之前做一些事情。但是我不知道该怎么做。请查看并提供反馈以了解要使用的说明,或者如果您对如何拦截应用程序中的 I/O 有其他想法也很好。我在 Nexus 6 上使用 Android 6.0.1。或在 Pixel2 上使用 Android 8也很好。

最佳答案

感谢您的帮助。我已经解决了这个问题。首先将read.S更改为__read.S,并将read.S中的read替换为__read。然后在bionic/libc/bionic写一个read.cpp,内容是:

#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);
}

在bionic/libc/include/sys中写一个read.h。代码是:

#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/libc/Android.mk中添加一个bionic/read.cpp\即可。

关于android - 如何在 Android 的 libc 和 syscall 之间添加一个 C 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55158859/

相关文章:

C++回调函数

android - 从 onRequestPermissionsResult() 中调用 DialogFragment 的 show() 会导致 Marshmallow 中出现 IllegalStateException

android - 无法解析菜单项 onClick 处理程序

c++ - 无法添加插槽并将其连接到按钮

c - 在 Debian Linux 中快速创建一个非常大的文件

c - 使用具有不同路径名的 Makefile 构建 Linux 内核模块

linux - 多线程进程的分支 : all process memory gets copied?

android - 如何同步内核时间和logcat时间?

android - Google Drive Android API - 在 App 文件夹中共享文件?

java - 由于缺少 Java 类,Android Studio 3.1 不呈现 XML 文件