抱歉,Xposed真的能够随心所欲——1.基础知识储备

一句话归纳本文php

本节简单介绍了什么是Xposed,基本原理,如何建立一个Xposed项目以及Xposed经常使用的类与方法。java


引言android

前面用Python利用itchat库撸了篇:git

接着小号貌似由于发送信息太频繁和太快,被封了,限制了不能网页端登陆; 又开始折腾AccessibilityService无障碍服务,撸了两篇:github

慢慢地愈加对这些小玩具感兴趣,毕竟实用性强,好玩。在评论和群里都有人提到 过Xposed,我本身以前也有点了解,Xposed并非什么新东西了,好几年前 就有了,之前看到搞机(基)的人都以为很牛逼哄哄,刷系统,root下,改下系统UI, 用各类各样的插件模块改什么什么,屌得不行。(真正屌的是作的那我的而不是用的那个...)api

真正开始学的时候,其实Xposed并无想象中那么复杂,原理和相关的API都很 简单,难的是逆向,怎么去实现你要Hook的功能:反编译,调试输出,堆栈 跟踪,抓包等等,在这个过程当中你须要去分析不少不少东西,猜想调试,有时候 折腾几天可能毫无进展,不过也会收获更多,好比你本身开发APP的时候也会 慢慢开始考虑安全相关的东西~安全

基础就一节,源码分析一节,接着都是实战,另外以前写的Python学习之旅 也不会太监,老规矩,随缘更新~bash

话很少说,开始本系列的教程吧~微信


1.Xposed是什么

一个很牛逼的框架,能够在不修改APK的状况下影响程序的运行,好比: 直接把APP的界面改为本身想要的样子,去掉界面里不喜欢的东西, 自动抢红包,消息防撤回,步数修改等等;简直酷得不行,网上有 不少插件做者开发出来的优秀插件,随手打开Xposed Installer下载 就有不少:app

插件用起来是挺爽的,不过呢,由于Xposed拥有最高权限,若是不法分子 在插件里植入了恶意代码,好比登陆劫持,偷偷采集你的帐号密码发送到 他们的手里,若是涉及到了金钱,就很恐怖啦,因此在使用Xposed插件的时候, 尽可能选那些开源的,并进行代码review,看是否存在恶意代码,再进行安装体验 (开源不必定就没问题,以前有个抢外卖红包的开源项目在里面加了一段挖矿代码, 使人窒息的操做!)

大概简述下Xposed的原理吧,后面有一节会专门研究源码~

Android基于Linux,第一个启动的进程天然是init进程,该进程会 启动全部Android进程的父进程——Zygote(孵化)进程,该进程的启动配置在 /init.rc脚本中,而Zygote进程对应的执行文件是**/system/bin/app_process**, 该文件完成类库的加载以及一些函数的调用工做。在Zygote进程建立后, 再fork出SystemServer进程和其余进程。

而Xposed Framework呢,就是用本身实现的app_process替换掉了系统本来 提供的app_process,加载一个额外的jar包,而后入口从原来的: **com.android.internal.osZygoteInit.main()**被替换成了: de.robv.android.xposed.XposedBridge.main(), 而后建立的Zygote进程就变成Hook的Zygote进程了,然后面Fork出来的进程 也是被Hook过的。这个Jar包在: /data/data/de.rbov.android.xposed.installer/bin/XposedBridge.jar

大概原理就是这样,源码我还没去撸,后面会研究一波,有说错的再回来改。 另外使用Xposed模块是须要Root权限的,怎么Root,安装这个框架, 网上的教程不少,不在本系列研究范围之内!

相关文档

而后是Xposed Installer,因为Android 5.0以上采用ART,而5.0如下默认采用Dalvik, 因此是有两个版本的Xposed,附上下载连接: Android 4.0.3-4.4repo.xposed.info/module/de.r… Android 5.0以上:forum.xda-developers.com/showthread.…

PS:点下面这两个地方便可下载:


2.建立一个Xposed工程

接着演示一波如何建立一个Xposed工程

  • Step 1:新建一个工程,而后修改下AndroidManifest.xml,增长下面的代码:

  • Step 2build.gradle文件添加库依赖

可能会有的疑问:provided只提供编译支持不会写到apk里!!! 别手贱改为compile,装上打开后会报错的!

  • Step 3res/asserts文件夹建立一个xposed_init文件

XposedBridge会从assets 目录中的xposed_init文件中获取入口点,好比个人:

  • Step 4编写咱们的入口点类

在此以前咱们先修改下咱们的MainActivity.java,修改下TextView显示的文字:

代码很简单,就是设置成"渣渣辉"而已,接着编写咱们的Xposed入口类:XposedInit.java

继承了IXposedHookLoadPackage接口,重写了handleLoadPackage方法, 判断了下包名,若是是的,XposedHelpers.findAndHookMethod(), hook掉onCreate()方法,XC_MethodHook()重写afterHookedMethod, 当onCreate()执行后会回调这个方法,在这里得到TextView对象, 把文字修改为"贪玩难约",接着运行,安装后须要重启设备。

重启后,打开应用,查看是否生效:

生效了,log也能看到打印出来的日志:

注意事项

在运行Xposed以前,记得把InstallRun的钩钩去掉哦!

每次运行都须要重启手机哈~ 知道怎么建立一个Xposed项目后,接着就到API解释了!


3.Xposed API相关介绍

PS:发现网上没有什么好的Xposed API的文档啊,这里都是翻阅不少的出来的 网页总结,若是英语好的,建议直接阅读源码注释!!!


1.例子里用到的姿式点

  • IXposedHookLoadPackage接口:App被加载的时候调用,用于App应用的Hook 回调方法是:handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam)

  • XC_LoadPackage.LoadPackageParam:包含与正在加载的应用程序的有关信息。

  • XposedHelpers.findAndHookMethod(要Hook的类,classLoader,方法名,参数,回调对象) Hook一个方法的时候使用,回调对象**XC_MethodHook()**需重写两个方法 beforeHookedMethod(MethodHookParam param):方法调用前执行 afterHookedMethod(MethodHookParam param) 方法调用后执行 注:能够调用param.setResult()设置方法的返回值!

  • MethodHookParam:包含与调用方法有关的信息

比较关注的是这个thisObject,表明调用该方法的对象实例,若是是静态方法 的话,返回一个Null,好比这里调用onCreate()方法的是MainActivity,得到 的天然是MainActivity实例。

接着是获取成员变量,分为私有与非私有变量,非私有直接调用下述方法 便可得到class

Class c = lpparam.classLoader.loadClass("com.coderpig.cpwechatxposed.MainActivity");
Field field = c.getField("tv");
复制代码

若是是私有,则须要先设置访问权限(setAccessible)

Class c = lpparam.classLoader.loadClass("com.coderpig.cpwechatxposed.MainActivity");
Field field = c.getDeclaredField("tv");
field.setAccessible(true);
复制代码

接着调用得到该对象

TextView tv = (TextView) field.get(param.thisObject);
tv.setText("贪玩难约");
复制代码

3.补充姿式点

  • IXposedHookZygoteInit:在Zygote启动时调用,用于系统服务的Hook 回调方法initZygote()

  • IXposedHookInitPackageResources:在资源布局初始化时会回被执行(inflate方法) 回调方法:handleInitPackageResources(XC_InitPackageResources.InitPackageResourcesParam resparam) InitPackageResourcesParam包含两个参数,包名和XResource(资源相关)

有了这个XResource对象,就能够拿到布局资源树了,经过重写hookLayout方法,

LayoutInflatedParam,里面这个view就是布局资源树了,你能够拿到遍历,拿到某个 特定控件,而后作一些骚操做。

XposeHelpers提供了一些辅助方法

  • callMethod(Object obj,String methodName, Object... args):在APP中调用特定方法; 参数依次是:调用方法的所在类,调用方法名,方法参数

  • findClass(String className,ClassLoader classLoader):获取class类实例 参数依次是类名,类加载器

  • findMethodExact:经过反射查找类的成员方法(可setAccessible(true)设置非私有)

  • findConstructorExact:经过反射查找构造函数(一样可设置可访问下性)

  • findAndHookXXX:查找并Hook

  • setXxx:经过反射设置对象数据成员的值

  • setStaticXxx:经过反射设置静态变量的值

  • XposedBridge.log("日志内容"):输入日志和写入到/data/xposed/debug.log Xposed Installer日志那里能够看到!

  • 内部类:经过$符号连接内部类

  • 只能Hook方法与构造方法,不能Hook接口和抽象方法


4.小结

基础的东西大概就这些,后续以为有遗漏的回头补,谢谢~


来啊,Py交易啊

想加群一块儿学习Py的能够加下,智障机器人小Pig

验证经过后会自动发送群聊连接加群连接,点击加入便可 (不要和机器人聊天=-=,就挂着拉人的,有问题到群里讲!)

欢迎各类像我同样的Py初学者,Py大神加入,一块儿愉快地交流学♂习,van♂转py。

相关文章
相关标签/搜索