-
-
[原创]开源字节码插装工具HiBeaver介绍与原理详解
-
发表于:
2017-3-13 11:41
6448
-
[原创]开源字节码插装工具HiBeaver介绍与原理详解
介绍
插装技术是一个古老却又强大的技术,简单来说就是在目标程序代码中某些位置插入一些代码或者修改成一些代码,从而在目标程序运行过程中获取某些程序状态并加以分析。这样说可能有点抽象,我来举个栗子。大家在不同语言的开发过程中可能都用到过一类叫Profiler的工具,开启了Profiler之后跑程序结束后会给一个表,统计哪些函数执行的次数最多,耗时最长,用来性能优化。Profiler工具的实现方法就是在目标程序里的函数开头和结尾都插入监控代码,在运行过程中,这些监控代码会记录目标函数被调用的次数,并且通过一头一尾的时间戳计算被监控的函数的执行时间。收集到的数据经过算算算,就可以出来统计的图表。
有人说:这不就是inline hook技术吗?是的。那我用OllyDbg不是一下子就搞定了?是却不是。插装的工具有很多很多(真的很多,每种语言可能有不止一个),插装的方式也有不少(动态的,静态的,VM的,系统的,硬件的),手工插装在简单分析程序中可能短平快,自动插装却是个学问。如果要写个插装程序去自动插装另一个程序,要考虑到插哪里,插装什么代码,怎么确保目标程序插装后能正常跑起来,怎么确保插装代码不会带来太多性能开销等等等等。这里每一项都是一个小研究领域,避免大家瞌睡,本文暂时略过,如果大家有兴趣之后可以再写一篇学术一点的介绍代码插装的前世今生。
好,回到主题,Android应用的插装。通常开发者以及安全分析人员都希望能够监控APK中某些函数,比如开发人员会关心APP执行到了哪个生命周期函数,消耗多少时间。安全分析人员可能更感兴趣这个APP访问了哪些敏感的信息,比如IMEI和网络。考虑到Android App有native code,字节码,甚至还有Javascript代码,所以设计一个成熟的Android的插装工具要求很高。今天来介绍一下近期开源的字节码插装工具HiBeaver。Github项目网址是:https://github.com/BryanSharp/hibeaver 。目前版本是1.2.3作者更新还挺勤快的。
HiBeaver使用案例
首先HiBeaver是一个Gradle插件,什么鬼?!好吧,HiBeaver被设计成在一个APP编译中后期接入,使用大名鼎鼎的ASM.jar(不知道的去末尾的扩展阅读看看)对Java字节码进行修改的Gradle插件。"Gradle被小伙伴誉为:一个看上去很简单,但深入写起来发现要完蛋的玩意",没办法Gradle是Google Android钦定的构建系统。Gradle是一个主要用来构造Java类程序的构建系统(类似make),构建规则由Groovy代码提供,Gradle提供了一个框架,比如要编译一个Java文件可以用Groovy代码去继承Gradle提供的一个类去做。等等,等等,什么是Groovy?好吧一种比较恶心的Java方言,我们先略过,下面看了就会知道。Google Android给Gradle贡献了一个用于构造Android APP的插件,然后集成在Android Studio里面。下图是完整构建一个Android APP的流程图,好复杂,简单来说就是把Java文件编译成class之后,在用Android的dx工具编译成Dex文件,然后和编译后的资源文件打包成一个APK文件,并进行签名。
HiBeaver同学就是在这个过程中,在dx之前,通过Gradle提供的Transform API(大概在上图的橘黄色的proguard前面),截获产生的.class文件,并且对其中的Java字节码进行修改(通过ASM.jar)。
话不多说,来看看怎么用。需要使用HiBeaver首先要配置Android APP工程的build.gradle文件,添加:
然后在build.gradle开头加上配置信息
然后调用 gradle build
构造APK的过程中,可以看到 Applied HiBeaver
意味着配置成功了,总体来说配置还是非常简单的。
modifyMatchMaps
是这里的重点,也就是插装规则数组,每一条规则包含匹配和动作。“匹配”可以匹配到某个/些类的某个/些函数,然后动作就是具体用ASM.jar插入怎样的代码了,例如以下的例子:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)