教你三分钟写个Xposed模块

了解Android开发的同学可能听说过Xposed,它的强大可以说是只有你想不到的,没有它做不到的功能。 举个例子, 它可以修改系统的IMEI,手机号,甚至可以说可以让一台小米手机完全变成一台OPPO。

原理

要知道Xposed是怎么做到的,首先要知道它的原理。 它是通过Hook API,替换掉原本的实现逻辑或者数据,来实现自己想要的方法。

看一段代码

XposedHelpers.findAndHookMethod(TelephonyManager.class.getName(), lpparam.classLoader, "getDeviceId", new XC_MethodHook() {
    @Override
    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
        XposedBridge.log("[afterHookedMethod] IMEI");
        param.setResult("12345");
        super.afterHookedMethod(param);
    }
});

上面这段代码,把系统 TelephonyManager的 getDeviceId方法所返回的值,改成了 12345, 这样我们指定的 app调用 getDeviceId的话,就只能拿到 12345了。

实现

实现很简单,我们只需要定义一个入口类,比如叫 MainHook.java,然后让它实现 IXposedHookLoadPackage接口就可以。

public class MainHook implements IXposedHookLoadPackage{
    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
    ....
    }

回调方法 handleLoadPackage会在系统每个app启动的时候回调一下,这时候就给了我们Hook的机会。 我们只需要判断 lpparam是否是我们的目标 app,就可以替换任何我们想要的方法。

一个完整的 Hook入口类demo差不多是这样的

public class MainHook implements IXposedHookLoadPackage{
    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
    if(!lpparam.packageName.equals("target.package")){
        return;
    }
    XposedHelpers.findAndHookMethod(TelephonyManager.class.getName(), lpparam.classLoader, "getDeviceId", new XC_MethodHook() {
        @Override
        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
            XposedBridge.log("[afterHookedMethod] IMEI");
            param.setResult("12345");
            super.afterHookedMethod(param);
        }
    });
    }

上面这个demo,就实现了Hook target.package 这个包名的app的 getDeviceId方法,从而返回我们设定的 12345.

原文发布于微信公众号 - Android每日一讲(gh_f053f29083b9)

原文发表时间:2018-04-13

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏haifeiWu与他朋友们的专栏

I-team 博客全文检索 Elasticsearch 实战

一直觉得博客缺点东西,最近还是发现了,当博客慢慢多起来的时候想要找一篇之前写的博客很是麻烦,于是作为后端开发的楼主觉得自己动手丰衣足食,也就有了这次博客全文检索...

38010
来自专栏程序员叨叨叨

【转-干货】Retrofit2.0使用总结及注意事项

随着Google对HttpClient 摒弃,和Volley的逐渐没落,OkHttp开始异军突起,而Retrofit则对okHttp进行了强制依赖。Retrof...

1.1K20
来自专栏alexqdjay

Springboot 随笔(1) -- 自动引入配置与启动机制

396130
来自专栏Java与Android技术栈

用kotlin打印出漂亮的android日志写在最后

Kotlin号称是Android版本的swift,距离它1.0正式版本的推出快一年了。它像swift一样,可以写客户端也可以写服务端。由于公司项目比较繁忙,我一...

15620
来自专栏Android 研究

Android系统启动——5 zyogte进程(Java篇)

上一篇文章,我们知道在AndroidRuntime.cpp的start()函数里面是调用的Zygoteinit类的main()函数,那我们就继续研究

30520
来自专栏chenssy

【死磕 Spring】----- IOC 之 IOC 初始化总结

前面 13 篇博文从源码层次分析了 IOC 整个初始化过程,这篇就这些内容做一个总结将其连贯起来。

11240
来自专栏肖蕾的博客

OKHttp3(支持Retrofit)的网络数据缓存Interceptor拦截器

44430
来自专栏求索之路

四大组件以及Application和Context的全面理解

1.概述 ? Context抽象结构 2.用处 1.Context的实现类有很多,但是ContextImpl(后称CI)是唯一做具体工作的,其他实现都是对CI做...

49450
来自专栏刘望舒

Android深入四大组件(一)应用程序启动过程

前言 在此前的文章中,我讲过了Android系统启动流程和Android应用进程启动过程,这一篇顺理成章来学习Android 7.0的应用程序的启动过程。分析应...

30970
来自专栏向治洪

系统捕获异常并发送到服务器

大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个...

21070

扫码关注云+社区

领取腾讯云代金券