专栏首页difcareer的技术笔记Android平台基于异常的Hook实现[转载]

Android平台基于异常的Hook实现[转载]

转自游戏安全实验室

Android下面有很多Hook的思路,如果要获取执行到某地址的寄存器信息或者某地址的访问者信息,那么异常Hook将会是一个较优的手段,本章节会介绍Android平台下异常Hook的方法,包括原理,流程和实际的代码。

1.1 实现原理

利用SIGILL异常去做Hook操作,具体可以是对我们想要的监控的地址设一个非法指令,然后当程序执行到非法指令位置时系统会回调我们预先设定好的异常处理函数,我们在这个异常处理函数里面恢复地址的原指令,获取context信息,然后打印寄存器信息即可。

下面列出各指令集的非法指令:

其实,一般我们为了长时间对某个地址监控,我们恢复目标地址的指令后还需要找时机去改目标地址,为下一次获取信息做准备。那么我们可以在获取到异常后,对目标地址的下一条指令做异常Hook操作,然后在下一个异常来临的时候,在异常处理函数中恢复当前异常指令并重新对目标地址写非法指令,以等待下一次目标地址被调用时获取我们想要的信息。

事实上,我们会通过sigaction这个API来设置SIGILL信号的异常处理函数ExceptionHookHandler。然后在这个函数里面判断到底是目标地址的异常还是目标地址的下一条指令异常,从而根据上面的描述处理不同的逻辑。而到了这里,会出现一个问题,arm指令间的地址都是相差 4 ,所以可以直接取当前偏移 +4去获取下一个地址位置,那么thumb2指令集呢?指令长度的不同令人不知道下一条指令地址是偏移 +2 还是 +4,这就需要去解析当前的指令了。

下面提供一个表格,Thumb2 编码表:

有了这个表,就可以解析出当前指令的长度了,即只有当opcode的[15:13]位为111且[12:11]不为00的情况下,这个指令是32位指令,采用偏移 +4 策略。

其他需要注意的就是写非法指令的时候需要修改对代码段增加写权限。

1.2 实现流程

图1-1 异常Hook流程图

1.3 实现代码

实现的入口函数如下,首先,构建一个sigaction结构体数据,这个结构体选好参数,填入处理函数的函数,然后传到sigaction函数里面,再调用自定义函数WriteillegalInstructionAndSaveOpcode对目标地址做非法写,然后保存原opcode。

下面看看函数ExceptionHookHandler的实现,这个函数会获取第三个参数传来的context,做判断,判断是否为目标地址,如果是的话,打印寄存器信息,恢复指令;如果是目标地址下面一个地址的信息,也恢复下当前opcode,然后重新往目标地址写非法指令,为下一次监听目的地址被执行而Hook。

再来看看WriteillegalInstructionAndSaveOpcode这个函数的实现过程,这个函数会通过地址最低位是否为1来判断是thumb指令或是arm指令,然后修改地址权限,针对不同指令集写不同的非法opcode。

恢复地址的函数ResumetheOrgInstruction大同小异,只不过是把原来被篡改成非法opcode的地址修改回原opcode,这里就不贴代码了。

最后这里会说说getCurAddrInstructionLength这个函数,可以根据之前在实现原理里面提到的方法解析opcode中[15:13]和[12:11]的位去判断当前指令是32bit还是16bit,里面增加了一个断言,只有thumb指令才这样去判断,这个函数返回的是当前指令的长度。 **1.4 ****小结 ** 本文介绍了异常Hook的原理,并通过流程图和代码直观地描述和说明整个异常Hook的执行过程。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 为什么现在要用Gradle?

    又要开启一个新系列了,这个系列我们来学习Gradle,它是一个基于JVM的新一代构建工具,关于Gradle完全可以写一本书,这个系列会针对Android开发来对...

    用户1269200
  • iOS高质量的动画实现解决方案——Lottie

        真心的认为Lottie是一款十分优秀且实用的动画开发库,不只对于iOS和android原生开发者来说其让复杂动画的实现几乎没有成本,对于设计师来说,它的...

    珲少
  • Android启动页黑屏及最优解决方案

    相信做过Android的朋友都知道,当一个APP启动时,界面会首先展示一个白屏或者黑屏,然后再进入欢迎页,稍作停留最后进入APP主页。那么这个黑屏或者白屏到底是...

    用户1269200
  • flutter接入现有的app详细介绍

    接入的方式,我是参考的官方的介绍文档,我这里尝试的是android的接入方式,还算比较顺利。

    brzhang
  • 2015年腾讯移动互联网用户白皮书

    年龄的分布较去年稍有变化,12至35岁年龄段仍是移动互联网的主力用户群,占总用户的82%,其中24至35岁的青壮年段占比较去年有所提升,已基本与12至23岁的青...

    华章科技
  • IDEA 激活方法 原

    1.在网站http://idea.lanyus.com/中获取注册码,填入Activation code中;

    wuweixiang
  • 13个大数据应用案例,告诉你最真实的大数据故事

    大数据真的太神奇了,真的可以让改变一个企业的运营吗?答案是肯定的。大数据目前是当下最火热的词了,你要是不知道大数据这个概念,都不好意思在众人面前开口了。然而实际...

    华章科技
  • 说说程序猿接私活的那些事儿

    现在的程序员大部分肯定不是全能。但移动互联网的火爆,肯给你私活的人,不可能只单单让你做android开发或者ios开发,基本上都是全做,甚至还需要web开发。

    养码场
  • 在Kotlin踩坑无数的他想聊聊:如何完全使用 Kotlin 独立开发 App

    自谷歌宣布Kotlin成为 Android 开发官方支持的语言后,Kotlin的 这门 JVM 语言火速成为众多开发者关注的焦点,“养码场”社群内的养码人对此也...

    养码场
  • ButterKnife原理解析看这篇文章就够了

    ButterKnife 算是一款知名老牌 Android 开发框架了,通过注解绑定视图,避免了 findViewById() 的操作,广受好评!由于它是在编译时...

    用户1269200

扫码关注云+社区

领取腾讯云代金券