Android下通过hook技术实现透明加解密保障数据安全
Android下通过hook技术实现透明加解密保障数据安全
一、前言
在Android移动设备上保存重要隐私文件时,通常会使用一些加密软件。但现有的隐私空间软件在打开文件时,往往需要将加密文件解密到临时文件,然后再选择应用程序打开,这会导致用户重要文件在设备上以明文形式存在,存在泄漏风险。此外,某些隐私空间软件还存在临时文件生命周期过长等问题。
本文将讨论一种采用hook技术实现的透明加解密方法,该方法不需要在设备上生成临时文件,从而更好地保护用户隐私。
二、技术要点
Android系统基于Linux内核,根据语言环境不同可以分为Java层、Native C层和Linux Kernel层。Java层的安全性较低,Linux Kernel层的修改需要重新编译系统,通用性不强。因此,选择在Native C层通过JNI开发,可以使用Linux提供的函数实现更多功能。
在hook API方面,可以使用ptrace函数与plt表实现,也可以采用Inline hook的方式,但后者不够稳定且操作难度大。本质上,这些方法都是通过劫持函数调用来实现的。
由于处于Linux用户态,每个进程都有自己独立的进程空间,因此必须先注入到目标进程空间,修改其内存中的进程代码,替换其中过程表的符号地址。ptrace函数提供了强大的调试功能,可以附加目标进程、读写目标进程的内存空间和寄存器。
基本流程如下:
- 使用PTRACE_ATTACH绑定目标进程
- 使用PTRACE_GETREGS获取目标进程寄存器状态并保存
- 使用PTRACE_PEEKDATA和PTRACE_POKEDATA保存原代码并注入新代码
- 使用PTRACE_SETREGS恢复寄存器状态并继续执行
- 在HOOK完成后,注入的代码执行int3被ptrace捕获,目标进程再次暂停执行
- 再次保存寄存器状态
- 还原代码
- 恢复寄存器状态并继续执行
- 使用PTRACE_DETACH撤销绑定目标进程
在Android平台上实现透明加解密,需要找到open和close函数的符号所在的动态链接库。通过分析Android代码,可以发现读取文件流的函数最终通过JNI方式的read函数实现,打开文件的操作最终都归结于open函数。实现Java代码的JNI支持的动态库是nativehelper.so,因此需要hook该动态库。
三、关键流程
阅读Android代码,查找打开文件和关闭文件的过程。这可以通过分析JNI方式的read函数和open函数来实现。
进行进程注入和ELF节替换。进程注入是将一段代码拷贝到目标进程并让其执行的技术。由于需要root权限,市面上的主流安全软件都是基于进程注入来管理和控制其他应用进程的。
学习Linux的ELF格式。ELF(Executable and Linkable Format)是Linux系统中可执行文件、目标代码、共享对象文件和核心转储的标准化文件格式。了解ELF格式对于实现hook技术至关重要。
需要编写自己的open函数和close函数实现加解密操作。这可以使用Android平台下的openssl EVP编程实现。需要注意的关键点包括密钥空间构造、获取文件名以及处理Openssl对称加解密时的填充问题。
四、总结
该方案能够在Android平台上实现透明加解密,但需要使用root权限并提前捕捉用户程序启动进行hook。在移动设备上效率是瓶颈,且文件不宜过大。对于docx、xls、pdf、ppt、txt等文本文件以及jpg等图片格式支持较好,其他格式的文件需要进一步测试。