位置: 编程技术 - 正文

Android应用程序拍照行为C层拦截实现(android应用程序的主要语言是)

编辑:rootadmin
Android应用程序拍照行为C层拦截实现一、Binder简介

推荐整理分享Android应用程序拍照行为C层拦截实现(android应用程序的主要语言是),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:Android应用程序中,图片应放在那个目录下?A,android应用程序包下载安装,Android应用程序包是什么,Android应用程序中,图片应放在那个目录下?A,Android应用程序包怎么打开,Android应用程序包怎么打开,android应用程序的主要语言是,android应用程序的主要语言是,内容如对您有帮助,希望把文章链接给更多的朋友!

Android平台的进程之间需要频繁的通信,比如打开一个应用便需要Home应用程序进程和运行在system_server进程里的AcitivityManagerService通信才能打开。故此对进程间通信机制要求比较高,速度要快,还要能进行复杂数据的交换,应用开发时应尽可能简单,并能提供同步调用。Android中进程间通信用binder机制来实现。

Binder是一种高效且易用的IPC机制。

(1) Client/Server通信模型

(2) 用驱动程序来推进进程间的通信方式

(3) 通过共享内存来提高性能

(4) 为进程请求分配每个进程的线程池,每个应用进程默认启动两个binder服务线程

(5) 进程间同步调用

Binder通信模型如图1所示,Client和Server存在于用户空间。Client与Server通信的实现,是由Binder驱动在内核空间实现。Service Manager作为守护进程,处理客户端请求,管理所有服务项。

Server进程启动时,将在本进程内运行的Service注册到Service Manager中,并且启动一个Binder线程池,用来接收Client进程请求。

Client进程向Service Manager查询所需要的Service,并且获得相应Binder句柄,通过该句柄即可向Service发送请求。

图1 Binder进程间通信模型

统观binder中的各个组成元素,就会发现它和TCP/IP网络有很多相&#;之处。

Binder驱动 ----> 路由器

Service Manager ----> DNS

Binder Client ----> 客户端

Binder Server ----> 服务器

图2 一个典型的TCP/IP访问过程

Client向DNS查询google.com的IP地址,DNS将查询结果返回client,client在得到google.com的IP地址后就可以据此向google服务器发起连接了。在这一系列流程中,router所担负的责任是将数据包投递到用户设定的目标IP中,即router是整个通信结构中的基础。对于IP层及以上的用户来说,IP地址是他们彼此沟通的凭证——任何用户在整个互联网中的IP标志符都是唯一的。而DNS角色并不是必需的,它的出现是为了帮助人们使复杂难记的IP地址与可读性更强的域名建立关联,并提供查询功能。客户端能使用DNS的前提是它已经正确配置了DNS服务器的IP地址。

将网络通信中各个功能模块与binder做对比。

和TCP/IP网络类&#;,binder中的“DNS”也并不是必需的——前提是客户端能记住它要访问的进程的binder句柄(IP地址);而且要特别注意这个句柄是“动态IP”,这就意味着即使客户端记住了本次通信过程中目标进程的唯一句柄,下一次访问仍然需要重新获取,这无疑加大了客户端的难度。“DNS”的出现可以完美解决这个问题,用于管理binder句柄与可读性更强的“域名”间的对应关系,并向用户提供查询功能。

Binder机制中的DNS角色就是service manager,其在binder通信过程中的唯一句柄永远都是0。

前文所述Binder为进程请求分配每个进程的线程池,每个应用进程默认启动两个binder服务线程。如下图所示。

图3 EclipseDDMS视图

ID:虚拟机分配的唯一线程ID

Tid:linux的线程ID号

Status:线程状态

native:正在执行native代码

wait:等待被其他线程唤醒

vmwait :正在等待一个虚拟机资源

utime:执行用户代码的累计时间

stime: 执行系统代码的累计时间

每个应用进程最多只能创建个binder线程。

二、Binder驱动原理

Binder用驱动程序来推进进程间的通信方式。

(1) 将自己注册成一个misc device,并向上层提供一个设备文件节点/dev/binder,其实现遵循Linux设备驱动模型。

(2) 目的:将内核内存的一块作为字符设备,用户可通过这些调用来读写这段内存。

1、 Binder_open

打开/dev/binder节点,binder驱动会在/proc系统目录下生成各种管理信息(如/proc/binder/proc,/proc/binder/state,/proc/binder/stats),其中proc对象就是管理数据的记录体(每个进程都有独立记录)。

binder_proc:用于描述当前操作Binder的进程的上下文状态,比如内存信息、线程信息、进程优先级等。Binder驱动的open()函数被调用后就会创建一个binder_proc结构,这样的结构针对于每个进程都是唯一的。

2、 Binder_mmap

Binder的设备内存是在mmap操作时分配的,分配的方法是先在内核虚拟映射表上获取一个可以使用的区域,然后分配物理页,并把物理页映射到获取的虚拟空间上。

Binder设备最大能映射4M的内存区域,但它并没有全部分配物理内存,其实只是分配了一个页的物理内存。如图4所示,进程B执行mmap()后,Binder和应用程序拥有了若干共用的物理内存块。

图4 进程B执行mmap()后

如图5所示,Binder驱动通过copy_from_user()把进程A中的某段数据复制到其binder_proc->buffer所指向的内存空间中。进程B就能够读取数据。可知,Binder驱动只用了一次复制。

Android应用程序拍照行为C层拦截实现(android应用程序的主要语言是)

图5 进程A复制数据到进程B中

3、 Binder_ioctl

参数1是用户程序打开设备时使用open函数返回的文件标识符。

参数2是用户程序对设备的控制命令。

参数3是用户态与内核态进行交互的数据结构。

Binder IOCTL码

作用

BINDER_WRITE_READ

完成对/dev/binder的读写操作,这会是最频繁的Binder IOCTL操作

BINDER_SET_IDLE_TIMEOUT

设置IDLE超时

BINDER_SET_MAX_THREADS

设置当前Binder实例可用的最大线程数

BINDER_SET_IDLE_PRIORITY

设置Binder在进程处于IDLE时的进程优先级

BINDER_SET_CONTEXT_MGR

让自己成为Binder的管理者,只有servicemanager会用到

BINDER_THREAD_EXIT

退出Binder处理的内核线程

BINDER_VERSION

返回Binder驱动的当前版本

binder_write_read结构体中的read_buffer和write_buffer字段分别指向将要读取或者写入的缓冲区。这两个缓冲区中的数据都是以“数据类型&#;数据内容”的&#;式顺序存放的,而且多条不同类型的数据连续存放。数据类型分为BC_*系列和BR_*系列。

BC_*系列,Binder Command的简称,说明用户态给Binder驱动发出的命令;

BR_*系列,Binder Return的简称,说明是Binder驱动给用户态发回的操作结果反馈。

在binder_write_read操作时,无论是读还是写,都可以使用同一个BINDER_WRITE_READ的ioctl(),同时处理多个命令,同时包装多个BC_命令发多个命令到Binder驱动,或是通过一次ioctl()读出来多个返回结果,这样也节约了系统调用时的开销。

无论是TRANSACTION还是REPLY,通过ioctl()来操作时,使用的参数都会是一个叫binder_transaction_data的数据结构的指针。binder_transaction_data结构体描述Binder传输时的特征信息。

通过BC_系列命令向Binder驱动发出操作请求时,需要target.handle指定到需要访问的Binder对象。

通过BR_系列命令从Binder驱动里读回返回&#;时,需要指定返回的一段地址,target.ptr则会指向这个地址空间。

code便是编写AIDL和Native Service的IBinder命令,由IBinder::FIRST_CALL_TRANSACTION开始的命令序列。

sender_euid和sender_pid是在内核中由Binder驱动填入的,无法被伪造,保证了身份标记的可靠性。

当需要包含额外的数据负载时,由data来保存缓冲区的首地址与偏移。data.ptr.buffer指向首地址,data.ptr.offsets指向具体的偏移量。

通过这样的binder_transaction_data,就可以很精确地描述在某一次Binder IPC传递过程里需要做什么操作(target定位到对象、code定位到方法),操作的数据在什么地方(data_size、data_size、offsets_size定位作为参数的对象)。在这些信息里还会包含发起请求的pid、euid等信息,可进一步用于权限控制。

三、应用拍照行为C层拦截实现

Mediaserver进程提供了Android上的多媒体服务,这个进程通过binder的进程间通信方式来完成其他进程(如音乐播放器、录音、拍照)的请求。实现应用拍照行为的C层拦截,其主要技术难点有进程注入技术、binder通信拦截、binder通信数据包解析。前两个技术网上已有好多源码提供(见参考资料),现对应用程序拍照过程中的binder通信数据包进行解析。

首先向已运行的系统进程/system/bin/mediaserver中注入自己开发的动态库libhook.so,用于替换系统的ioctl函数为上述的ioctl_hooked函数。然后打开三星自带的照相机,得到如下的log信息。

在/frameworks/av/camera/ICamera.cpp文件中找到code对应的函数。

可得,code=9,data.ptr.buffer里的数据为”android.hardware.ICamera”时,表示某个应用程序调用了takePicture()函数,即发生了拍照行为。将调用部分函数的进程都记录下来,代码如下所示:

在程序中添加上述代码,分别开启美图秀秀的照相功能和三星手机自带的照相机并按下拍照键,可得如下的log信息。

log信息中已记录了美图秀秀(com.mt.mtxx.mtxx)和三星手机自带的照相机(com.sec.android.app.camera)拍照的时间、pid、ppid和进程名。

同时也发现system_server进程隔一段时间就会打开摄像头。这是因为三星打开了智能屏幕的功能。

四、参考资料

[1] Android下通过root实现对system_server中binder的ioctl调用拦截 [2] Android利用ptrace实现Hook API [3] Andrdoid中对应用程序的行为拦截实现方式之----从底层C进行拦截 [4] Service与Android系统设计(7)--- Binder驱动 [5] AndroidXRef:

Android: wifi打开和关闭的流程解析 1,组件图提供了wifi打开/关闭时,一些相关模块的依赖关系。2,简介:wifi打开:由jni依赖的libnetutils.so提供wifi驱动的加载。由netd来完成softap相关的fwrel

关于android 开发屏幕适配的个人见解 一、android中各个单位的基本概念px是英文单词pixel的缩写,意为像素,屏幕上的点。我们通常所说的分辨率如X就是指的像素。在设计领域中,像素

Android实战--英文词典(API+GSON+Volley) 转载请注明出处,喜欢我的可以关注我!上一节我们介绍了GSON和Volley,用GSON对返回的数据进行了初步解析,这一节我们更进一步,讨论一下如何实现英

标签: android应用程序的主要语言是

本文链接地址:https://www.jiuchutong.com/biancheng/382227.html 转载请保留说明!

上一篇:App安全之代码混淆(安全的代码)

下一篇:Android: wifi打开和关闭的流程解析(安卓wifi打不开解决)

  • 堤防是啥
  • 企业所得税相关分录
  • 合伙事务执行的办法有哪些?
  • 商场联营扣率
  • 出售无形资产计入资产处置损益
  • 应付票据和应付债券
  • 生产设备租赁费计入什么科目
  • 应纳税所得额超过36000至144000
  • 金税盘忘了清盘怎么办
  • 一般纳税人企业所得税税率
  • 城市建设税和教育费附加计算公式
  • 蓝字发票未入账收到红字发票处理?
  • 自然人能申请破产吗?
  • 取得抵债资产的方式主要有以下几种
  • 年底增值税专用发票入帐不勾选抵扣帐务处理
  • 贷款利息税前扣除比例
  • 投资收益所得税税前扣除
  • 银行承兑汇票承兑手续费是多少
  • 一般纳税人企业所得税如何计算
  • 闲置资金购买理财产品
  • 苹果系统如何访问相册
  • 上月计提费用本月怎么做账
  • linux 使用u盘
  • Element UI 及 Element Plus框架
  • fatal error: opencv/cv.h: 没有那个文件或目录 错误;fatal error: opencv2/contrib/contrib.hpp: 没有那个文件或目录,opencv多版本
  • php注释的主要作用是什么?
  • 固定资产改造后如何计提折旧
  • 设备经营租赁属于什么行业
  • php throw
  • 月初红字冲回估价入账存货借贷
  • EarthLiveSharp中cloudinary的CDN图片缓存自动清理python脚本
  • 收到采购专用发票
  • 其他收益属于利润表吗
  • 使用php进行mysql数据库编程的基本步骤
  • 出差餐补贴标准
  • npm install 的 --save 选项是什么?
  • 前端作业做一个网站
  • mount.nfs an incorrect mount
  • 关税计入纳税总额么
  • 物业管理可以开保洁发票吗
  • 企业销售旧车如何开票
  • 其他应付款个人在贷方表示什么
  • Android ViewPager2 + Fragment 联动
  • 财政拨款结余的明细科目有哪些
  • 现金收入的管理的内容包括哪些
  • 企业的留存收益有
  • 房地产开发企业建造的商品房,在出售前
  • sqlserver2005导出数据
  • 汽车报废残值如何处理
  • PostgreSQL教程(十六):系统视图详解
  • sql中count或sum为条件的查询示例(sql查询count)
  • 建筑企业会计科目的设置及核算
  • 股东分红账务处理表格
  • 合作社分红计入什么科目
  • 资本公积的用途有哪些
  • 所得税怎么收取
  • 企业出租经营权是否征税
  • 收不回来的问题
  • 开票收入摘要怎么写
  • 已经发出的商品替换零部件进成本还是费用
  • 没有合同的收入能入账吗
  • 怎么处理固定资产残值
  • 退税政策调整
  • 提取的安全生产费
  • 企业未按照规定报送年度报告怎么办
  • 异地预缴增值税多交了怎么办,可以退吗
  • 合同章盖成公章
  • ora01804怎么解决windows
  • mac safari浏览器翻译功能
  • linux怎样过滤一个关键字
  • explorer.exe进程文件
  • win8.1快速启动
  • Java中string类型比较大小
  • 批处理 /a
  • jquery动效
  • void方法设置断言
  • 企业所得税率2023年
  • 火灾损失进项税额怎么处理
  • 如何申报印花税的流程
  • 个体工商户怎样交税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设