Android Hook技术的学习经历分享

2019-01-08 15:33:35 浏览数 (1)

提醒:本文涉及敏感知识,并且与PHP无关。

还记得前两天发送的短文吗?近一段时间一直在看android hook相关的技术,到今天算是入门了吧!

android hook估计听说的人不多。那么关于面向切面编程(aop)大家应该听说过。我再给大家翻译下:

就是当你准备调用某个函数时,比如: print(“Hello World!”) 函数的时候,通过hook技术,在你执行前或者执行后进行一些其它操作,甚至直接替换你这个函数。

是不是听起来很不能理解?在我没有搞明白之前,也觉得简直了,我的方法里边不调用他的代码,他怎么能够执行他的方法?

今天,我告诉你:这是真的。

只讲学习过程

不要激动,今天不打算就开始分享这方面的技术,先来个前凑吧!给大家分享一下这段时间的学习经历,一方面我做一个学习的总结,另一方面也希望你可以从中吸取一些教训经验。

我大概是从4月20来号,因为需要了解android hook技术,并且将它利用到生产中。期间又由于各种其它事情,从5月6号全身心投入,截止到今天,这个任务完成了。

这其中涉及到诸多知识:java、c /c、汇编语法、smali语法、android反编译、android二次打包等等技术。虽然平时我挺爱学习,但是一看要搞这个事情,大部分都是低层的东西,让我也是望而却步,只不过我不干,也找不到第二个人来上,只能迎着头皮上,三个字:就是干。

总结:畏惧很正常,给自己一个干的借口

准备工作

要开始对它的学习,首先得指导它的机制,这方面网络上资料倒是挺多的,我的理解是:

在程序运行时,注入到程序进程中,查找要捕获的方法的地址,然后劫持它,让它跳转到自己的方法来执行,执行完后在返回该处继续程序的逻辑。

原理搞清楚了,可以说就是aop的理念。然后我开始分析这里边的难点:首先是,我怎么注入到程序进程?其次注入进去后,我又该怎么查找地址啊?如果这两件事情完成了,后面的就不难,无非就是提前准备一个准备执行的函数,这个函数应该返回的结果结构跟原函数一样,否则程序后面的逻辑没有办法正确执行。

Google是好帮手

非常感谢这个时代,知识的获取真的太容易了,我找到了相关的诸多信息进行一一了解。确发现很多资料停留在15年以前,而且更多的是只言片语。基本上没有找到完成的在当前环境下可操作的实践操作。这让我有点抓狂,这时候让我想起了:美国人钢铁侠马斯克,被人在造火箭、要上天这事情上的难度有多大?前无古人呢,完全没有可参照的对象(因为他在创造参照)。所以我想我这么简单的事情一定能够搞定,更何况我这好歹还有一些资料,先看吧!

这里有两点值得一提: 1. 遇到问题要想,能有造火箭难?能有上天难? 2. 程序员应该使用 Google

水深火热的7天

5月5号这一天除了看资料,就只是了解了android ndk开发,搭建好环境。写了几个jni开发的demo,搞明白了cmake。这里坑的一个坑就是:资料介绍的都是 ndk-build 构建,而我坚持要用最新最好的工具来做这个事情,因此,资料用 Eclipse ,我用 Android Studio;资料用 ndk-build 构建,我用 CMakeGradle。这期间的坑,谁试过谁知道。 一天下来,基本没什么事情,唯一的好处又复习了一下c 知识。

接下来5月6号,对 hook 的相关技术进行了一个分类整理,学习了android的反编译,二次打包。了解到hook相关框架有两个:xposed、cydia substrate。如果有成熟的技术,我们大家得学会站在前人的肩膀上往前走,一来是自己的实力目前造不了轮子,二来是通过学习前辈的技术是快速的有效的学习路径。然后这里遇到的问题是,我到底选哪一个?他们各自有何优缺?最后选择了 cydia substrate,其实二者完全可以结合起来使用,实现更为强大的功能。选择 cydia substrate 它的原因,是因为它能够对 c/c 层进行hook,这正是我想要的。 虽然感觉找到了方向,但是对如何使用,完全摸不著头脑,根据官网的demo一遍一遍又一遍,全不不成功。而且需要root权限,这不是我想要的。

然后第三天到来了,开始动手写代码,编译自己的so包,利用 substrate 进行hook,由于根据官网的介绍,需要安装一个它的apk,然后需要获取root运行权限,这完全不是我想要的,我分析:我程序是跟随目标程序一起启动的,相当于它就是目标程序的一部分,为什么要root?而且还要安装这个apk,才能用,不是扯淡吗?我不可能为了让用户使用一个app,要求他安装另外一个吧?感觉一切糟糕透了,觉得框架可能满足不了我的需求。看来要自己实现,实现一个不需要root的注入框架。这可让我为难,这个需要的知识功底是相当深厚的,以我现在对系统层面的认知很难做到。这一天就在鼓捣各种编译中艰难渡过。

5月8号休息一天,实在没有头绪,放松一下,买的两本书《Android安全技术揭秘与防范》与《游戏安全——手游安全技术入门》,看了一下这方面的知识,也先不去想hook的事情。

5月9号,在断绝了自己去实现注入框架的念想后,又了解到确实有人通过 substrate 实现无须root的注入功能后,那么证明绝对是可以的,然后开始检查为什么官方文档一定说要安装这个apk,并且需要root权限?后来分析出来:安装apk,它是为了布置一些 substrate 运行的环境,需要root完全是因为hook的层次问题,如果是java层,需要root权限,如果是c/c 层,可以不需要root的,那么我只要能够在安装自己的apk的时候,就完成环境设置工作,并且hook c/c 层次,那么就不需要root。 因此我在编译是,直接将 libsubstrate.so 设置到自己的 lib 环境中,并且将程序根据 MainActivity 一起启动。终于成功实现了hook自己so包中的程序,以及hook操作系统的内置函数。这一天是激动的。

从10号开始到今天,其实都是水到渠成了,关键的问题9号全部攻克。借用该技术实现的一个实际例子:将程序注入到游戏,可以实现游戏加速或者减速。

总结: 1. 先认识问题所在,一个个攻克 2. 开始是最痛苦的,但不要在乎一些细枝末节,随着深入一切都会变的明朗 3. 记得花钱买资料 4. 别光看不动手,没有资料的时候,你知道去尝试所有你认为可能的路径 5. 记录下学习过程中的每一个错,以及解决办法,宝贵的资料 6. 找个方向,验证自己的学习成果

后记

整个这7天,每天睡眠不到6小时,资质太差,唯有勤能补拙! 本文中的hook技术,可以用在很多有价值,提升工作效率、改善代码依赖、增加系统安全上,也可以用在很多灰色产业上。本文涉及的语言:

  • C/C 必须
  • Java 必须
  • Andorid 开发
  • Android NDK 开发
  • arm 汇编,能够看懂
  • smali 汇编,能够看懂,并且简单修改。
  • Python 用来实现自动化的任务(非必需,可自己手动)

其它辅助知识:

  • apktool工具的apk反编译与二次打包使用
  • jadx 反编译apk阅读代码 使用jd-gui 也可以
  • Hopper 工具so包的反编译
  • CMake 脚本的语法
  • Android Studio2.2 开发jni程序
  • Gradle 构建工具了解

文中的诸多技术,被用在了灰色产业上,可能这也是这方面资料上基本只谈理论的原因。

虽然我是一个php开发者,但我在不断学习,想要做这样一个技术人的人生直播,看看最终会停留在哪里?

0 人点赞