查看原文
其他

干货|Android沙盒之系统libc库的定制开发

云天实验室 哆啦安全 2022-08-17

Android系统中libc是c层中最基本的函数库,libc中封装了io、文件、socket等基本系统调用。所有上层的调用都需要经过libc封装层。以Android4.2.2源码为例分析java socket的调用流程。


Android4.2.2中,java层中的socket、bind、connect、send、recv、sendto、recvfrom等socket函数功能和C层socket的socket、bind、connect、send、recv、sendto、recvfrom等 是通过JNI方式实现java层socket到c层socket的调用。


在源码目录libcore/luni/src/main/native/libcore_io_Posix.cpp中实现了java层socket功能的native函数。在该文件中,可以发现java层的socket发送和接收使用的是sendto和recvfrom函数,并没有使用系统调用send和recv

http://androidxref.com/4.2.2_r1/xref/libcore/luni/src/main/native/libcore_io_Posix.cpp



在源码目录bionic/libc/unistd目录下,可以看到send和recv系统调用实现是直接调用sendto和recvfrom。然而sendto和recvfrom函数实现文件并不好找。原来sendto和recvfrom是通过汇编代码实现,在汇编代码中通过swi调用中断号实现功能。那么如果我想把sendto或者recvfrom直接独立成c源文件该如何做?


http://androidxref.com/4.2.2_r1/xref/bionic/libc/unistd/send.c


http://androidxref.com/4.2.2_r1/xref/bionic/libc/unistd/recv.c


实现方法(以sendto为例)

1.找到sendto.S文件,Android4.2.2中文件路径bionic/libc/arch-arm/syscalls/目录下。2.将sendto.S改为__sendto.S并在汇编代码中将sendto改为__sendto.3.在bionic/libc/arch-arm/目录中修改后缀mk文件中的sento.S为__sendto.S。4.在bionic/libc/include/sys/socket.h中修改socketcall为前缀的sendto函数声明,将socketcall改为extern关键字。5.在bionic/libc/unistd中增加sendto.c文件,在文件中增加如下代码:
#include <sys/types.h>#include <sys/socket.h>extern ssize_t __sendto(int,const void *,ssize_t ,unsinged int ,struct sockaddr*,socketlen_t);
ssize_t    sendto(int fd,const void * buf,ssize_t len,unsinged int flags ,struct sockaddr* addr,socketlen_t slen) { return __sendto(fd,buf,len,flags,addr,slen);}
6.修改bionic/libc目录中的android.mk文件,在该文件中找到send.c所在位置,并增加一行unistd/sendto.c。


定制修改libc库作用

在Android系统用户空间中libc是用户空间通向内核空间的一扇门因此能在此门设立关卡,就可以监控程序的各种数据流信息,对分析应用灰常有用。


Android各版本系统源码(在线搜索)

http://androidxref.comhttp://aospxref.com/


作者:蟑螂一号强哥的公众号:卓码星球原文链接:https://bbs.pediy.com/thread-176302.htm



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存