首页 > 编程知识 正文

安卓应用编译优化的三种方式,android版本

时间:2023-05-05 00:32:13 阅读:114290 作者:778

本文是《使用钩子技术改进Android程序安全性》系列的下一篇,将继续探讨使用挂钩技术改善安卓程序安全的问题。

一、libtest_PIC.so库中的PIC代码研究

如果对象是在PIC模式下编译的,则重新定位方法会有所不同。 通过查看图1所示的libtest_PIC.so库文件的部分信息,可以看到函数printf (的重新定位信息位于两个重新定位部分: rel.dyn部分和rel.plt部分我们在这里使用了两种新的重新定位类型R_386_GLOB_DAT和R_386_JMP_SLOT; 因此,必须使用这样的偏移地址来填充替代函数的32位绝对地址。

图1︰libtest_PIC.so库文件的重新定位部分

图2显示了以非PIC模式编译的函数libtest2) )的汇编代码。 函数printf () (以红色表示)的条目地址在图1的重新定位部分rel.dyn和rel.plt中指定。

图2︰libtest2()的反汇编代码——是使用-PIC参数编译的

图3 :语句' printf (libtest 2:1 stcalltotheoriginalprintf (() ) ) )。 的工作流程

图4 :语句' global _ printf2(libtest 2: global _ printf2) ()n )。 的工作流程

图5 :语句local _ printf (libtest 2: local _ printf ) (() )n ); '的工作流

由图1-5可见,当利用PIC参数创建动态库时,位于函数printf )的入口的偏移地址0x1fe0、0x2010、0x2000处的libtest2()的代码是地址

二.挂钩方案

挂接模块阻止对printf ) )的调用并重定向到另一个函数时,链接器将动态库加载到内存中,然后将重定向的函数地址重新定位部分中“printf”符号定义的偏移量

要用重定向hooked_printf函数的调用替换printf (函数调用,如图6的软件流程图所示,dlopen ) )和libtest ) )的调用之间进行填充此挂接函数首先获取符号printf的偏移地址。 此地址从名为rel.dyn的重新定位部分开始。 在本例中,此地址值为0x1fe0。 然后,挂接函数将hooked_printf )函数的绝对地址写入偏移地址。 然后,如果调用libtest2()中的代码为printf ) ),则继续调用hooked_printf ) )。

图6 :挂接函数阻止printf ) )的调用,并重定向至hooked_printf ) )的调用。

图7综合了前面给出的所有可能情况,给出了钩子函数的完整流程图。 main ()函数中的变化部分用图8记述。

图7:ELF挂钩模块流程图

图8 :创建挂接后的主) )函数的代码

的输出如图9所示。 第一次调用libtest1 ()/libtest2) )时,可以看到函数内部调用了printf ) )。 如果再次调用这两个函数,则在执行挂接函数后,对printf ()函数的调用将重定向到hooked_printf ) )函数。 Hooked_printf ()函数将字符串“is HOOKED”附加到普通打印字符串的末尾。 图10显示了创建挂接后程序的执行流程。 与图8所示的原始流程相比,可以看到hooked_printf ) )函数已注入libtest1 )和libtest2) )。

图9 :测试程序的输出中,printf (函数卡住。

图10 :创建挂接后测试项目运行过程的图像。

三、案例分析——安卓应用中的挂钩式保护方案

基于上一节中对挂接技术的研究,开发了一个插件,以帮助安卓APP应用程序开发人员提高APP应用程序的安全性。 开发人员必须将唯一的Android本机库添加到项目中,并在程序启动时添加一行Java代码以加载本机库。 然后,该库将一些保护代码注入APP应用程序中的其他第三方库。 此保护代码有助于加密本地文件的输入/输出流,绕过函数__android_log_print (),避免调用Logcat打印调试信息,以及用户的隐私

为了验证此保护插件的有效性,我们编写了一个Android APP应用程序来模拟包括第三方库在内的APP应用程序的情况。 在此测试过程中,此第三方库将执行以下两项操作:

1 .外部Java指令调用库中的函数时,调用__android_log_pri

nt()来打印一些信息。

2.在这个库中,代码会创建一个文件 (/ sdcard/data.dat)来把数据保存在本地存储中而且没有加密,然后再把它读回来并将其打印在屏幕上。此操作是模拟应用程序尝试将一些敏感的信息保存在本地文件系统中的。

图11-14中比较了放置钩子前后测试程序的屏幕快照,Logcat输出,以及在设备的本地文件系统中保存文件的内容。

图11:这里使用的Android*平台是Teclast X89HD,Android 4.2.2

图12:应用程序输出——在建立钩子后没有变化

图13:Logcat输出——在建立钩子后输出为空

图14:在建立钩子后在/sdcard中的本地文件'data.dat'已加密

如图中所展示的,程序运行流程在设置钩子后与设置钩子前完全一样。然而,Logcat在设置钩子后从本机库中获取不到输出内容。进一步来看,本地文件的内容不再以纯文本格式存储。

我们开发的插件可以帮助测试应用程序提高安全性,以防止通过Logcat这样的方式收集信息的恶意攻击,以及防止对本地文件系统的离线攻击。

四、 结论

归纳来看,钩子技术可以应用在许多开发领域,从而提供对Android应用程序的无缝安全保护。进一步来看,基于钩子的保护方案不仅可以应用在安卓系统,还可以扩大到其他操作系统,如 Windows *、嵌入式 Linux或其他为物联网设备设计的操作系统。它可以大大减少开发周期和降低维护成本。实战应用中,开发人员可以开发他们自己的基于钩子的安全方案或者使用市场上可用的专业的第三方安全解决方案。

五、 参考资料

1.Redirecting functions in shared ELF libraries,Apriorit Inc, Anthony Shoumikhin, 25 Jul 2013,http://www.codeproject.com/Articles/70302/Redirecting-functions-in-shared-ELF-libraries。

2. x86 API Hooking Demystified,Jurriaan Bremer,http://jbremer.org/x86-api-hooking-demystified/。

4.Android Open Source Project,https://source.android.com/。

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

【编辑推荐】

【责任编辑:dddxl TEL:(010)68476606】

点赞 0

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。