导读
.so作为安卓系统中最常见的二进制文件,如何高效地加载和调用so是每个开发者必备的技能。了解安卓系统中.so文件特性,对于开发者来说非常必要的。360加固保高级安全研究员吴乐,通过本文为开发者详细讲解了安卓系统上.so文件的一些特性。
游戏APP如果没有经过加固,上传到应用市场之后,一些开发者可以修改apk里面的代码,对apk进行重打包,运行在手机上可以直接跳过游戏中需要道具购买支付的环节,从而导致游戏开发者部分收入的损失。
同样地,金融理财类APP也容易出现这种问题。从官网上下载银行类APP,对银行类APP进行反编译处理,添加一些恶意代码,再进行重打包签名。然后安装APP,当用户输入APP登录账号与密码后,就可以从远程服务器获取APP登录账号与密码,获取APP信息。
如果手机APP未进行加固直接上传到应用市场,APP代码很容易被恶意开发者进行反编译、嵌入恶意代码,导致APP安全受到威胁。
了解安卓系统上的动态链接库.so特性能够使开发者避免一些开发过程中的常见错误,增强APP安全性。那安卓系统动态链接库so都有哪些特性呢?
安卓系统动态链接库so特性:
1、GNU hashes
安卓上在加载so的时候它需要一个动态链接的过程,hashes表结构就是它在加载动态链接过程中一个非常重要的结构。动态链接库so在内存映射完成后,必须对其内部的符号进行动态链接,之后才可以正常调用so中的函数。Android上使用hash表等结构来加速动态链接的过程。Gnuhash就是一种新的hash结构。而android系统中以前默认使用的是Elfhash机构。从安卓6.0开始,谷歌就采用了GNU hashes这样一个结构来默认代替安卓系统之前使用的Elfhash结构。
GNU hashes的作用:使用GNU hashes,可将动态链接库so的动态链接效率提升50%。
GNU hashes的用法:
在Android.mk文件中添加:
LOCAL_LDFLAGS := -Wl,--hash-style=gnu
只包含gnuhash
LOCAL_LDFLAGS := -Wl,--hash-style=both
同时包含gnuhash和elf hash,兼容所有系统版本
2、Correctsoname/path handling
Correct soname/path handing是谷歌官方对动态加载器修复的一处设计错误。
在安卓6.0之前,当APK同时加载两个so文件,这两个so文件名称相同、路径不同,导致APK只加载第一个,后续so无法正常加载;
3、Enable logging of dlopen
从8.0开始,开发者可以用Enable logging ofdlopen/dlsym and library loading errors for apps这个方式来查看apps中so的加载、符号的查询等流程,方便开发者进行调试。
用法: adb shellsetprop debug.ld.app.com.example.myapp dlsym,dlopen,dlerror;
4、MissingSection Headers
android 7.0开始会对so的section header做完整性检查,凡是抹去了section header的so都无法通过完整性检查,无法正常加载。这意味着无法通过对section header的抹除来防止so被逆向。
5、Invalid ELFheader/section headers
android 8.0开始对so的elf header和section header中的内容正确性做了检查,凡是没有通过内容正确性检查的so都无法进行正常加载;
这意味着无法通过对elfheader或section header内部字段的抹除来防止so被逆向。
安卓绿色联盟后续会根据每期技术沙龙议题输出精彩技术干货文章,为未能现场参加技术沙龙的您提供另一个干货学习机会。
微信搜索“安卓绿色联盟”或“AndroidGA”或扫描文末二维码即可关注安卓绿色联盟微信公众号,最新技术沙龙招募、精彩技术干货分享、与专家讲师更多互动等你参与!!!