资讯专栏INFORMATION COLUMN

Xposed插件开发进阶篇

URLOS / 1476人阅读

摘要:基础移步孵化器系统中,所有的应用程序进程以及系统服务进程都是由进程孕育出来的进程对应的程序是框架中真正起作用的是对方法的。因为工作原理是在目录下替换文件在的时候需要权限但是运行时不需要权限。

基础移步:http://www.codefrom.com/paper/Xposed%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%...

Dalvik 孵化器 Zygote (Android系统中,所有的应用程序进程以及系统服务进程SystemServer都是由Zygote进程孕育/fork出来的)进程对应的程序是/system/bin/app_process. Xposed 框架中真正起作用的是对方法的 hook。

因为 Xposed 工作原理是在/system/bin 目录下替换文件,在 install 的时候需要 root 权限,但是运行时不需要 root 权限。

log 统一管理,tag 显示包名

Log.d(MYTAG+lpparam.packageName, "hello" + lpparam.packageName);

植入广播接收器,动态执行指令

    findAndHookMethod("android.app.Application", lpparam.classLoader, "onCreate", new XC_MethodHook() {
        @Override
        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {

            Context context = (Context) param.thisObject;
            IntentFilter filter = new IntentFilter(myCast.myAction);
            filter.addAction(myCast.myCmd);
            context.registerReceiver(new myCast(), filter);

        }

        @Override
        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
            super.afterHookedMethod(param);
        }
    });

context 获取(关于 context可见http://www.codefrom.com/paper/Android.Context)

fristApplication = (Application) param.thisObject;

注入点选择 application oncreate 程序真正启动函数 (该类有可能被重写,所以通过反射得到 oncreate 方法)

String appClassName = this.getAppInfo().className;
        if (appClassName == null) {
            Method hookOncreateMethod = null;
            try {
                hookOncreateMethod = Application.class.getDeclaredMethod("onCreate", new Class[] {});
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
            hookhelper.hookMethod(hookOncreateMethod, new ApplicationOnCreateHook());

排除系统 app,排除自身,确定主线程

if(lpparam.appInfo == null || 
                (lpparam.appInfo.flags & (ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) !=0){
            return;
        }else if(lpparam.isFirstApplication && !ZJDROID_PACKAGENAME.equals(lpparam.packageName)){

hook method

Only methods and constructors can be hooked,Cannot hook interfaces,Cannot hook abstract methods
只能 hook 方法和构造方法,不能 hook 接口和抽象方法

参数中有 自定义类

public void myMethod (String a, MyClass b) 

通过反射得到自定义类...

注入后反射自定义类

Class hookMessageListenerClass = null;

hookMessageListenerClass = lpparam.classLoader.loadClass("org.jivesoftware.smack.MessageListener");

findAndHookMethod("org.jivesoftware.smack.ChatManager", lpparam.classLoader, "createChat", String.class , hookMessageListenerClass ,new XC_MethodHook() {
    @Override
    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {

        String sendTo = (String) param.args[0];
        Log.i(tag , "sendTo : + " + sendTo );

    }

    @Override
    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
        super.afterHookedMethod(param);
    }
});

hook 一个类的方法,该类是子类并且没有重写父类的方法,此时应该 hook 父类还是子类.(hook 父类方法后,子类若没重写,一样生效.子类重写方法需要另外 hook)

例如
java.net.HttpURLConnection extends URLConnection ,

方法在父类

javapublic OutputStream getOutputStream() throws IOException {
        throw new UnknownServiceException("protocol doesn"t support output");
 }

org.apache.http.impl.client.AbstractHttpClient extends CloseableHttpClient ,方法在父类(注意,android的继承的 AbstractHttpClient implements org.apache.http.client.HttpClient)

javapublic CloseableHttpResponse execute(
        final HttpHost target,
        final HttpRequest request,
        final HttpContext context) throws IOException, ClientProtocolException {
                return doExecute(target, request, context);
}

android.async.http复写HttpGet导致zjdroid hook org.apache.http.impl.client.AbstractHttpClient execute 无法获取到请求 url和method

hook 构造方法

javapublic static XC_MethodHook.Unhook findAndHookConstructor(String className, ClassLoader classLoader, Object... parameterTypesAndCallback) {
            return findAndHookConstructor(findClass(className, classLoader), parameterTypesAndCallback);
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/12262.html

相关文章

  • 深入解析阿里Android热修复技术原理

    摘要:不过它确实各方面都做了大量的优化,本文中的很多知识点也来源于阿里的热修复技术原理一书,本书值得一读,里面就是基于框架来编排的。 前言;本文框架什么是热修复?热修复框架分类技术原理及特点Tinker框架解析各框架对比图总结通过阅读本文,你会对热修复技术有更深的认知,本文会列出各类框架的优缺点以及技术原理,文章末尾简单描述一下Tinker的框架结构。 一、什么是热修复?1.正常开发流程showI...

    番茄西红柿 评论0 收藏0
  • 深入解析阿里Android热修复技术原理

    摘要:不过它确实各方面都做了大量的优化,本文中的很多知识点也来源于阿里的热修复技术原理一书,本书值得一读,里面就是基于框架来编排的。 前言;本文框架什么是热修复?热修复框架分类技术原理及特点Tinker框架解析各框架对比图总结通过阅读本文,你会对热修复技术有更深的认知,本文会列出各类框架的优缺点以及技术原理,文章末尾简单描述一下Tinker的框架结构。 一、什么是热修复?1.正常开发流程showI...

    fsmStudy 评论0 收藏0
  • 安卓新建项目 - 收藏集 - 掘金

    摘要:经也要热更新掘金本文同步自的地方酒馆好久没写博客了。好了,说了这么多还没见到图从零开始搭建一个项目第章掘金鸡汤成功其实很简单,定下一个合理的计划,然后坚持按照计划执行。 用RecyclerView展示错误和空白界面 附加详情界面实践-MultiItem进阶 | 掘金技术征文 - 掘金前言 本文是MultiItem系列的进阶文章,讲解如何展示空白、错误等状态页,这个功能比较常用,实现的思...

    Sanchi 评论0 收藏0
  • xposed环境搭建入门

    摘要:作为老牌工具在程序员心目中有着很高的地位,不论你是拿来学习,还是让程序运行得更符合自己心意,还是做点小恶作剧都是不二之选,这篇文章先整理下入门环境搭建,后面会有更多破解和反破解的文章分享给大家。新建一个空工程。 xposed作为老牌hook工具在程序员心目中有着很高的地位,不论你是拿来学习,还是让程序运行得更符合自己心意,还是做点小恶作剧都是不二之选,这篇文章先整理下入门环境搭建,后面...

    lpjustdoit 评论0 收藏0
  • 安卓动态调试七种武器之离别钩 – Hooking(下)

    摘要:是否修改成功可以通过查看随后我们需要确定目标函数的地址,这个有两种方法。如果目标程序本身没有被的话,那些都是存在的,因此可以使用和等方法来获取目标函数地址。 0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是万能的。另外工具是死的,人是活的,如果能搞懂工具的原理再结合上自身的经验,你也可以创造出属于自己的调试武器。因此,笔者将会在这一系列...

    laznrbfe 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<