前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[Android][Security] Android 逆向之安全防护基本策略

[Android][Security] Android 逆向之安全防护基本策略

作者头像
wOw
发布于 2020-01-20 09:15:45
发布于 2020-01-20 09:15:45
1.4K00
代码可运行
举报
文章被收录于专栏:wOw的Android小站wOw的Android小站
运行总次数:0
代码可运行

对抗反编译

混淆

使用混淆主要可以减小包的大小。混淆对于安全保护来说,只是增加了阅读难度而已。混淆不会把关键代码混淆掉,比如MainActivity,Application等,可以通过分析smali和阅读jar包定位代码。

资源混淆也是换汤不换药,针对加载资源代码getString(2131230929)进行进制转换,变成16进制,从public.xml里面查找对应的资源,就能定位到资源内容。

签名保护

这个是防止二次打包验证,但是,对于java代码的签名保护,可以很容易地进行修改smali代码绕过验证。

手动注册native方法

安全性也不是很高,只是一种会增加破解成本的方式。一般Native方法根据命名规则生成头文件然后写cpp代码,这种方式属于静态注册。手动动态注册是复写JNI_OnLoad方法,在该函数中手动注册方法名和对应的方法签名,方法名可以自定义,这样避免了静态注册的命名规则,让破解者难以根据规律找到要破解的方法。不过破解者可以分析JNI_OnLoad函数的汇编代码找到register函数找到注册的native方法。

反调试检测

IDA进行so动态调试是基于进程的注入技术,然后使用linux中ptrace机制,进行调试目标进程的附加操作。

ptrace机制有一个特点:如果一个进程被调试了,在它进程status文件中有一个字段TracerPid会记录调试者的进程id值

cat /proc/pidxx/status 可以看到TracerPid字段

方法是检测该TracerPid值,大于0就退出。但破解者会通过IDA工具给JNI_OnLoad下断点,检测轮询代码,使用nop指令跳过检测指令。

对抗Xposed

原理

Zygote

Android系统中App进程都是由Zygote进程“孵化”出来的。Zygote进程在启动时会创建一个虚拟机实例,每当它“孵化”一个新的应用程序进程时,都会将这个Dalvik虚拟机实例复制到新的App进程里面去,从而使每个App进程都有一个独立的Dalvik虚拟机实例。

Zygote进程在启动的过程中,除了会创建一个虚拟机实例之外还会将Java Rumtime加载到进程中并注册一些Android核心类的JNI(Java Native Interface,Java本地接口)方法。一个App进程被Zygote进程孵化出来的时候,不仅会获得Zygote进程中的虚拟机实例拷贝,还会与Zygote进程一起共享Java Rumtime,也就是可以将XposedBridge.jar这个Jar包加载到每一个Android App进程中去。安装Xposed Installer之后,系统app_process将被替换,然后利用Java的Reflection机制覆写内置方法,实现功能劫持。下面我们来看一下细节。

Hook和Replace

Xposed Installer框架中真正起作用的是对方法的Hook和Replace。在Android系统启动的时候,Zygote进程加载XposedBridge.jar,将所有需要替换的Method通过JNI方法hookMethodNative指向Native方法xposedCallHandler,这个方法再通过调用handleHookedMethod这个Java方法来调用被劫持的方法转入Hook逻辑。

上面提到的hookMethodNativeXposedBridge.jar中的私有的本地方法,它将一个方法对象作为传入参数并修改Dalvik虚拟机中对于该方法的定义,把该方法的类型改变为Native并将其实现指向另外一个B方法。

换言之,当调用那个被Hook的A方法时,其实调用的是B方法,调用者是不知道的。在hookMethodNative的实现中,会调用XposedBridge.jar中的handleHookedMethod这个方法来传递参数。handleHookedMethod这个方法类似于一个统一调度的Dispatch例程,其对应的底层的C++函数是xposedCallHandler。而handleHookedMethod实现里面会根据一个全局结构hookedMethodCallbacks来选择相应的Hook函数并调用他们的beforeafter函数,当多模块同时Hook一个方法的时候Xposed会自动根据Module的优先级来排序。

调用顺序如下:A.before -> B.before -> original method -> B.after -> A.after。

检测

在做Android App的安全防御中检测点众多,Xposed Installer检测是必不可少的一环。对于Xposed框架的防御总体上分为两层:Java层和Native层。

Java层检测

需要说明的是,Java层的检测基本只能检测出基础的Xposed Installer框架,而不能防护其对App内方法的Hook,如果框架中带有反检测则Java层检测大多不起作用。

下面列出Java层的检测点,仅供参考。

① 通过PackageManager查看安装列表

最简单的检测,我们调用Android提供的PackageManagerAPI来遍历系统中App的安装情况来辨别是否有安装Xposed Installer相关的软件包。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PackageManager packageManager = context.getPackageManager();
List applicationInfoList = packageManager.getInstalledApplications(PackageManager.GET_META_DATA);
for (ApplicationInfo applicationInfo: applicationInfoList) {
    if (applicationInfo.packageName.equals("de.robv.android.xposed.installer")) {
        // is Xposed TODO... }
    }

通常情况下使用Xposed Installer框架都会屏蔽对其的检测,即Hook掉PackageManager的getInstalledApplications方法的返回值,以便过滤掉de.robv.android.xposed.installer来躲避这种检测。

② 自造异常读取栈

Xposed Installer框架对每个由Zygote孵化的App进程都会介入,因此在程序方法异常栈中就会出现Xposed相关的“身影”,我们可以通过自造异常Catch来读取异常堆栈的形式,用以检查其中是否存在Xposed的调用方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try {
    throw new Exception("blah");
} catch(Exception e) {
    for (StackTraceElement stackTraceElement: e.getStackTrace()) {
        // stackTraceElement.getClassName() stackTraceElement.getMethodName() 是否存 在Xposed
    }
}
E/GEnvironment: no such table: preference (code 1): while compiling: SELECT keyguard_show_livewallpaper FROM preference
...
at com.meituan.test.extpackage.ExtPackageManager.checkUpdate(ExtPackageManager.java:127)
at com.meituan.test.MiFGService$1.run(MiFGService.java:41)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5072)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
...
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132) //发现Xposed模块
at dalvik.system.NativeStart.main(Native Method)

③ 检查关键Java方法被变为Native JNI方法

当一个Android App中的Java方法被莫名其妙地变成了Native JNI方法,则非常有可能被Xposed Hook了。由此可得,检查关键方法是不是变成Native JNI方法,也可以检测是否被Hook。

通过反射调用Modifier.isNative(method.getModifiers())方法可以校验方法是不是Native JNI方法,Xposed同样可以篡改isNative这个方法的返回值。

④ 反射读取XposedHelper类字段

通过反射遍历XposedHelper类中的fieldCachemethodCacheconstructorCache变量,读取HashMap缓存字段,如字段项的key中包含App中唯一或敏感方法等,即可认为有Xposed注入。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
boolean methodCache = CheckHook(clsXposedHelper, "methodCache", keyWord);

private static boolean CheckHook(Object cls, String filedName, String str) {
    boolean result = false;
    String interName;
    Set keySet;
    try {
        Field filed = cls.getClass().getDeclaredField(filedName);
        filed.setAccessible(true);
        keySet = filed.get(cls)).keySet();
        if (!keySet.isEmpty()) {
            for (Object aKeySet: keySet) {
                interName = aKeySet.toString().toLowerCase();
                if (interName.contains("meituan") || interName.contains("dianping") ) {
                    result = true;
                    break;
                	} 
                }
            }
		...
    return result;
}
Native层检测

由上文可知,无论在Java层做何种检测,Xposed都可以通过Hook相关的API并返回指定的结果来绕过检测,只要有方法就可以被Hook。如果仅在Java层检测就显得很徒劳,为了有效提搞检测准确率,就须做到Java和Native层同时检测。每个App在系统中都有对应的加载库列表,这些加载库列表在/proc/下对应的pid/maps文件中描述,在Native层读取/proc/self/maps文件不失为检测Xposed Installer的有效办法之一。由于Xposed Installer通常只能Hook Java层,因此在Native层使用C来解析/proc/self/maps文件,搜检App自身加载的库中是否存在XposedBridge.jar、相关的Dex、Jar和So库等文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bool is_xposed()
{
   bool rel = false;
   FILE *fp = NULL;
   char* filepath = "/proc/self/maps";
   ...
   string xp_name = "XposedBridge.jar";
   fp = fopen(filepath,"r")) 
   while (!feof(fp))                                 
   {
       fgets(strLine,BUFFER_SIZE,fp);                    
       origin_str = strLine;
       str = trim(origin_str);
       if (contain(str,xp_name))
       {
           rel = true; //检测到Xposed模块
           break;
       }
   }
	...
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android Hook技术防范漫谈
背景 当下,数据就像水、电、空气一样无处不在,说它是“21世纪的生产资料”一点都不夸张,由此带来的是,各行业对于数据的争夺热火朝天。随着互联网和数据的思维深入人心,一些灰色产业悄然兴起,数据贩子、爬虫、外挂软件等等也接踵而来,互联网行业中各公司竞争对手之间不仅业务竞争十分激烈,黑科技的比拼也越发重要。 随着移动互联网的兴起,爬虫和外挂也从单一的网页转向了App,其中利用Android平台下Dalvik模式中的Xposed Installer和Cydia Substrate框架对App的函数进行Hook这一招
美团技术团队
2018/03/13
2.1K0
Android Hook技术防范漫谈
[Android][Security] Android 逆向之 xposed
我当然不会满足于这么一点浅薄的介绍,既然用这个框架了,那就得把这个框架搞清楚对不?
wOw
2020/01/20
2.5K0
安卓反调试|常见的Xposed框架检测手段与突破方式​
原理:当App获取到系统权限的时候,可以获取系统的所有运行中的App的列表,通过列表发现是否存在有Xposed相关的App(通常都是Xposed Installer相关的Apk,例如de.robv.android.xposed.installer)保持运行状态,一旦存在,就表明用户很有可能存在Hook行为。
云爬虫技术研究笔记
2020/03/25
3.8K0
浅谈android hook技术浅谈android hook技术-- coding:utf-8 --print jscode author = 'gaohe'-- coding:utf-8 --pri
您当前的位置: 安全博客 > 技术研究 > 浅谈android hook技术 浅谈android hook技术 2017年03月17日 10:06 1249 前言 在测试android过程中,能对函数进行hook能帮助更加深入的进行测试,本文简单介绍了hook框架xposed和frida,从简单的小例子做了简单的演示,算是自己的学习的过程,是个入门的过程。
一个会写诗的程序员
2018/08/20
2K0
万物皆可Hook!重新捡起Hook神器-Xposed框架
而是在程序界流传的强大秘技-Hook函数,Hook原意是指钩子,它表示的就是在某个函数的上下文做自定义的处理来实现我们想要的黑科技。 在很多技术领域都存在的这种Hook技术,比如下面这些:
云爬虫技术研究笔记
2019/11/05
3.5K0
万物皆可Hook!重新捡起Hook神器-Xposed框架
Xposed 配置,使用以及原理介绍
在搞逆向的时候,Hook是个很必要的手段,通过Hook就可以了解内部的运行机制,甚至进行修改。对于Hook Java方法,用的比较多的就是Xposed,本篇就介绍下Xposed的配置,使用,原理。
一只小虾米
2022/10/25
2.8K0
Xposed 配置,使用以及原理介绍
xposed模块开发流程
xposed是什么: 必须部署在ROOT后的安卓手机上,通过替换/system/bin/app_process程序控制zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对zygote进程及其创建的dalvik虚拟机的劫持。
bosh123
2021/01/07
3.5K0
android hook介绍
第一章:android hook介绍 第二章:hook之替换View.OnClickListener
李小白是一只喵
2021/02/04
8590
Xposed 3.1.5 首战 之 来场劫持用户输入玩玩吧
理解程度还不够,阅读几次也只是有个印象而已,这次再次拷贝一份,以供阅读此文的小伙伴简单阅读一下:
贺biubiu
2019/06/11
8650
eagleget安卓_android startactivityforresult
Android EagleEye官方介绍在 https://github.com/MindMac/AndroidEagleEye/blob/master/README-zh.md
全栈程序员站长
2022/09/22
4630
Xposed去抖音提示
特别感谢https://www.52pojie.cn/thread-684757-1-1.html 官方教程:https://github.com/rovo89/XposedBridge/wiki/Development-tutorial
ppjun
2018/09/05
1.6K0
《吐血整理》高级系列教程-吃透Fiddler抓包教程(28)-Fiddler如何抓取Android7.0以上的Https包-下篇
虽然依旧能抓到大部分Android APP的HTTP/HTTPS包,但是别高兴的太早,有的APP为了防抓包,还做了很多操作: ① 二次加密 有的APP,在涉及到关键数据通信时,会将正文二次加密后才通过HTTPS发送,我们抓包抓到的是一堆二进制base64 ② 自带HTTP Client 像支付宝那样的变态,自己带了一个基于so的HTTP Client库,对于关键数据,都不走URLConnection和OkHttp,而是走自己的HTTP Client库,甚至一些WebView页面的渲染,都是先用自带的HTTP Client请求得到json数据,然后填到HTML模板里面,再在WebView里渲染出来。 ③ SSL/TLS Pinning,APP自带服务端证书,除了自带证书什么都不信
北京-宏哥
2022/10/28
29.4K0
android 防止反编译的若干方法
第一种方式:混淆策略 混淆策略是每个应用必须增加的一种防护策略,同时他不仅是为了防护,也是为了减小应用安装包的大小,所以他是每个应用发版之前必须要添加的一项功能,现在混淆策略一般有两种: 对代码的
xiangzhihong
2018/02/01
2.7K0
android 防止反编译的若干方法
那些年Android黑科技②:欺骗的艺术
“我的能量无穷无尽,只有强大暗能量才能统治Android界。 受屎吧!!! =≡Σ((( つ•̀ω•́)つ ” -- 来自暗世界android工程师
陈宇明
2020/12/15
8170
那些年Android黑科技②:欺骗的艺术
Android 插件化之Hook机制
Hook 英文翻译过来就是「钩子」的意思,就是在程序执行的过程中去截取其中的信息。Android 操作系统中系统维护着自己的一套事件分发机制,那么Hook就是在事件传送到终点前截获并监控事件的传输。其原理示意图如下:
xiangzhihong
2022/11/30
4120
Android Hook与简单的xposed模块开发实例
Hook是一种在特定事件或操作发生时插入自定义代码的编程技术。在前端开发中,例如Vue和Angular的生命周期钩子,体现了Hook的机制,允许开发者在组件的不同阶段执行代码,提升代码的模块化和可重用性。
阿菇kinoko
2025/01/24
2321
Android Hook与简单的xposed模块开发实例
对运动作弊APP的分析
在网络上获取到一个运动模拟器APP,宣称可以支持对市面上所有运动APP的步数的修改,最终快速实现到你设定的目标步数。
小道安全
2023/10/08
6660
对运动作弊APP的分析
Android逆向分析从入门到深入
学习逆向的初衷是想系统学习Android下的hook技术和工具, 想系统学习Android的hook技术和工具是因为Android移动性能实战这本书. 这本书里用hook技术hook一些关键函数来计算关键函数的调用参数和调用时长, 从而确定性能问题发生的位置和原因. 但目前没有比较系统的讲解hook的书籍, 所以就系统的了解下逆向分析.
用户7118204
2020/03/24
1.3K0
理解 Android Hook 技术以及简单实战
作者:落英坠露 链接:https://www.jianshu.com/p/4f6d20076922 著作权归作者所有,转载请联系作者获得授权。 1. 什么是 Hook Hook 英文翻译过来就是「钩子」的意思,那我们在什么时候使用这个「钩子」呢?在 Android 操作系统中系统维护着自己的一套事件分发机制。应用程序,包括应用触发事件和后台逻辑处理,也是根据事件流程一步步地向下执行。而「钩子」的意思,就是在事件传送到终点前截获并监控事件的传输,像个钩子钩上事件一样,并且能够在钩上事件时,处理一些自己特定的事
用户1269200
2018/04/19
3.1K0
某风控SDK逆向分析
  国内某知名风控SDK,本地从Java层和Native层收集大量设备信息,上传至服务器后生成设备指纹。SDK混淆非常严重,Java层的字符串加密可以被JEB自动解密,影响不大,但是类名和变量名全是0和O只能硬着头皮看
大A
2023/02/14
3.1K0
某风控SDK逆向分析
相关推荐
Android Hook技术防范漫谈
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验