精华内容
下载资源
问答
  • xposed开发jar包

    2017-04-24 12:25:51
    xposed开发jar包
  • Xposed开发初体验

    2017-10-12 17:24:52
    本篇文章具体是Xposed开发,如何安装Xposed需自行上网查找,本文同步更新于旺仔的个人博客,访问可能有点慢,多刷新几次。Xposed什么是Xposed呢? “Xposed是一个适用于Android的框架。基于这个框架开发的模块可以...

    盗个图

    本篇文章具体是Xposed开发,如何安装Xposed需自行上网查找,本文同步更新于旺仔的个人博客,访问可能有点慢,多刷新几次。

    Xposed

    什么是Xposed呢?

    “Xposed是一个适用于Android的框架。基于这个框架开发的模块可以改变系统和app应用的行为,而不需要修改APK。这是一个很棒的特性,意味着Xposed模块可以不经过任何修改,安装在各种不同的ROM上。Xposed模块可以很容易的开启和关闭。你只需要激活或者禁用Xposed模块,然后重启手机即可。”

    很好理解,就是替换了/system/bin/app_process可执行文件,在启动Zygote时加载额外的jar文件(XposedBridge.jar),并执行一些初始化操作(执行XposedBridge的main方法),从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持,然后我们就可以在这个Zygote上下文中进行某些hook操作。

    前提

    安装Xposed的前提是手机必须root,所以没有root手机的,就不用往下看了。

    开发Xposed项目

    介绍完Xposed,那么接下来我们来开发Xposed的项目。

    创建AS项目

    使用Android Studio创建一个新的项目,具体内容就不详细说了,基本都会创建项目的。

    导入Xposed的api库

    要使用Xposed的东西,就必须导入相对应的api库,

    导入jar包

    首先我们需要下载对应的jar包,然后导入到项目中的Libs文件夹里面,下载api-82-sources.jar,api-82.jar

    注意这里要将compile改为provided,原因是Xposed里已有该jar包内容,再次打包进去会冲突,所以要改为provided

    同时也要将compile fileTree(include: ['*.jar'], dir: 'libs')也改为provided,如果不修改的话,就会导致handleLoadPackage没有回调。

    Provided是对所有的build type以及favlors只在编译时使用,类似eclipse中的external-libs,只参与编译,不打包到最终apk。

    gradle

    当然也可以用gradle导入Xposed,同样将compile改为provided

    
    dependencies {
        provided fileTree(include: ['*.jar'], dir: 'libs')
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        compile 'com.android.support:appcompat-v7:25.3.1'
        compile 'com.android.support.constraint:constraint-layout:1.0.2'
        testCompile 'junit:junit:4.12'
        provided 'de.robv.android.xposed:api:82'
    }

    声明Xposed模块

    创建Xposed项目后,还需要在AndroidMenafest.xml文件里面声明Xposed模块,在application里面添加三个meta-data标签(xposedmodule、xposeddescription、xposedminversion)。

        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <meta-data
                android:name="xposedmodule"
                android:value="true"/>
            <meta-data
                android:name="xposeddescription"
                android:value="Hook log test"/>
            <meta-data
                android:name="xposedminversion"
                android:value="53"/>
        </application>

    xposedmodule

    表示作为Xposed的一个模块

    xposeddescription

    表示对本模块的描述,该描述会显示在安装好后的程序名称下方

    xposedminversion

    表示jar包的最低版本号

    创建hook类

    我们新建一个类,类名随意,然后实现IXposedHookLoadPackage接口,并且重写handleLoadPackage方法,里面就是我们要具体操作的地方。

    package top.jowanxu.xposedtest;
    
    import de.robv.android.xposed.IXposedHookLoadPackage;
    import de.robv.android.xposed.XposedBridge;
    import de.robv.android.xposed.callbacks.XC_LoadPackage;
    
    
    public class Tutorial implements IXposedHookLoadPackage {
    
        @Override
        public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
            XposedBridge.log("=========Loaded app: " + lpparam.packageName);
        }
    }

    声明类的入口

    创建完我们hook类之后,我们需要将该类加载到XposedInstaller中,也就是我们必须声明该类的位置,需要在xposed_init中声明。

    xposed_init文件

    创建assests文件夹

    然后在里面新建一个文件,文件名为xposed_init,没有后缀,然后在里面写入我们刚刚创建的类的完整类名,

    运行

    搞完上面的步骤之后,我们直接run起来,程序跑起来之后,Xposed会提示是否激活

    我们可以在Xposed里面看到我们的我们刚刚创建的项目

    打勾,然后重启

    重启之后然后打开Xposed的日志,点击保存

    然后导出到电脑,搜索一下,就能找到我们自己打印的内容了

    结语

    通过上面的例子我们可以很容易的通过Xposed来对app进行修改,所以使用Xposed需谨慎,不要乱下载一些有后台的模块,指不定那天就把你的帐号密码给泄露出去了。

    展开全文
  • xposed开发9 - 判断xposed是否安装, 模块是否激活 1.判断xposed的package是否存在 public class AppUtils { public static final String PACKAGE_NAME_XPOSED = "de.robv.android.xposed.installer"; public ...

    xposed开发9 - 判断xposed是否安装, 模块是否激活

    1.判断xposed的package是否存在

    public class AppUtils {
        public static final String PACKAGE_NAME_XPOSED = "de.robv.android.xposed.installer";
        public static String getAppVersionName(Context context, String packageName) {
            PackageManager packageManager = context.getPackageManager();
            List<PackageInfo> packageInfos = packageManager.getInstalledPackages(0);
            for (PackageInfo packageInfo : packageInfos) {
                if (packageInfo.packageName.equals(packageName)) {
                    return packageInfo.versionName;
                }
            }
            return "";
        }
    
        public static boolean isModuleActive() {
            return false;
        }
    }
    
    public class StringUtils {
        public static  boolean isEmpty(final CharSequence s) {
            return s == null || s.length() == 0;
        }
    }
    

    2.添加判断安装和激活的方法

    public class AppInfo {
        private boolean mIsXposedInstall;
        private String mXposedVersionName;
    
        private static volatile AppInfo mInstance = null;
    
        private AppInfo() {
    
        }
    
        public static AppInfo getInstance() {
            if (mInstance == null) {
                synchronized (AppInfo.class) {
                    if (mInstance == null) {
                        mInstance = new AppInfo();
                    }
                }
            }
            return mInstance;
        }
    
        public void ValidateEnvironment(Context context) {
            mXposedVersionName = AppUtils.getAppVersionName(context, AppUtils.PACKAGE_NAME_XPOSED);
            mIsXposedInstall = !StringUtils.isEmpty(getmXposedVersionName());
        }
    
        public boolean isXposedActive() {
            return AppUtils.isModuleActive();
        }
    
        public boolean ismIsXposedInstall() {
            return mIsXposedInstall;
        }
    
        public void setmIsXposedInstall(boolean xposedInstall) {
            mIsXposedInstall = xposedInstall;
        }
    
        public String getmXposedVersionName() {
            return mXposedVersionName;
        }
    
        public void setmXposedVersionName(String xposedVersionName) {
            mXposedVersionName = xposedVersionName;
        }
    }
    

    3.在MainActivity调用

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        AppInfo.getInstance().ValidateEnvironment(this);
    
        AppInfo appInfo = AppInfo.getInstance();
        boolean isInstall = appInfo.ismIsXposedInstall();
        boolean isActive = appInfo.isXposedActive();
        String xposedVersionName = appInfo.getmXposedVersionName();
    
        String msg = (isInstall ? xposedVersionName : "未安装") + " " + (isActive ? "已激活" : "未激活");
    
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }
    

    这时候运行, 会提示已安装, 但是还没激活, 需要在MainHook里设置isModuleActive的回调

    4.在MainHook里hook

    String WECHATMODULE_PACKAGE_NAME = "com.example.wechatmodule";
    // hook模块是否激活
    if (lpparam.packageName.equals(WECHATMODULE_PACKAGE_NAME)) {
        Class<?> classAppUtils = XposedHelpers.findClassIfExists(WECHATMODULE_PACKAGE_NAME + ".utils.AppUtils", lpparam.classLoader);
        if (classAppUtils != null) {
            XposedHelpers.findAndHookMethod(classAppUtils, "isModuleActive", XC_MethodReplacement.returnConstant(true));
            XposedBridge.log("成功hook住WechatModule的isModuleActive方法.");
        }
    }
    

    在这里插入图片描述

    展开全文
  • xposed开发1 -环境搭建

    千次阅读 2019-04-18 15:50:31
    VirtualXposed开发1 1.安装 git clone https://github.com/android-hacker/VirtualXposed.git cd VirtualXposed git submodule update --init --recursive 使用android studio打开运行, 就安装成功了. 默认安装了...

    xposed开发1 -环境搭建

    1.安装

    git clone https://github.com/android-hacker/VirtualXposed.git
    cd VirtualXposed
    git submodule update --init --recursive
    

    使用android studio打开运行, 就安装成功了.

    默认安装了xposed

    2.设置安装默认apk

    需要修改NewHomeActivity.java, 把需要安装的apk放在跟XposedInstaller_3.1.5.apk_同一个目录(就是assets里), 然后添加遍历assets目录的方法, 最后安装apk.

    // 添加遍历assets目录并安装的方法
    private void installApks(String name) {
        ProgressDialog dialog = new ProgressDialog(this);
        dialog.setCancelable(false);
        dialog.setMessage("Loading " + name);
        dialog.show();
    
        VUiKit.defer().when(() -> {
            File installerApk = getFileStreamPath(name + ".apk");
            if (!installerApk.exists()) {
                InputStream input = null;
                OutputStream output = null;
                try {
                    input = getApplicationContext().getAssets().open(name);
                    output = new FileOutputStream(installerApk);
                    byte[] buffer = new byte[1024];
                    int length;
                    while ((length = input.read(buffer)) > 0) {
                        output.write(buffer, 0, length);
                    }
                } catch (Throwable e) {
                    VLog.e(TAG, "copy file error", e);
                } finally {
                    FileUtils.closeQuietly(input);
                    FileUtils.closeQuietly(output);
                }
            }
    
            if (installerApk.isFile() && !DeviceUtil.isMeizuBelowN()) {
                try {
                    VirtualCore.get().installPackage(installerApk.getPath(), InstallStrategy.TERMINATE_IF_EXIST);
                } catch (Throwable ignored) {
    
                }
            }
        }).then((v) -> {
            dismissDialog(dialog);
            mUiHandler.sendEmptyMessageDelayed(2, 500);
        }).fail((err) -> {
            dismissDialog(dialog);
            mUiHandler.sendEmptyMessageDelayed(2, 500);
        });
    }
    
    private List<String> names;
    private void initNames() {
        names = new ArrayList<>();
        try {
            boolean isXposedInstalled = VirtualCore.get().isAppInstalled(XPOSED_INSTALLER_PACKAGE);
            if (!isXposedInstalled) {
                for (String s : getAssets().list("")) {
                    names.add(s);
                }
            }
        } catch (IOException e) {
            Toast.makeText(this, "Init error!", Toast.LENGTH_SHORT).show();
        }
    }
    
    // 重写获取mUiHandler方法
    private Handler getmUiHandler() {
        return new Handler(getMainLooper()) {
            @Override
            public void handleMessage(Message msg) {
                if (msg.what == 1) {
                    if (names.size() > 0) {
                        installApks(names.get(0));
                    }
                }
                if (msg.what == 2) {
                    if (names.size() > 0) {
                        names.remove(0);
                        sendEmptyMessage(1);
                    }
                }
            }
        };
    }
    

    替换原来mUiHandler初始化的方法

    mUiHandler = getmUiHandler();
    initNames();
    
    // 注释原来installXposed的方法
    if (checkXposedInstaller) {
        checkXposedInstaller = false;
    //            installXposed();
        mUiHandler.sendEmptyMessage(1);
    }
    

    重新运行, 这时候除了XposedInstaller还安装了你放在该目录里的其他apk

    不会android开发直接搞xposed确实够呛, 慢慢来, 把过程都记录好, ?
    下篇写怎样hook, 一边google一边学, 网上资料确实少或者很多过时的, 还是ios逆向简单?

    展开全文
  • xposed开发2 - 插件编写

    2019-04-18 18:59:45
    VirtualXposed开发2 为什么使用VirtualXposed不用Xposed? 因为需要root, 还要每次重启手机, 那部破小米试了半天没root成功, 直接放弃了. xpose教程, 在网上找到这个教程, 下面实践一遍. 1.创建模块 建一个空的...

    xposed开发2 - 插件编写

    为什么使用VirtualXposed不用Xposed?
    因为需要root, 还要每次重启手机, 那部破小米试了半天没root成功, 直接放弃了.

    xpose教程, 在网上找到这个教程, 下面实践一遍.

    1.创建模块

    建一个空的activity, 起名Xposed_Hook

    运行, 然后使用VirualXposed添加模块进入, 打开模块是空的


    打开AndroidManifest.xml, 添加xposed模块

    // 放在activity上面
    <meta-data android:name="xposedmodule" android:value="true" />
    <meta-data android:name="xposeddescription" android:value="这是一个xposed例子" />
    <meta-data android:name="xposedminversion" android:value="53" />
    

    重新运行安装, 重新添加到VirtualXposed, 这时候模块里就有了
    在这里插入图片描述

    2.配置XposedBridgeApi.jar

    打开app/src/main/build.gradle, 添加

    repositories {
        jcenter()
    }
    compileOnly 'de.robv.android.xposed:api:82'
    compileOnly 'de.robv.android.xposed:api:82:sources'
    

    • 点击"sync now"

    3.添加靶子

    在界面上添加一个按钮, 按钮点击弹起toast

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, toastMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }
    
    public String toastMessage() {
        return "I am not hooked";
    }
    

    4.实现hook操作

    新建HookTest.java

    public class HookTest implements IXposedHookLoadPackage {
        public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
            if (loadPackageParam.packageName.equals("com.example.xposed_hook")) {
                XposedBridge.log("has hooked!");
                Class clazz = loadPackageParam.classLoader.loadClass("com.example.xposed_hook.MainActivity");
                XposedHelpers.findAndHookMethod(clazz, "toastMessage", new XC_MethodHook() {
                    @Override
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        super.beforeHookedMethod(param);
                    }
    
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        param.setResult("You are hooked!");
                    }
                });
            }
        }
    }
    

    添加入口点

    1.在main文件夹里新建assets文件夹;
    2.在assets里新建xpose_init文件(text格式);
    3.在xposed_init添加com.example.xposed_hook.HookTest;

    禁用 Instant Run

    为什么禁用Instant Run?
    可能是实现的原理有关,具体我也不知道,有一些神奇的库都不支持instant run;

    再运行再添加到VirtualXposed里, hook生效了

    易用性来说, 跟ios的tweak和monkeydev比也是很简单的, 问题是怎样找到要hook的方法, 还有怎样debug, 这些下篇讲, 没有遇到特别繁琐的东西?

    展开全文
  • xposed开发12 - 微信运动 // 微信运动 hookClass = "android.hardware.SystemSensorManager$SensorEventQueu"; hookMethodName = "dispatchSensorEvent"; XposedHelpers.findAndHookMethod(hookClass, lpparam....
  • xposed开发11 - 微信红包 private static Activity launcherUIActivity = null; // 微信红包 hookClass = "com.tencent.wcdb.database.SQLiteDatabase"; hookMethodName = "insertWithOnConflict"; XposedHelpers....
  • xposed开发7 - 获取微信个人信息

    千次阅读 2019-04-22 20:48:33
    xposed开发7 - 获取微信个人信息 Xposed获取微信个人信息 分析过程如上 // 获取微信个人信息 hookClass = "com.tencent.mm.ui.LauncherUI"; hookMethodName = "onCreate"; XposedHelpers.findAndHookMethod...
  • xposed开发4 - 水了一篇

    2019-04-18 21:34:20
    VirtualXposed开发5 本来想写个微信防撤回练下手的, VirtaulXposed竟然登录不了微信, 头大, 只能试支付宝了
  • xposed开发6 - 微信首页添加按钮 [原创]Xposed__给微信加个按钮 原文章如上, 过程看了没看懂, 直接跑代码看效果 // 微信首页添加按钮 hookClass = "com.tencent.mm.ui.LauncherUI"; hookMethodName = ...
  • xposed开发13 - 微信消息防撤回

    千次阅读 2019-04-23 18:41:25
    xposed开发13 - 微信消息防撤回 try { val clazz = XposedHelpers.findClass("com.tencent.wcdb.database.SQLiteDatabase", lpparam.classLoader) XposedHelpers.findAndHookMethod(clazz, "updateWithOnConflict...
  • xposed开发10 - 使用OkHttp网络请求

    千次阅读 2019-04-23 10:28:30
    xposed开发10 - 使用OkHttp网络请求 1.build.gradle引入OkHttp // 网络请求框架 implementation 'com.squareup.okhttp3:okhttp:3.11.0' 2.添加OkHttpUtils单例 public class OkHttpUtils { private static final ...
  • VirtualXposed开发2 1.测试目标apk用kotlin写能不能hook fun click(view: View) { Toast.makeText(this, toastMessage(), Toast.LENGTH_SHORT).show() } fun toastMessage(): String { return "I am not hooked" ...
  • Xposed开发教程(官方Helpers)
  • Xposed开发教程(Development tutorial)
  • Xposed开发教程(官方Replacing resources)
  • Xposed开发指南

    千次阅读 2017-02-06 11:48:55
    转:... 一个修改系统的项目Xposed的工作原理 hook和取代一个方法 创建一个项目把这个项目Xposed化 AndroidManifest.xmlXposedBridgeApi.jarModule implementationassets/xpose
  • xposed开发5-修改微信我的零钱的金额

    千次阅读 2019-04-22 19:41:07
    VirtualXposed开发5-修改微信我的零钱的金额 终于在virtualxposed上安装好微信了. 1.找到零钱的界面. 进入adb adb shell 开发android微信零钱界面 dumpsys activity | grep mResumedActivity 找到对应的类 2....
  • xposed开发8- hook微信聊天消息数据库插入操作 // hook微信聊天消息数据库插入操作 hookClass = "com.tencent.wcdb.database.SQLiteDatabase"; hookMethodName = "insertWithOnConflict"; XposedHelpers....
  • Xposed开发入门笔记

    2016-07-07 11:27:22
    主要参考:Xposed Module开发教程。这个教程清晰易懂,而且是用AS开发的,很实用。但是这个链接里面有关键的一步没有指出,后面再讨论。开发环境是Android Studio 1.5,运行环境是模拟器Android 4.1.1 - API 16。0. ...
  • 尽量使用Xposed自带的读取设置函数xpref
  • 基于XPOSED模块开发了微信客服插件,通过WEB网页实现批量微信管理与营销,实现了微信云客服。 具体实现以下功能: 1、微信通讯录上报与管理 2、文字消息接收与发送 3、表情消息接收与发送 4、图片消息接收与发送...
  • 今天学习android hook,需要使用到api-82.jar,然而论坛上大部分资源都要积分 程序员何必为难程序员 0积分资源奉上 欢迎下载!
  • Xposed开发浅谈探寻篇

    2019-06-23 21:57:23
    Xposed作为一个著名的Hook框架,早已经在移动安全行业家喻户晓。今天写这篇文章主要也是想下手玩玩这个框架,至于框架的安装,虽然也会碰见很多问题,但是今天暂不附上教程,因为最近精力有限,等有时间我会附上安装...
  • 开发教程 好吧 …… 你打算学习怎么建立一个新的 Xposed 模块吗?那就读读这个教程(或者叫它 “泛谈” 也可以)并且学习怎么一步步地达成这个目标。这不仅包含了例如 “新建并插入” 的技术性内容,还包含了一些...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 616
精华内容 246
关键字:

xposed开发