导语:
[font="][size=; font-size: 10.5pt,10.5pt]在逆向分析[size=; font-size: 10.5pt,10.5pt]android App[size=; font-size: 10.5pt,10.5pt]过程中,我们时常用的用的[size=; font-size: 10.5pt,10.5pt]Java[size=; font-size: 10.5pt,10.5pt]层[size=; font-size: 10.5pt,10.5pt]hook[size=; font-size: 10.5pt,10.5pt]框架就是[size=; font-size: 10.5pt,10.5pt]Xposed Hook[size=; font-size: 10.5pt,10.5pt]框架了。一些应用程序厂商为了保护自家[size=; font-size: 10.5pt,10.5pt]android App[size=; font-size: 10.5pt,10.5pt]不被[size=; font-size: 10.5pt,10.5pt]Xposed Hook[size=; font-size: 10.5pt,10.5pt]框架给[size=; font-size: 10.5pt,10.5pt]hook[size=; font-size: 10.5pt,10.5pt]。于是想尽各种方法检测自己产品是否被[size=; font-size: 10.5pt,10.5pt]Xposed Hook[size=; font-size: 10.5pt,10.5pt]给[size=; font-size: 10.5pt,10.5pt]Hook[size=; font-size: 10.5pt,10.5pt]。笔者最近逆向分析阿里系的产品,发现阿里系的产品能够检测自否给[size=; font-size: 10.5pt,10.5pt]Xposed Hook[size=; font-size: 10.5pt,10.5pt]了。本文就带领给位一起看看官阿里系产品是如何做的这一点的,本文就选择阿里的支付宝作为我们分析对象。
检测现象:
[font="][size=; font-size: 10.5pt,10.5pt]1. [size=; font-size: 10.5pt,10.5pt]编写一个简单的支付宝的[size=; font-size: 10.5pt,10.5pt]Xposed hook [size=; font-size: 10.5pt,10.5pt]模块,[size=; font-size: 10.5pt,10.5pt] [size=; font-size: 10.5pt,10.5pt]模块代码如下:
[font="][size=; font-size: 10.5pt,10.5pt]2.[size=; font-size: 10.5pt,10.5pt]安装[size=; font-size: 10.5pt,10.5pt]XPosed hook mo[size=; font-size: 10.5pt,10.5pt]模块,重启设备,打开支付宝,就会看到如下一个对话框:非法操作的,你的手机不安全。这说明支付宝检测自己被[size=; font-size: 10.5pt,10.5pt]Hook[size=; font-size: 10.5pt,10.5pt]了。
分析过程:
[font="]0.分析工具和分析对象
[font="][size=; font-size: 10.5pt,10.5pt]样本:[size=; font-size: 10.5pt,10.5pt]Alipay_wap_main_10.0.18[size=; font-size: 10.5pt,10.5pt]
[font="][size=; font-size: 10.5pt,10.5pt]工具:[size=; font-size: 10.5pt,10.5pt]AndroidKiller, JEB2.2.7
[font="][size=; font-size: 10.5pt,10.5pt]源码:[size=; font-size: 10.5pt,10.5pt]XPosed [size=; font-size: 10.5pt,10.5pt]框架源码
[font="][size=; font-size: 10.5pt,10.5pt]1. [size=; font-size: 10.5pt,10.5pt]为了快速找到代码[size=; font-size: 10.5pt,10.5pt]Xposed[size=; font-size: 10.5pt,10.5pt]的检测代码位置,我们就不从对话框作为分析入口啦,我们直接使用[size=; font-size: 10.5pt,10.5pt]androidKiller[size=; font-size: 10.5pt,10.5pt]打开文件[size=; font-size: 10.5pt,10.5pt]Alipay_wap_main_10.0.18.apk, [size=; font-size: 10.5pt,10.5pt]然后在工程中搜索[size=; font-size: 10.5pt,10.5pt]xposed[size=; font-size: 10.5pt,10.5pt]相关的关键字,例如:[size=; font-size: 10.5pt,10.5pt]xposed
[size=; font-size: 12pt,12pt][font="]
[font="][size=; font-size: 10.5pt,10.5pt]根据搜索结果,我们找到看了两个[size=; font-size: 10.5pt,10.5pt]security[size=; font-size: 10.5pt,10.5pt]相关的类。我们使用[size=; font-size: 10.5pt,10.5pt]JEB[size=; font-size: 10.5pt,10.5pt]工具对这两个类进行分析,我们暂且分析[size=; font-size: 10.5pt,10.5pt]CheckInject[size=; font-size: 10.5pt,10.5pt]类。
[font="][size=; font-size: 12pt,12pt]
[font="][size=; font-size: 10.5pt,10.5pt]我们看到这里获得通过反射获得一个类[size=; font-size: 10.5pt,10.5pt]de.robv.android.xposed.XposedHelpers [size=; font-size: 10.5pt,10.5pt]的一个对象,于是我们可以确认发现代码就这里。[size=; font-size: 10.5pt,10.5pt]
[size=; font-size: 10.5pt,10.5pt][font="]
[font="][size=; font-size: 10.5pt,10.5pt]3. [size=; font-size: 10.5pt,10.5pt]由于[size=; font-size: 10.5pt,10.5pt]Smali[size=; font-size: 10.5pt,10.5pt]代码是经过混淆的代码,不便于读者阅读,于是笔者将代码整理如下:
[font="]
[font="]通过反射获取de.robv.android.xposed.XposedHelpers类的一个对象obXposedHelper,然后调用CheckKeywordInFiled 检测obXposedHelper成员fieldCache,methodCache,constructorCache是否有支付宝包的关键字,CheckInject.CheckKeywordInFiled, 这个函数代码 。笔者也这个函数整理如下:
[font="]
[font="][size=; font-size: 10.5pt,10.5pt]fieldCache, methodCache,constructorCache[size=; font-size: 10.5pt,10.5pt]然是[size=; font-size: 10.5pt,10.5pt]XposedHelpers[size=; font-size: 10.5pt,10.5pt]的静态成员,类型是[size=; font-size: 10.5pt,10.5pt]HashMap<String, Field>[font="]
[font="]
[font="][size=; font-size: 10.5pt,10.5pt]通过反射遍历这些[size=; font-size: 10.5pt,10.5pt]HashMap [size=; font-size: 10.5pt,10.5pt]缓存字段, 如字段项的[size=; font-size: 10.5pt,10.5pt]key[size=; font-size: 10.5pt,10.5pt]中包含支付宝的关键字[size=; font-size: 10.5pt,10.5pt]"alipy" "taobao",[size=; font-size: 10.5pt,10.5pt]等信息, 者认为是检测有[size=; font-size: 10.5pt,10.5pt]Xposed [size=; font-size: 10.5pt,10.5pt]注入
[size=; font-size: 10.5pt,10.5pt][font="]
[font="][size=; font-size: 10.5pt,10.5pt]4.[size=; font-size: 10.5pt,10.5pt]我们来继续分析[size=; font-size: 10.5pt,10.5pt]Xposed hook[size=; font-size: 10.5pt,10.5pt]框架是如何将[size=; font-size: 10.5pt,10.5pt]hook[size=; font-size: 10.5pt,10.5pt]信息存储到[size=; font-size: 10.5pt,10.5pt]fieldCache,methodCache,constructorCache[size=; font-size: 10.5pt,10.5pt]这些缓存字段当中的(我们需要下载[size=; font-size: 10.5pt,10.5pt]XPosed [size=; font-size: 10.5pt,10.5pt]源码分析,[size=; font-size: 10.5pt,10.5pt]github[size=; font-size: 10.5pt,10.5pt]有下载)。我们最通常调用[size=; font-size: 10.5pt,10.5pt]findAndHookMethod [size=; font-size: 10.5pt,10.5pt]函数[size=; font-size: 10.5pt,10.5pt]hook[size=; font-size: 10.5pt,10.5pt]一个函数, 所以我们分析这个函数,函数代码如下:
[font="]
[font="][size=; font-size: 10.5pt,10.5pt]这个函数我们暂时还无法看到存储相关的代码,这个主要实现依赖函数[size=; font-size: 10.5pt,10.5pt]findMethodExact[size=; font-size: 10.5pt,10.5pt], 于是我们继续分析[size=; font-size: 10.5pt,10.5pt]
[font="][size=; font-size: 12pt,12pt]
[font="][size=; font-size: 10.5pt,10.5pt]我们发现[size=; font-size: 10.5pt,10.5pt] methodCache.put(fullMethodName, e);[size=; font-size: 10.5pt,10.5pt] [size=; font-size: 10.5pt,10.5pt]将方法名和方法[size=; font-size: 10.5pt,10.5pt]Method [size=; font-size: 10.5pt,10.5pt]存储在方法缓存中吗。
[size=; font-size: 10.5pt,10.5pt][font="]
[font="][size=; font-size: 10.5pt,10.5pt]5.[size=; font-size: 10.5pt,10.5pt]CheckInject[size=; font-size: 10.5pt,10.5pt]类类中除了有[size=; font-size: 10.5pt,10.5pt]XPosed [size=; font-size: 10.5pt,10.5pt]检测, 还有[size=; font-size: 10.5pt,10.5pt]SO[size=; font-size: 10.5pt,10.5pt]注入检测机制的代码和手机检测是否[size=; font-size: 10.5pt,10.5pt]Root[size=; font-size: 10.5pt,10.5pt]的代码。笔者也将这些代码整理分享给各位看官:
[font="][size=; font-size: 10.5pt,10.5pt]● [size=; font-size: 10.5pt,10.5pt]Root[size=; font-size: 10.5pt,10.5pt]检测代码如下
[font="]
[font="][size=; font-size: 10.5pt,10.5pt]检测依据是:[size=; font-size: 11pt,11pt]获取[size=; font-size: 11pt,11pt]default.prop [size=; font-size: 11pt,11pt]中文件[size=; font-size: 11pt,11pt]ro.secure[size=; font-size: 11pt,11pt]的值[size=; font-size: 11pt,11pt]1 [size=; font-size: 11pt,11pt]且 [size=; font-size: 11pt,11pt]/system/bin/ [size=; font-size: 11pt,11pt]或者[size=; font-size: 11pt,11pt]/system/xbin [size=; font-size: 11pt,11pt]有[size=; font-size: 11pt,11pt]su[size=; font-size: 11pt,11pt]程序可认定程序被[size=; font-size: 11pt,11pt]root[size=; font-size: 11pt,11pt]了
[size=; font-size: 10.5pt,10.5pt][font="]
[font="][size=; font-size: 10.5pt,10.5pt]● [size=; font-size: 10.5pt,10.5pt]So[size=; font-size: 10.5pt,10.5pt]注入检测
[font="][size=; font-size: 10.5pt,10.5pt]由于实现比较简单,就不贴代码,直接阐述原理吧。[size=; font-size: 10.5pt,10.5pt]SO[size=; font-size: 10.5pt,10.5pt]注入检测原理:读取当前进程的[size=; font-size: 10.5pt,10.5pt]maps[size=; font-size: 10.5pt,10.5pt]文件, 遍历每一行, 是否进程中使用[size=; font-size: 10.5pt,10.5pt]so[size=; font-size: 10.5pt,10.5pt]名中包含关键[size=; font-size: 10.5pt,10.5pt]"hack|inject|hook|call" [size=; font-size: 10.5pt,10.5pt]的信息,[size=; font-size: 10.5pt,10.5pt]“[size=; font-size: 10.5pt,10.5pt]hack|inject|hook|call[size=; font-size: 10.5pt,10.5pt]”[size=; font-size: 10.5pt,10.5pt] 字符信息使用[size=; font-size: 10.5pt,10.5pt]Base64[size=; font-size: 10.5pt,10.5pt]加密, 如下:
[font="]
分析结论和安全建议:
[size=; font-size: 10.5pt,10.5pt][font="]结论:
[font="][size=; font-size: 10.5pt,10.5pt]1.[size=; font-size: 10.5pt,10.5pt]支付宝的[size=; font-size: 10.5pt,10.5pt]Xposed hook [size=; font-size: 10.5pt,10.5pt]检测原理:[size=; font-size: 10.5pt,10.5pt] [size=; font-size: 10.5pt,10.5pt]Xposed Hook [size=; font-size: 10.5pt,10.5pt]框架将[size=; font-size: 10.5pt,10.5pt]Hook[size=; font-size: 10.5pt,10.5pt]信息存储在[size=; font-size: 10.5pt,10.5pt]fieldCache, methodCache,constructorCache[size=; font-size: 10.5pt,10.5pt] 中, 利用[size=; font-size: 10.5pt,10.5pt]java [size=; font-size: 10.5pt,10.5pt]反射机制获取这些信息,检测[size=; font-size: 10.5pt,10.5pt]Hook[size=; font-size: 10.5pt,10.5pt]信息中是否含有支付宝[size=; font-size: 10.5pt,10.5pt]App[size=; font-size: 10.5pt,10.5pt]中敏感的方法,字段,构造方法。
[font="][size=; font-size: 10.5pt,10.5pt]2.[size=; font-size: 10.5pt,10.5pt]支付宝的[size=; font-size: 10.5pt,10.5pt]SO[size=; font-size: 10.5pt,10.5pt]检测原理[size=; font-size: 10.5pt,10.5pt]: [size=; font-size: 10.5pt,10.5pt]检测进程中使用[size=; font-size: 10.5pt,10.5pt]so[size=; font-size: 10.5pt,10.5pt]名中包含关键[size=; font-size: 10.5pt,10.5pt]"hack|inject|hook|call" [size=; font-size: 10.5pt,10.5pt]的信息。
[font="][size=; font-size: 10.5pt,10.5pt]3.[size=; font-size: 10.5pt,10.5pt]支付宝的[size=; font-size: 10.5pt,10.5pt]Root[size=; font-size: 10.5pt,10.5pt]检测: 是否含有[size=; font-size: 10.5pt,10.5pt]su[size=; font-size: 10.5pt,10.5pt]程序和[size=; font-size: 11pt,11pt]ro.secure[size=; font-size: 11pt,11pt]是否为[size=; font-size: 11pt,11pt]1
[size=; font-size: 10.5pt,10.5pt][font="]安全建议:
[font="][size=; font-size: 10.5pt,10.5pt]像[size=; font-size: 10.5pt,10.5pt]这些 [size=; font-size: 10.5pt,10.5pt]"de.robv.android.xposed.XposedHelpers","fieldCache","methodCache","constructorCache" [size=; font-size: 10.5pt,10.5pt]想这些敏感字符串信息可以进行一些简单加密。防止用户直接根据关键字搜索找到关键函数。
[font="][size=; font-size: 10.5pt,10.5pt]同时对[size=; font-size: 10.5pt,10.5pt]dex[size=; font-size: 10.5pt,10.5pt]相关内容进行加密,[size=; font-size: 10.5pt,10.5pt]DEX[size=; font-size: 10.5pt,10.5pt]加密之后反编译的难度大大增加,这里支持下朋友公司几维安全的[size=; font-size: 10.5pt,10.5pt]APK[size=; font-size: 10.5pt,10.5pt]加密产品,欢迎大家体验他们的移动加密产品 kiwisec.com/product/compiler.shtml(选中打开链接,或者百度搜索:几维安全)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。