如何在Android中的libc和syscall之间添加C程序?

时间:2019-03-14 09:22:06

标签: android linux linux-kernel glibc libc

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

  

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

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

1 个答案:

答案 0 :(得分:0)

谢谢您的帮助。我已经解决了这个问题。首先将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 \。