hook技术实现Android透明加解密
由于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操作进行的时候将内存中的明文加密到本地密文存储。
更多内容尽在:www.commernet.cn
- 上一篇:信息安全管理体系与风险评估的优缺点分析
- 下一篇:大数据下的安全挑战