Author:Gary
Date:2019-3-15
系统版本:Android 6.0.1_r1
Android I/O截获--将Android系统中的汇编系统调用封装为C函数
由于项目要求,需要拦截Android系统中一个APP中的所有I/O请求,经过分析后决定在Libc中完成这一功能,拦截libc中的read/write函数即可。但是在源码中发现,libc中的read函数是用汇编所编写的,功能也仅仅是调用Linux内核中的系统调用:
bionic/libc/arch-arm/syscalls/read.S
由于项目复杂性不可能在汇编中实现功能,所以需要将汇编read函数替换为由C编写的read函数,系统中所有对read的调用都变为调用我们实现的C编写的read。我们之前在网络上找到一篇相关的博文但是由于版本过久Android系统的源码结构已经发生变化:
https://blog.csdn.net/u011354613/article/details/52220319
参考上文重新实验后,现方法如下:
1. 修改read.S
- 为了让其他函数不再调用原read.S,修改文件名read.S为__read.S
- 将read.S中的read都修改为__read:
/* Generated by gensyscalls.py. Do not edit. */
#include <private/bionic_asm.h>
ENTRY(__read)
mov ip, r7
ldr r7, =__NR_read
swi #0
mov r7, ip
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
b __set_errno_internal
END(__read)
2. 编写read.cpp
- 在bionic/libc/bionic中新建read.cpp文件
- 在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);
}
3. 编写read.h
- 在bionic/libc/include/sys中新建read.h文件
- 编写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_ */
4. 修改编译脚本
- 打开文件bionic/libc/Android.mk
- 添加一行:
bionic/readlink.cpp \
bionic/reboot.cpp \
bionic/read.cpp \ #我们新加的
bionic/recv.cpp \
5.编译并刷入
编译刷写完成后即可在adb中看到所打印的信息,所有的read调用都会经过我们编写的C函数
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)