矛盾的同一性与斗争性原理简直实用于所有攻防反抗。
上期,咱们在《论设施指纹的唯一性:始于硬件 ID,终于云端交互》一文中曾介绍了硬件 ID 作为设施指纹的根底属性的倒退演变——即当硬件属性不再作为设施指纹的惟一属性时,为了保障设施指纹的唯一性须要在硬件 ID 的根底上减少更多辨认规范以及动静可变的算法,事实上这就是攻防反抗的典型例子。
再举个例子。
例如在设施指纹的攻防反抗中,黑灰产要想绕过设施指纹进行攻打,就必须“假装”本人。此时,黑灰产的绕过思路次要有以下两种:
1、如何把一个设施变成多个设施:比方,在刷单场景下,让 App 重复认为这是一个新手机,从而反复支付新人红包;
2、如何把一个设施变成另一个设施:比方,在身份认证的场景下,把攻击者的手机伪造受害者的手机,让 App 登入受害者的账户,窃取资金、用户信息等。但有矛就有盾,黑灰产的绕过思路天然也逃不过平安研究者的“法眼”。
明天,咱们就以 Hook 的攻防反抗为主题,讲讲攻防反抗的思路。
初识 Hook 技术
首先,简略意识下 Hook 技术。Hook 技术是一门宽泛用于计算机攻防反抗的技术。它能够监视系统或者过程中的各种事件音讯,截获发往指标窗口的音讯进行解决。
咱们能够简略的把应用 Hook 技术的人比作钓鱼人,而 Hook 技术就像他的渔具,零碎中一直传递的事件就像一条条游鱼,钓鱼人通过 Hook 技术将他想要的指标事件钓上(Hook 技术个别是有指向性的),而后就能够对事件进行批改,再让其失常运行,达到技术人员的目标。
Hook 技术罕用于热补丁上线、API 劫持、软件破解等技术操作。比方咱们常见的鼠标和键盘,如果你的电脑被 Hook,那么也就意味着你的任何操作都在对方的把握中。
Hook 技术岂但实用于 x86 零碎,也实用于基于简略指令集的挪动平台零碎,比方手机等设施。其中,针对挪动设施的 Hook 技术次要以手机为主。
对于 Android 的 Hook 框架,次要分为三类,一类是针对 Native 层,即零碎层的 Hook 框架,应用 PLT/GOT Hook 或 inline-Hook 的框架,如 bhook、xhook、yahfa 等,一类是针对 Java 层的 Hook 框架,如 Xposed,还有一类是比拟非凡的 Hook 框架——Frida,它是针对全平台 Hook 而设计的框架,实用于 x86\x86_64\arm\arm64 架构的零碎,在 iOS 端上的 Hook 次要通过 Frida 框架进行技术实现,而 Frida 在 Android 上的 Hook 技术实现也有不少的受众,但次要仍以 Xposed 类框架为主,次要起因就是 Xposed 在 Andorid 上的稳定性更好,并且特色更容易暗藏。
接下来,咱们就以 Xposed 以及以 Xposed 为外围迭代的另外两种 Hook 框架(Edxposed、Lsposed)开展来讲讲如何利用 Hook 进行攻防反抗。
未知其攻,焉知何守——利用 Hook 技术怎么做攻打?
随着安卓版本的迭代更新,Xposed 框架也随之迭代出了新的 Hook 框架。
目前安卓平台的次要 Hook 框架以 Lsposed 为主,咱们就以 Lsposed 对 Android 利用进行 Hook,看下如何利用 Hook 进行攻打。首先,失常状况下应用 Lsposed 须要几个前置条件:
一台可能解除 BootLoaderLock 的手机;
筹备好本人手机零碎的 boot.img;
筹备好 Lsposed 模块安装包与 Magisk 安装包;
一台装好 ADB 工具的电脑。
上述条件筹备实现后,筹备装置和应用 Lsposed。装置实现后,咱们就能够利用 Hook 进行攻打。
具体过程如下:
1、对指标 App 进行反编译剖析。要想让鱼上钩就必须晓得鱼的属性。所以胜利装置 Hook 的第一步就是对指标 App 进行反编译剖析。这里咱们应用 jadx-gui 对 App 进行反编译剖析。
actf 反编译
利用 jadx-gui 能够看到反编译出的源码。如下图所示,通过对该 App 反编译咱们得出了其想要传递 Flag 的动作,但要留神的是,这个信息是一个不确定的值,咱们须要进一步验证。
actf 运行后果
通过验证可知,无论你点击按钮多少次,这里都会只显示“你还真信点击就有 flag 啊?”这条信息。那么,接下来,就是咱们要本人把握本人“抓鱼”的过程。
2、编写代码插件,攻打指标 App 的“弱点”此时,咱们须要编写一个 Hook 插件,批改其中的一些参数,而后能够间接获取其曾经算好的 MD5 值(MD5 是一种加密算法。又名:不可逆加密算法。因为加密算法太强大,专门用来加密明码。MD5 的值就是对任何一个文件的明文明码进行加密后的明码,又称“数字指纹”,任何人对文件做了任何改变,其 MD5 值也就是对应的“数字指纹”都会发生变化。)是什么。
首先咱们能够应用 Android Studio 或者曾经装有 Android 插件的 Idea,关上一个新的我的项目,抉择一个没有界面的工程:
新建 hook 工程
须要留神的是,在写 Xposed Hook 模块时,为了让 Xposed 框架辨认,须要在我的项目的 assets 目录下(如果没有,能够间接新建 assets 目录)创立一个叫做 xposed_init 的文件,并且外面的内容为你的包名 + 你的主类名:
包名与主类名
xposed_init 配置
其次,关上 AndroidManifest.XML 文件,在其中填入如下内容:
AndroidManifest.xml 我的项目地位
AndroidManifest.xml 配置
配置完 AndroidManifest.xml 后,咱们就能够开始编写 Xposed Hook 模块了。具体如图:
build.gradle 在我的项目中的地位
build.gradle 的配置
在 Xposed 中,Hook 的办法有两种,一种是 before,另一种是 after,其实现的原理是通过 art 的 slot 实现的,能够在原先被调用的办法前后退出两个插槽,而后去执行咱们的 hook,能够形象的了解为下图:
Hook 前后办法调用的变动
由图可知,指标 App 次要是有两局部组成,第一个是 MainActivity 主类,还有两个类中的办法,一个是 onCreate 办法,这是 MainActivity 初始化的一个办法,第二个就是 getFlag 办法,这个办法也就是咱们的指标,通过 Hook 这个办法,咱们能够得悉代表 flag 的 MD5 值是什么。
咱们的思路就是要先 Hook 住 getFlag 这个办法,假如咱们 Hook 住了 getFlag 这个办法,咱们最关怀的天然是传入的字符串值,具体的 Xposed 模块代码如下:
Hook 模块代码
通过这种形式咱们就能够失去咱们想要的 MD5 值,进而批改参数,实现对该 App 的管制。
如何反抗 Hook 攻打?
正所谓有矛就有盾。针对 Hook 攻打,也衍生出了进攻的形式。因为 Xposed 在 Hook 的时会调用特定的 ClassLoader,那么就能够通过再次加载 ClassLoader 的形式来检测 Xposed 框架,例子如下:
查找 ClassLoader
1、利用零碎的 API getInstancesOfClassesMethod 去取得 ClassLoader,通过这种形式只能取得一次 CL,咱们就能够遍历 App 内所应用的 Classloader。
2、将所有的 CL 遍历后,咱们就能够通过它的成员缓存(指标 Hook 办法缓存)来检测它的 Hook。
取得 Hook 的成员
Hook 成员
这种检测形式依赖 Android 零碎提供的 VMDebug.getInstancesOfClassesMethod() 函数,而这个函数只在 Android 9-11 上存在,限度计划的利用范畴。并且,作为一种反检测办法,这个要害函数也能够被 Xposed 进行 hook,只需管制此函数的返回即可实现反检测。
除了 ClassLoader 形式对 Xposed Hook 的反抗,也还有其余各类较传统的反抗形式,但也都有相应的拥护抗计划,而顶象产品具备独有的反抗形式,并且追加了反检测、拥护抗技术,能够更精确地辨认 Hook 危险。
当然,在更深层面,咱们也能够利用 Hook 技术将传统的 Web 攻打技术带入到挪动端中,在挪动端中进行攻防演练,补全作为红队的技能树,也能够针对 Hook 技术与攻击者进行反抗,保障本身的 App 平安。整体来看,攻防反抗是一个持久战,须要平安厂商们继续一直的致力。
在攻防反抗方面,顶象基于多年来的技术积攒,目前已实现对安卓、iOS、H5、小程序等全方位的平安爱护,无效进攻调试、注入、多开、内存 Dump、模拟器、二次打包和日志泄露等攻打威逼。独有“蜜罐”性能、爱护 Android 16 种数据和文件,提供 7 种加密模式,率先反对对 iOS 免源码加固。