文档开发者中心
我的

技术干货 | Android动态链接库so,你必须了解的特性

导读
.so作为安卓系统中最常见的二进制文件,如何高效地加载和调用so是每个开发者必备的技能。了解安卓系统中.so文件特性,对于开发者来说非常必要的,通过本文为开发者详细讲解了安卓系统上.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%。

GNUhashes的用法:
在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开始,开发者可以用Enablelogging ofdlopen/dlsym and library loading errors for apps这个方式来查看apps中so的加载、符号的查询等流程,方便开发者进行调试。
用法:
adb shellsetprop debug.ld.app.com.example.myapp dlsym,dlopen,dlerror;

4   MissingSection Headers


android7.0开始会对so的section header做完整性检查,凡是抹去了section header的so都无法通过完整性检查,无法正常加载。这意味着无法通过对section header的抹除来防止so被逆向。

5    Invalid ELFheader/section headers


android8.0开始对so的elf header和section header中的内容正确性做了检查,凡是没有通过内容正确性检查的so都无法进行正常加载;这意味着无法通过对elfheader或sectionheader内部字段的抹除来防止so被逆向。

点赞
收藏
回复
2
分享
举报
浏览2365 发布于2018-02-24 01:54未知归属地
全部评论
最多点赞
最新发布
最早发布
回家养猪去蟀蟀 发表于 2018-2-24 11:15
厉害了

嘿嘿,谢谢捧场
2楼回复于2018-02-24 03:29 未知归属地
厉害了
1楼回复于2018-02-24 03:15 未知归属地
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。