android免root hook框架legend
一、前言
Android中hook框架已经非常多了,最优秀的当属Xposed和Substrate了,这两个框架我在之前的文章都详细介绍过了,不了解的同学,可以转战这里:http://www.wjdiankong.cn;但是这两个框架用于破解逆向是非常有用的,可惜他们最大的局限性就是需要root权限,这个几乎现阶段可能阻碍了很多产品的商业化,毕竟国内人的安全意识越来越高了。所以这里就需要借助一个免root的hook框架了。而对于免root的框架最大的好处就在于无需root权限,但是弊端就是只能hook自身,对于系统其它app无能无力,就有人好奇了,只能hook自己有个卵用,的确是没什么用,但是也并非一点用都没有。
二、免root的hook功能用途
关于Android中的Hook机制,我在之前已经说得非常详细了,大致就两个方式:
第一个方式:root权限,直接hook系统,可以干掉所有app。
第二种方式:免root权限,但是只能hook自身。
对于免root权限只能hook自身,并非一点用都没有,比如我之前介绍到的自动破解签名校验工具kstools,就是借助这个原理实现,不了解原理的同学可以看这里:Android中自动破解签名校验工具kstools,我们在破解逆向app的时候,需要反编译,二次打包,那么这时候其实我们想针对于这个app做点手脚,就可以借助这个技术,比如现在想改一个app,使得他获取系统的imei值是随机的,有这种需求的,有的游戏有的功能会用设备的imei值做唯一处理,随机imei值的话就可以跳过这个功能了。那么这时候我们可以反编译这游戏,在游戏入口处加上hook代码,即hook游戏自身的imei值即可,这就是需求,只需要hook这一款游戏即可。这样无需在用xposed来编写外挂了。游戏二次打包即可使用了。
三、以往hook框架原理分析
那么其实免root进行hook功能在之前我已经介绍过了一款阿里的开源框架Dexposed了,不过这个框架已经废弃了,取而代之的是AndFix,原理很简单在native层把Java层的方法强制改成native类型,然后在将方法的native标志指向自定义的native函数即可。这样原来的方法就会走到自定义的native函数中,这个框架是非常优秀的AOP框架,可惜兼容性问题不能继续维护了。取而代之的是AndFix,关于它的原理就更简单了,他没有了AOP功能,直接将原始方法和自定义的新方法信息进行对换,这样原来方法执行的逻辑就是新的方法了。这个框架主要用于热修复,所以没必要需要AOP功能了。而今天介绍的这款框架原理也是类似,只不过觉得比较好的是,他把大部分的功能都放到了Java层,这样的兼容性就非常好了,而且自身的兼容也很优秀。
四、Legend框架原理分析
下面就来介绍一下他的原理,代码量不是很多,框架下载地址可以去github上:https://github.com/asLody/legend,下载下来直接运行就ok了,我们继续来分析它的代码吧:
进入这个方法查看:
到这里我们会发现,他是编译传入进来的class类,然后编译他所有用到了Hook注解的方法,获取其需要hook的方法信息,具体样式为:类名::方法名@参数1#参数2#...
然后解析完了注解获取方法签名信息之后,开始调用hookMethod进行hook操作:
这里看到,每个hook方法必须是static类型的,然后会区分是art还是dalvik的,分别处理,这里直接分析dalvik方法,后面的代码是有一个缓存池,用于缓存每次替换完之后的原始方法信息,为了后面会调用原始方法功能。下面继续来看dalvik方法的hook代码:
这里首先会获取原始方法和hook新方法对应的dalivk的数据结构信息,这个就是框架的核心点了,关于dalivk对应的方法结构体信息大致如下:
- accessFlags: 各个不同标志位表示此方法的多个属性,其中标志位0x00000100表明此方法是native的
- registersSize: 该方法总共用到的寄存器个数,包含输入参数所用到的寄存器,还有方法内部另外使用到的寄存器,在调用方法时会为其申请栈内存
- outsSize: 该方法调用其他方法时使用到的寄存器个数,注意:只有此方法为非native方法时,此值才有效.
- insSize: 该方法输入参数用到的寄存器个数(registersSize包含此值)
- insns: 若方法类型为1,这里指向实际的字节码首地址;若方法类型为2,这里指向实际的JNI函数首地址;若方法类型为3,这里为null
- jniArgInfo: 当方法类型为2时有效,记录了一些预先计算好的信息(具体信息格式与实际CPU架构有关,但总是包含返回值类型),从而不需要在调用的时候再通过方法的参数和返回值实时计算了,提高了JNI调用的速度。如果第一位为1(即0x80000000),则Dalvik虚拟机会忽略后面的所有信息,强制在调用时实时计算
- nativeFunc: 若方法类型为1,此值无效;若方法类型为2,这里指向dvmCallJNIMethod;若方法类型为3,这里指向实际的处理函数(DalvikBridgeFunc类型)
五、案例用法
android免root hook框架legend的更多相关文章
- Android中免root的hook框架Legend原理解析
一.前言 Android中hook框架已经非常多了,最优秀的当属Xposed和Substrate了,这两个框架我在之前的文章都详细介绍过了,不了解的同学,可以转战这里:http://www.wjdia ...
- Android免Root无侵入AOP框架Dexposed
Dexposed框架是阿里巴巴无线事业部近期开源的一款在Android平台下的免Root无侵入运行期AOP框架,该框架基于AOP思想,支持经典的AOP使用场景,可应用于日志记录,性能统计,安全控制,事 ...
- Dexposed:android免Root无侵入Aop框架
在网上看到了阿里推出的一个android开源项目,名为Dexposed, 是一个Android平台下的无侵入运行期AOP框架.旨在解决像性能监控.在线热补丁等移动开发常见难题,典型使用场景为: AOP ...
- Android 免Root实现Apk静默安装,覆盖兼容市场主流的98%的机型
地址:http://blog.csdn.net/sk719887916/article/details/46746991 作者: skay 最近在做apk自我静默更新,在获取内置情况下,或者已root ...
- android免root兼容所有版本ui调试工具
SwissArmyKnife是什么 SwissArmyKnife 是一款方便调试android UI的工具,可以兼容所有android版本,不需要root权限.可以直接在android手机屏幕上显示当 ...
- Android Hook框架adbi的分析(2)--- inline Hook的实现
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/74452308 一. Android Hook框架adbi源码中inline Hoo ...
- Android Hook框架adbi的分析(1)---注入工具hijack
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/74055505 一.Android Hook框架adbi的基本介绍 adbi是And ...
- Android平台dalvik模式下java Hook框架ddi的分析(1)
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/75710411 一.前 言 在前面的博客中已经学习了作者crmulliner编写的, ...
- Android Hook框架adbi源码浅析(一)
adbi(The Android Dynamic Binary Instrumentation Toolkit)是一个Android平台通用hook框架,基于动态库注入与inline hook技术实现 ...
随机推荐
- 2基本类型数组和枚举类型——重拾Java
2.1 标识符和关键字 2.1.1标识符 标识符:用来标志类名.变量名.方法名.类型名.数组名.文件名的有效字符序列称为标识符.简单地说,标识符就是一个名字. Java关于标识符的语法规则 标识符由字 ...
- Fiddler 捕获 nodejs 模拟的http请求
1.设置Fiddler Tools->Options-> Connections Allow remote computers to connect: 2.nodejs 请求有多种 2.1 ...
- 关于HSTS安全协议的全面详细解析
HTTP 严格传输安全(HSTS)是一种安全功能,web 服务器通过它来告诉浏览器仅用 HTTPS 来与之通讯,而不是使用 HTTP.HSTS是网站从HTTP到HTTPS中网站性能及安全优化非常重要的 ...
- Codeforces 1136E Nastya Hasn't Written a Legend (线段树教做人系列)
题意:有一个数组a和一个数组k,数组a一直保持一个性质:a[i + 1] >= a[i] + k[i].有两种操作:1,给某个元素加上x,但是加上之后要保持数组a的性质.比如a[i]加上x之后, ...
- Bom对象介绍
1.windows对象 1.windows对象 1_1.alert:显示一段消息和确认按钮的弹出的警告框 我们平时用的alert的全称就是 window.alert("hahah" ...
- 如何修改jenkins的启动用户?
如何修改运行jenkins进程的linux帐号? 1.找的jenkins的配置文件,一般是/etc/sysconfig/jenkins 2.修改下面的参数为相应的用户,比如JENKINS_USER=& ...
- 【D3D】Direct3D中LPRECT(上左右底)和LPoint(x,y)之前转换
D3DSprite.cpp void CD3DSprite::DrawText(CD3DFont *pFont, char *szString, RECT &DesRect, D3DCOLOR ...
- Golang之定义错误(errors)
基本示例: package main //定义错误 //error 也是个接口 import ( "errors" "fmt" ) var errNotFoun ...
- PAT 1044 火星数字(20)(思路+代码)
1044 火星数字(20)(20 分) 火星人是以13进制计数的: 地球人的0被火星人称为tret. 地球人数字1到12的火星文分别为:jan, feb, mar, apr, may, jun, jl ...
- Zookeeper 系列(二)安装配制
Zookeeper 系列(二)安装配制 一.Zookeeper 的搭建方式 Zookeeper 安装方式有三种,单机模式和集群模式以及伪集群模式. 单机模式 :Zookeeper 只运行在一台服务器上 ...