我正在用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也可以。
答案 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 \。