Android下通过hook技术实现透明加解密保障数据安全对于用户在Android移动设备商保存重要的隐私文件,通常采用一些加密保存的软件。但在手机上实现隐私空间的软件

一、前言

对于用户在Android移动设备商保存重要的隐私文件,通常采用一些加密保存的软件。但在手机上实现隐私空间的软件鳞次栉比,但是问题在于打开文件都需要使用该隐私空间,将加密文件解密到临时文件,然后再选择应用程序打开文件。这将导致用户重要文件在设备上明文的存在,存在泄漏的风险。

而且根据笔者的调研,对于360隐私空间,应用程序对临时文件修改后不能再逆向加密回密文,导致加密操作只能一次进行。LBE隐私空间,相对较好,但其临时文件存在生命周期过长。

因此笔者通过现有知识讨论一种采用hook技术实现的透明加解密方法,不需要在设备上生成临时文件,从而保护用户重要隐私。

二、技术要点

由于Android是基于linux内核的开源系统,根据语言环境不同可以分为Java层、Native C层、Linux Kernel层。Java层的安全是使用Java语言开发,基于SDK,能实现的功能相对简单。Linux Kernel层安全,需要从源码做起,编译自己的系统,通用性不强。因此在Native C层,通过JNI开发,可以使用linux提供的函数实现更多的功能。

在hook API方面与linux的hook类似使用ptrace 函数与plt表实现,还可以采用Inline hook的方式实现,但是不是很稳定,操作难度大。其本质都是劫持函数调用。

但是由于处于Linux用户态,每个进程都有自己独立的进程空间,所以必须先注入到所要hook的进程空间,修改其内存中的进程代码,替换其中过程表的符号地址,因此其生存空间是所注入的进程,只能对某一进程进行HOOK。

Ptrace函数是调试程序所用,功能强大,不仅可以附加某一进程(PTRACE_ATTACH),而且可以任意修改目标进程的内存空间(PTRACE_PEEKDATA,读内存。PTRACE_POKEDATA,写内存),甚至是寄存器(PTRACE_SETREGS,PTRACE_GETREGS)

基本流程是利用寄存器指令中断:

① PTRACE_ATTACH,绑定目标进程。

② PTRACE_GETREGS,获取目标进程寄存器状态,并保存。

③ PTRACE_PEEKDATA与PTRACE_POKEDATA配合,保存原代码,写入要注入的代码到当前运行位置。

④ PTRACE_SETREGS,恢复寄存器状态,并继续执行,这是注入的代码开始在目标进程内执行,注入代码完成HOOK,过程与Windows下相似。

⑤ 在HOOK完成后,注入的代码执行int3被ptrace捕获,目标进程再次暂停执行。

⑥ PTRACE_GETREGS,再次保存寄存器。

⑦ PTRACE_PEEKDATA与PTRACE_POKEDATA配合还原代码。

⑧ PTRACE_SETREGS,恢复寄存器,目标进程继续执行。

⑨ PTRACE_DETACH,撤销绑定目标进程。

参考LBE实现原理和看雪上关于Hook Ioctl的文章都基本上按照这种流程实现HOOK。

在明白hook工作机制后,对于实现Android上的透明加解密需要找到open和close函数的符号存在哪个动态链接库中,hook该应用程序的这个动态链接库,在open操作进行的时候,将密文文件分块解密到内存中,并将该内存中的文件标识符返回。在close操作进行的时候将内存中的明文加密到本地密文存储。

三、关键流程

1、阅读Android代码查找打开文件和关闭文件过程。这是我们实现透明加解密的关键。

参考的方式

可以发现读取文件流的函数最终通过JNI方式的read函数实现,同样打开文件的操作最终都归结于open函数。

而实现Java代码的JNI支持的动态库是nativehelper.so因此我们需要hook的动态库即nativehelper.so。

注:在Android早期版本即android2.3、Android4.0上open和close符号在nativehelper.so中,该文件有140k大小。而在android4.1版本以上,谷歌重写了android原生库的实现,nativehelper.so被拆分,笔者在4.0平台进行的开发并没有阅读寻找4.1版本之上的。

2、进行进程注入和ELF节替换

进程注入就是将一段代码拷贝到目标进程,然后让目标进程执行这段代码的技术。由于这样的代码构造起来比较复杂,所以实际情况下,只将很少的代码注入到目标进程,而将真正做事的代码放到一个共享库中,即.so文件。被注入的那段代码只负责加载这个.so,并执行里面的函数。由于.so中的函数是在目标进程中执行的,所以在.so中的函数可以修改目标进程空间的任何内存,当然也可以加钩子,从而达到改变目标进程工作机制的目的。

当然不是任何进程都有权限执行注入操作的。Android平台上的进程注入是基于ptrace()的,要调用ptrace()需要有root权限。目前市面上的主流安全软件也都是基于进程注入来管理和控制其他应用进程的。这也就是为什么这些安全软件需要获得root权限的原因。

关于如何.so注入的实现,可以参考看雪论坛的上的一个注入库LibInject 和洗大师的一个开源项目Android Injector Library。

笔者对这种两种方式都有实验,对于Libinject,就是向目标进程中注入libhook.so,首先调用ptrace()函数,挂起该进程。然后遍历进程加载的libc.so,通过dlopen和dlsym函数修改arm寄存器的值,然后压入参数,so路径,并将之前找到的dlopen地址压入寄存器,直接操作blx,就可以让目标进程调用dlopen加载我们的so,同理dlsym调用我们的so里的函数。

注入完成后,会调用libhook.so库中的hook_entry()函数,该函数实现加载hook函数实现的动态库,并对libnativehelper.so的got表和plt表的遍历和修改。修改为自己编写的实现open函数和close函数的动态库中的符号地址。因此需要注入两个库,因为libhook.so在执行完后需要detach目标进程,从而释放,而具体操作的动态库需要常驻内存。实现常驻内存需要在hook_entry()函数中显式加载动态库。

以上注入以后的过程都由自己编程实现,能够加深对ELF格式理解。

而采用Android Injector Library则相对简单,在调用可执行程序的主函数中实现即可:

这个文件编译生成注入入口和符号表替换逻辑。

* 1、在该函数中加载libhook.so通过其中的do_hook函数返回原来的open和close地址以及要替换的新的open和close函数地址

* 2、然后静态打开libnativehelper动态库,读取其结构遍历节表,找到全局符号表(GOT表),该表存储了外部依赖符号的地址

* 3、遍历GOT表找到原先的open函数和close函数地址,分别替换为新的open函数和新的close函数即可

Android安全 Hook技术,Android下通过hook技术实现透明加解密保障数据安全相关推荐

  1. Android开发之银联工作密钥,主密钥,传输密钥(加解密图文展示)

    一.密钥说明 主密钥和工作密钥都有明文,密文的概念,如果其密钥中带有校验值,表示其密钥是密文,反之是明文!第二小节会说明校验值的作用.且密钥的密文以及明文都是由服务器下发,服务器开发人员定好每种密钥的 ...

  2. java 和 c# 下的RSA证书+AES+DES加解密实现

    java 和 c# 下的RSA+AES+DES加解密实现 前言 在实际应用中,经常有需要使用加解密的情况,RSA\AES\DES是比较常用的几种加解密方式,使用和实现方式都比较成熟可靠,本文简要介绍一 ...

  3. 【 Linux学习】Linux环境下利用OpenSSL对大文件进行AES加解密

    一.背景 之前的几篇博客已经介绍了Gitlab如何备份恢复与迁移已经脚本监控过程等. git学习--> Gitlab如何进行备份恢复与迁移? http://blog.csdn.net/ouyan ...

  4. Android平台dalvik模式下java Hook框架ddi的分析(2)--dex文件的注入和调用

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/77942585 前面的博客<Android平台dalvik模式下java Ho ...

  5. Android平台dalvik模式下java Hook框架ddi的分析(1)

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/75710411 一.前 言 在前面的博客中已经学习了作者crmulliner编写的, ...

  6. 深入Android源码系列(二) HOOK技术大作战

       漫天的标题党的口水文打赏爆表,冷落了一群默默输出高质量文章的人群.真正的技术文章能否得到认可?      本文讲解内容有     hook技术原理探究     hook本进程方法     hoo ...

  7. 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 一 | Activity 进程相关源码 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  8. 【Android 插件化】Hook 插件化框架 ( 使用 Hook 方式替换插件 Activity 的 mResources 成员变量 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  9. 【Android 插件化】Hook 插件化框架 ( 从源码角度分析加载资源流程 | Hook 点选择 | 资源冲突解决方案 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  10. 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 二 | AMS 进程相关源码 | 主进程相关源码 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

最新文章

  1. MATLAB实战系列(三十三)-技术和医疗的完美结合(续),基于最小二乘法的椭圆拟合
  2. C++ primer记录
  3. Android 绘制动态图
  4. mybatis 插入数据后返回自增id
  5. U盘文件系统类型 和 linux 挂载 和 卸载
  6. OPPO Find X2系列获蓝牙5.1认证:距离正式亮相又近了一步
  7. 802.1D生成树STP协议
  8. 数字信号处理课程设计---带通滤波器的设计及其matlab实,数字信号处理课程设计---带通滤波器的设计及其MATLAB实现...
  9. shiro放行_Shiro框架详解
  10. 少儿编程之Scratch入门汇总篇
  11. C#实现简单音乐播放器
  12. 域名实名认证多长时间_域名的实名认证需要多少时间
  13. 2.2.7 虚拟Ethernet以太网卡
  14. win10磁盘管理器的用处和意义
  15. 如何刷鸿蒙OS,普通安卓手机如何刷鸿蒙系统?
  16. mvn No proxy was configured, downloading directly
  17. NetCDF数据处理
  18. Whitelabel Error Page
  19. python接管已经打开ie浏览器_使用selenium控制(接管)已打开的浏览器(chrome),并通过WebDriver值检测...
  20. 每日一篇,非常齐全的网络时间戳API

热门文章

  1. MySQL自定义函数计算年龄
  2. c语言ad转换实验报告,苏州大学实验报告-实验四ad转换模块实验报告
  3. AtCoder - ABC 160 - DE(贪心)
  4. 计算机硬件关系密切,与计算机硬件关系最密切的软件是.
  5. 2022珠三角深圳锂电池技术展览会暨论坛|2022华南广东深圳锂电池技术展览会
  6. 2022-2027年中国衬衫行业市场调研及未来发展趋势预测报告
  7. java宽度优先搜索之八数码,广度优先搜索解决八数码问题
  8. scrapy1.5文档(第二节 Scrapy Tutorial)
  9. java正则表达式中的斜杠,java正则表达式匹配斜杠[Java编程]
  10. 清华计算机系人工智能学院,CoAI - 清华大学交互式人工智能课题组