矛盾的同一性与斗争性原理简直实用于所有攻防反抗。
上期,咱们在《论设施指纹的唯一性:始于硬件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免源码加固。