Question | 关于Android安全的一二事

“Question”为网易易盾的问答栏目,将会解答和呈现安全领域大家常见的问题和困惑。如果你有什么疑惑,也欢迎通过邮件(zhangyong02@corp.netease.com)提问。 

近期很多人咨询盾盾关于Android安全的各类问题,在此整理了一篇问答合集,以飨读者。

一.什么是Android界面劫持

界面劫持是指在Android系统中,恶意软件通过监控目标软件的运行,当检测到当前运行界面为某个被监控应用的特定界面时(一般为登录或支付界面),弹出伪造的钓鱼页面,从而诱导用户输入信息,最终窃取用户的隐私(恶意盗取用户账号、卡号、密码等信息),或者利用假冒界面进行钓鱼欺诈。

1. 监听系统Logocat日志,一旦监听到发生Activity界面切换行为,即进行攻击,覆盖上假冒Activity界面实施欺骗。

2. 监听系统API,一旦恶意程序监听到相关界面的API组件调用,即可发起攻击。

3. 恶意启动Service监听目标应用,在切换到目标Activity时,弹出对话框劫持当前界面迷惑用户

●    针对用户

Android手机均有一个HOME键,长按可以查看到近期任务。用户在要输入密码进行登录时,可以通过长按HOME键查看近期任务,比如说登录微信时长按发现近期任务出现了微信,那么现在的这个登录界面就极有可能是一个恶意伪装的Activity,切换到另一个程序,再查看近期任务,就可以知道这个登录界面是来源于哪个程序了。

●    针对开发人员

针对钓鱼Activity类型劫持,在登录窗口或者用户隐私输入等关键Activity的onPause方法中检测最前端Activity应用是不是自身或者是系统应用,如果发现恶意风险,则给用户一些警示信息,提示用户其登陆界面以被覆盖,并给出覆盖正常Activity的类名。

如果是针对弹窗对话框类型的劫持,接管Activity的生命周期,当发现当前界面onResume之后,判断是否失去焦点;如果同时存在则有可能是对话框类劫持,判断此时运行的活动进程是否包含敏感权限(全局Alert权限、获取任务栈权限等),如果有的话则给用户告警。

Android 的 APK 中怎么放置反编译“炸弹” 

上面文章里提到的"炸弹", 其实就是反编译器的 bug,所以针对不同的反编译器,需要设计不同的“炸弹”。先了解一下常用的 APK 反编译工具:

●     baksmali/smali: baksmali 能将二进制 dex 文件转化为 smali 文本文件用于分析,smali 则能将 smali 文件重新编译为 dex 文件。

●    Apktool : 整合了 baksmali/smali 用于处理 dex 文件, 另外实现了 res 资源文件(比如layout / strings等)的反编译。

●   AxmlPrinter : 用于将二进制形式的 AndroidManifest.xml 转换为文本形式的 AndroidManifest.xml。

●    dex2jar: 能将 dex 转化为 jar 文件。

●    jd-gui: 能将 jar 文件反编译为 java 源代码。

●    Ida Pro: 主要用于反编译 Apk 中的 So 文件,也支持将 dex 文件反编译为类似smali 语法的文本形式指令。

从上面的反编译工具可以看出,主要分三种功能:

●    反编译资源,如 AndroidManifest.xml、layout.xml

●    反编译 Dex 文件,或者进一步将 Dex 文件转换为 Java 代码

●    反编译 So 文件

炸弹”的设置需要对特定的文件格式有相当的了解,而且可能只能针对某个反编译工具的。

Android app如何加密?

android app包含的内容有dex文件,so文件,res,assets资源文件。对应的加密按此内容分为三大方面:dex保护、so加密、资源保护(res, assets)。

●   dex保护

由于未保护的dex文件,是从java编译打包而来,破解成本低较易受到攻击。其保护措施从最基本的加壳,到函数执行体抽取、动态加载,再到当前的vmp虚拟机加固,安全逐步增强。尤其是vmp加固,更是使用了自研虚拟机解释函数体,如果指令加密替换做的好,会让破解者很难受。

●    so加密

so文件,由起初的段加密,发展到自定义elf结构的加密方式,能防止IDA查看函数名称,增加破解成本和难度。

●    资源保护

res资源文件,通常只采用混淆的方式增加逆向难度。assets资源,一般不处理。但随时H5应用日益增多,部分厂商(易盾、娜迦)有提供assets加密的功能,实现原理不详。

除了上述三点防护外,还有防反编译、防二次打包、防调试、防模拟器、防xposed功能等。

a) 防反编译,一般是对市面上的反编译工具(例如apktool)做对抗,利用其漏洞,致使反编译失败;

b) 防二次打包,一般常用的是在代码里保存签名信息,启动时在native层将当前apk的签名信息与保存的签名进行比对。市面上已有破击工具。可以在常用实现方式上做些升级。

c) 防调试,通过ptrace进程,阻止破解者再ptrace调试。

d) 防模拟器,检测/system/bin/su和/system/xbin/su文件。

e) 防xposed,通过检测XposedHelpers的methodCache,判断是否被hook。