2013-07-29, 22:29:09    【原创】Android沙盒开发之系统libc库定制修改

标 题: 【原创】Android沙盒开发之系统libc库定制修改
作 者: 蟑螂一号
时 间: 2013-07-29,21:52:11
      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。 n
   在源码目录bionic/libc/unistd目录下,可以看到send和recv系统调用实现是直接调用sendto和recvfrom。然而sendto和recvfrom函数实现文件并不好找。原来sendto和recvfrom是通过汇编代码实现,在汇编代码中通过swi调用中断号实现功能。那么如果我想把sendto或者recvfrom直接独立成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 
   #include 
   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是用户空间通向内核空间的一扇门。因此,能在此门设立关卡,就可以监控程序的各种数据流信息,对分析应用灰常有用。 
 

[公告]如果你觉得有人语言挑衅,请点每帖右上角的“举报”按钮!  
malokch

普通会员
资 料: 注册日期: Sep 2011 帖子:  156  精华:  1 现金: 79 Kx 致谢数: 2 获感谢文章数:4
获会员感谢数:55
2   2013-08-07, 14:50:03 

年前我也想过开发一个沙盒软件,但是没有付诸实践。那时我是想用chroot来进行沙盒机制的实现的,但是想想在不修改源码的情况下修改ActivityManager挺困难,于是没有做。楼主可参考下chroot的实现。 
 

[培训]科锐逆向培训!看雪会员减免200元!  
蟑螂一号

普通会员
资 料: 注册日期: May 2013 帖子:  77  精华:  1 现金: 38 Kx 致谢数: 0 获感谢文章数:11
获会员感谢数:19
3   2013-08-07, 15:34:40 

引用: 最初由 malokch发布  年前我也想过开发一个沙盒软件,但是没有付诸实践。那时我是想用chroot来进行沙盒机制的实现的,但是想想在不修改源码的情况下修改ActivityManager挺困难,于是没有做。楼主可参考下chroot的实现。 非常感谢!希望多多交流!!! 
 

[培训]"麦洛克菲"内核底层开发培训,看雪会员报名减免200元!  
malokch

普通会员
资 料: 注册日期: Sep 2011 帖子:  156  精华:  1 现金: 79 Kx 致谢数: 2 获感谢文章数:4
获会员感谢数:55
4   2013-08-16, 07:54:02 

如果不想大规模修改代码,最好的方法就是hook进城创建。安卓里做沙箱的话,因为每个app进程都是启动app_process,在app_process运行时加载app的dex和so等等。于是若想把进程隔离开,方案一是hook进城创建函数,使其转换为chroot过的进程来启动,达到隔离效果。方案二是自己做一个app_process,把原来的改名,由自己做的app_process启动原来的,然后再改父进程指向.
当然这些方法我都没试过,理论上可行,值得一试。以上仅做参考,且容易弄手机崩溃,这个后果自负了。 

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. Android(安卓)Developers:存储选项
  6. android include merge标签
  7. ANDROID数字签名及命令行启动执行APK程序
  8. Android——NDK开发(一)
  9. android 存储方法一SharedPreferences存储

随机推荐

  1. Android(安卓)点击back键两次退出程序
  2. Android中ps命令各字段的含义
  3. TextView内容太长怎么办?
  4. Android(安卓)Studio第三十一期 - 记录Re
  5. Android(安卓)Service详解(二)第一个Servic
  6. android 开发中遇到的问题及解决方法
  7. ArcGis for Android(安卓)shp
  8. Twitter V1.1在Android中的应用
  9. MySQL Delete 删数据后磁盘空间未释放的
  10. MySQL sql_mode修改不生效的原因及解决