大家好,为了能与开发者们共同进步,我们今年会新增一个技术专栏,持续分享SDK、前端、数据等相关内容。希望可以和大家一起深入探讨,共同进步。
今天来跟大家分享终端Hook技术。
终端上的Hook技术从编译/构建阶段到应用进程内运行时,再到操作系统底层,种类多种多样。如静态编译期间的ASM、Javassist、AspectJ等,运行期间的ART/Dalvik虚拟机Hook、GOT/PLT Hook、Inline Hook等等。
目前友盟+SDK使用Hook技术主要应用于UAPM、反作弊和合规场景中。
HOOK是什么?
Hook又叫“钩子”,是一项历史悠久的技术。早在PC时代,Hook技术就已存在,并和反Hook技术不断相互促进和迭代。在移动端,Hook技术最早应用于安全领域,后续随着移动端发展慢慢也应用和渗透到了其他业务领域。
Android平台Hook技术比较复杂且多样,下面是从App编译/构建期间到上线运行时整个生命周期为线索,汇总和梳理目前不同方式的Hook技术。
从编译阶段将源码编译构建成目前产物(如.apk),到运行时阶段从应用层->Framework层->Native层+Runtime层->linux+kernel层。整个流程中涉及到的Hook技术切点。比如编译期hook(静态hook)、运行时hook(动态hook)、java层hook、native层hook甚至系统层hook。
Hook应用场景
在移动端,Hook的应用场景多种多样,这里列举几个SDK业务涉及的应用场景。
APM启动监控中的插桩实现-利用ASM方式实现的hook
实现效果
Hook技术应用到APM启动分析中,通过ASM方式实现启动监控中的代码插桩。
使用Hook技术前,需要手动埋点方式实现启动分析,埋点代码如下