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。
相关阅读:
Question第一期 | 网站被黑客扫描撞库该怎么应对防范?
相关文章:
【推荐】 视觉设计师的进化
【推荐】 一份 ECMAScript 2015 的代码规范(中)
【推荐】 如何有效的杜绝“羊毛党“的薅羊毛行为?