前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android Hook技术的学习经历分享

Android Hook技术的学习经历分享

作者头像
大愚
发布2019-01-08 15:33:35
1.5K0
发布2019-01-08 15:33:35
举报
文章被收录于专栏:大愚Talk

提醒:本文涉及敏感知识,并且与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开发者,但我在不断学习,想要做这样一个技术人的人生直播,看看最终会停留在哪里?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大愚Talk 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 只讲学习过程
  • 准备工作
  • Google是好帮手
  • 水深火热的7天
  • 后记
相关产品与服务
云直播
云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档