Android I/O截获

2023-05-16

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

  1. 为了让其他函数不再调用原read.S,修改文件名read.S为__read.S
  2. 将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

  1. 在bionic/libc/bionic中新建read.cpp文件
  2. 在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

  1. 在bionic/libc/include/sys中新建read.h文件
  2. 编写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. 修改编译脚本

  1. 打开文件bionic/libc/Android.mk
  2. 添加一行:
bionic/readlink.cpp \
bionic/reboot.cpp \
bionic/read.cpp \  #我们新加的
bionic/recv.cpp \

5.编译并刷入

编译刷写完成后即可在adb中看到所打印的信息,所有的read调用都会经过我们编写的C函数

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android I/O截获 的相关文章

随机推荐

  • Spark 2.3+Ubuntu18简单安装过程

    安装Scala xff1a 到官网下载最新版本的scala 2 12 7 xff0c 并拷贝至虚拟机中 https www scala lang org download 解压 sudo mkdir usr lib scala sudo t
  • 2.6.34内核编译

    2 6 34内核编译 内核版本号 xff1a 2 6 34 15 系统版本号 xff1a 12 04 05 虚拟机 xff1a VMware 12 更新日期 xff1a 20181102 准备工作 下载Vmware并破解下载Ubuntu12
  • 32位内核增加系统调用

    32位内核增加系统调用 内核版本 xff1a 2 6 34 15 系统版本 xff1a Ubuntu 12 04 系统位数 xff1a 32位 更细日期 xff1a 20181102 一 修改系统调用表 在文件arch x86 kernel
  • 解决WinSCP连接虚拟机

    介绍一个 FTP客户端 IIS7服务器管理工具 作为FTP客户端 xff0c 它支持批量管理ftp站点 定时上传和定时下载 xff0c 定时备份 xff0c 且操作简洁 同时iis7服务器管理工具还是vnc客户端 并且支持批量管理管理win
  • Linux关闭MySQL的日志记录功能

    网上找了很多的博客 xff0c 但是位置都不对或者是个空文件 最终找到的配置文件位于 etc mysql mysql conf d路径下的mysqld cnf文件用管理员权限编辑文件 xff0c 在文件内添加 innodb flush lo
  • Python3 lambda,map,reduce,filter

    Python3 lambda map reduce filter 转载自 https www cnblogs com hf8051 p 8085424 html https blog csdn net BobYuan888 article
  • Spark+Python函数总结

    Spark 43 Python函数总结 整理自 https www cnblogs com yangzhang home p 6058076 html https blog csdn net nanruoanhao article deta
  • Spark + Python入门

    Spark 43 Python实践入门 整理自 xff1a https www cnblogs com yangzhang home p 6056133 html http spark apache org docs latest quic
  • Numpy函数总结

    Numpy函数总结 整理自 https www jianshu com p 83c8ef18a1e8 基础属性 引入模块 gt gt gt import numpy as np 创建一个list并转化为numpy数组 创建简单的列表 gt
  • pip提速方法

    Author Gary Date 2019 4 12 方法1 在pip参数中添加镜像源地址 豆瓣 xff1a http pypi douban com simple 清华 xff1a https pypi tuna tsinghua edu
  • 使ssh可以以root用户直接登录

    出于安全考虑 ubuntu默认不允许root远程登录 解决方案 安装openssh软件 sudo apt install y openssh server 编辑 SSH 的文件 sudo nano etc ssh sshd config 将
  • 安装Arduino以及ESP8266开发环境

    安装Arduino以及ESP8266开发环境 Author Gary 更新日期 2018 11 20 1 下载安装ArduinoIDE 没什么好说的 xff0c 下载地址 xff1a https www arduino cc en Main
  • 使用Screen来管理终端

    使用Screen来管理终端 转载整理自 xff1a https blog csdn net u013901768 article details 81189348 需要使程序一直运行的情况下 xff0c 可以采用开机自启动的方式 这里为了便
  • 终端关闭后让程序继续运行

    更新 实测此方法有问题 xff0c ctrl 43 z后进程会停止运行 xff0c 即使挂起了也没用了 xff0c 如需挂起后还能继续执行请参考https blog csdn net m0 37340681 article details
  • HiveDDL

    一 数据类型 1 基本数据类型 Hive数据类型 Java数据类型 长度 例子 TINYINT byte 1byte有符号整数 20 SMALINT short 2byte有符号整数 20 INT int 4byte有符号整数 20 BIG
  • Linux解除端口占用-kill进程总结

    Linux解除端口占用 需要解除端口占用时 xff0c 可以通过端口或者进程名查找进程 xff0c 再通过该进程的pid来杀掉该进程 xff1b 也可以通过进程名直接杀死进程 方法1 根据端口查找进程 sudo lsof i lt 端口号
  • Matplot学习总结

    数据可视化库Matplotlib学习总结 更新日期 20181109 安装 需要先安装numpy pip install numpy pip install matplotlib 如果下载速度慢可以参考 https blog csdn ne
  • 使用GDB调试Android Native层代码

    Author Gary Date 2019 2 21 转载整理自 xff1a https wladimir tm4pda github io porting debugging gdb html https www cnblogs com
  • Shell总结

    Author Gary Date 2019 2 22 转载整理自 xff1a http www runoob com linux linux shell variable html bin bash 是一个约定的标记 xff0c 它告诉系统
  • Android I/O截获

    Author Gary Date 2019 3 15 系统版本 Android 6 0 1 r1 Android I O截获 xff0d xff0d 将Android系统中的汇编系统调用封装为C函数 由于项目要求 xff0c 需要拦截And