WalxPlugin免Root框架使用详解和示例代码

news2024/11/25 8:13:44

2023年7月4日首发

WalxPlugin框架(以下简称WP框架)是一个不需要root权限就能使用的插件化模块,能够轻松实现在非root设备hook其它应用的调用和访问进程数据等功能。目前该框架已发布测试版。

一.WP框架工具包提供了以下几个模块:

1.WP管理器:用于管理插件模块的授权和使用,插件由开发者设计,经用户确认后即可由目标应用(宿主)加载。

2.加载器:对用户和开发者不可见,而是由WP管理器加载到目标应用。

3.开发sdk用到的jar包:walxpluginsdk.jar,开发者需要将该jar包导入到项目中去。

4.核心模块:该模块由WP自身提供,为程序自带的插件,用于开发调试,基本功能有:

(1)AMS监听,也就是监听目标应用对ActivityManagerService服务的接口调用;

(2)Activity监听,这个其实是把AMS启动Activity的功能单独拿出来了;

(3)查看应用View:用来查看Activity和Window中的所有View列表及其信息;

(4)查看应用组件:用来查看四大组件的数据,包括创建的所有对象信息;

(5)导出应用数据:用来提取应用/data/data/包名下的私有目录中的文件。

二.WP框架能做什么

WP主要提供一套简单的开发标准,由开发者自行设计功能,比如开发者自身需求,像监听应用调用等,当然也可以监听网络请求,但由于时间仓促框架自身模块未实现。然后就是用户的需求,比如应用个性定制等,在宿主应用启动后拦截api调用,修改应用的界面,替换自己的数据等,或者能够实现类似于微信抢红包的功能,但不能进行全局hook,只能通过代理修改简单的接口调用,以及获取对象数据。所以它不像某些调试工具只能应用于开发阶段,它可以完全用于实践,对应用做出持久性的改变。

实现原理:开发好的模块也就是apk里面的核心代码会和目标应用位于同一进程,相当于hook注入技术,或者叫dex注入技术,所以它们能相互访问数据,WP管理器会向目标应用注入一个dex文件,用于获取启动控制权,并加载经用户授权的模块,然后对目标应用重新签名。需要注意的是:某些应用会做签名验证,所以可能无法启动,至于如何绕过验证机制这个需要后续实现,可能要针对具体应用分析,甚至要用到ida反汇编,毕竟很多应用底层代码都工作在c层。

大概功能讲完了,下面讲一下如何使用。

先上几张图:

下面是获取到微信数据:

微信ams监听数据:

微信登录界面数据,手机号是我随便填写的:

首先需要到文章最后提供的地址中下载WP开发工具,然后安装其中的WP管理器应用,下面的例子中介绍了如何修改微信欢迎界面按钮颜色。

 主要代码截图:

现在打开Android Studio创建一个模块,填写包名,然后导入jar包,同步项目,新建一个启动入口类,比如叫Main,然后实现IWalxPluginMain接口,重写onLoadModule和onMenuItemClick两个方法,
然后在onLoadModule中加入以下代码,用于监听Activity生命周期:

WalxHelper.registerActivityListener(context, this);

在onMenuItemClick中添加自己的实现代码:

switch (itemId) {
    case 1000:
        Toast.makeText(context, "点击了1000", Toast.LENGTH_SHORT).show();
        break;
}


        
最后在onActivityResumed方法中加入下列代码,用来监听微信欢迎登录界面,并修改登录按钮颜色:

if(activity.getClass().getSimpleName().equals("WelcomeActivity")){
    Button loginButton = (Button) WalxHelper.findViewById(activity, 2131312425); //登录按钮id
    if (loginButton != null) {
        loginButton.setBackgroundColor(Color.RED); //将登录按钮的颜色改成红色
    }
}

完整代码如下:

public class Main implements IWalxPluginMain, Application.ActivityLifecycleCallbacks {
    @Override
    public void onLoadModule(Context context, ClassLoader classLoader, String modulePackage) {
        Toast.makeText(context, modulePackage, Toast.LENGTH_SHORT).show();
        WalxHelper.registerActivityListener(context, this);
    }

    @Override
    public void onMenuItemClick(Context context, ClassLoader classLoader, int itemId) {
        switch (itemId) {
            case 1000:
                Toast.makeText(context, "点击了1000", Toast.LENGTH_SHORT).show();
                break;
        }
    }

    @Override
    public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {

    }

    @Override
    public void onActivityStarted(@NonNull Activity activity) {

    }

    @Override
    public void onActivityResumed(@NonNull Activity activity) {
        Button loginButton = (Button) WalxHelper.findViewById(activity, 2131312425); //登录按钮id
        if (loginButton != null) {
            loginButton.setBackgroundColor(Color.RED); //将登录按钮的颜色改成红色
        }
    }

    @Override
    public void onActivityPaused(@NonNull Activity activity) {

    }

    @Override
    public void onActivityStopped(@NonNull Activity activity) {

    }

    @Override
    public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {

    }

    @Override
    public void onActivityDestroyed(@NonNull Activity activity) {

    }
}

最后在src/main下创建一个assets目录,在目录里创建一个walxplugin.json文件,文件格式如下:

{
  "desc":"测试模块",
  "targetPackages":"com.tencent.mm",
  "mainClass":"com.zwxuf.myplugin.Main",
  "menu":[
    {
      "id":1000,
      "name":"测试菜单项"
    }
  ]
}

字段含义:

desc:模块描述;
targetPackages:模块要注入的目标应用,即要修改的应用包名,多个包名用英文,隔开,如果要注入所有应用,填写*即可;
mainClass:主类,应用启动后会回调该方法,在该方法中添加自己的初始化代码;
menu:菜单项,数组格式,在WP管理器中点击应用时会显示本菜单;

如图示例:

最终运行效果图:

以后每次启动微信,它的登录按钮始终是红色的。

注意:由于是编写的是模块,所以应用里面的资源是无法加载的,所以请不要使用R.*开头资源引用方式,而使用WalxHelper工具类提供的方法来实现,
比如WalxHelper.getLayout方法用来获取一个布局,WalxHelper.getDrawable用来获取一张图片。

使用Activity:

创建一个类,继承WalxPluginUI类,然后在类中使用Activity的所有方法,启动时不要用系统的startActivity,而要使用WalxHelper中的startPluginUI方法。

在Activity类中不要使用如setContentView(R.layout.activity_main)这样的方法,而用以下代码代替:

View mContentView = WalxHelper.getLayout(this, R.layout.activity_main);
setContentView(mContentView);


最后导出模块apk,手动安装或者通过WP管理器安装,然后授权开启模块,如果模块显示未认证则代表该模块未被用户授权,是无法使用的,此时需要点击开启授权,另外,卸载WP管理器后所有模块将全部变成未认证,需要重新授权。

安装完模块,接下来需要安装要修改的应用,首次安装需要先卸载应用,要使用微信模块,就要重装微信,请先做好数据备份。

WalxHelper工具类使用方法:


//获取应用所有Activity
WalxHelper.getActivities(context);

//获取Activity中的所有View,不包括窗口中的view
WalxHelper.getAllChildViews(activity);

//获取所有根View,根view包含窗口的View和Dialog以及PopupWindow中的view
WalxHelper.getAllRootViews();


        
其余功能可自行研究。


注意事项:

1.由于重新进行了签名,个别应用可能签名失败,此进可进入文件管理器,找到内部存储下的singed.apk文件,在电脑上用apksigner临时签名解决,签名文件可以用自己的keystore,后续会完善签名方式。

2.有些应用是系统自带的预装应用, 这些应用可能会签名失败或安装失败,所以请不要用这些版本,而建议从网上重新下载原版进行安装。

3.有些应用安装成功,但无法启动,或者有闪退现象,此时可重新用WP安装应用,并分别取消“创建新入口”和“禁用原入口”两个选项再试。

创建新入口含义:即再为应用分配一个启动图标,在桌面上会显示两个应用图标,但名称不一样,一个是原名称,另一个叫模块入口,启动时点击模块入口启动应用,而不要点击原应用图标启动。如果不勾选此选项,启动应用时只能通过WP启动才能激活插件,在桌面上点击是无法加载插件的。

禁用原入口含义:即删除应用原来的启动界面声明,用新入口代替,勾选这个选项后,在桌面上只会生成一个图标,此时正常点击启动应用即可。

为什么WP不使用service方式启动代码?因为service在应用停止后无法启动,此时应用具有FLAG_STOPPED标志。

百度网盘临时下载地址:

https://pan.baidu.com/s/1D_jwnmSpwv4Kd19TrqZvHQ

提取码:1234

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/718810.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5.8.5 TCP可靠传输(一)序号确认机制

5.8.5 TCP可靠传输(一)序号确认机制 TCP是可靠的传输层协议,主要通过序号确认机制、超时重传机制、定时器三个方面实现可靠传输。 一、序号确认机制 TCP将所要传送的整个的应用层报文看成是一个一个字节组成的数据流,并对每一个…

Cyclo(-Ala-Tyr),21754-26-7,环(丙氨酸-酪氨酸)二肽,由两个氨基酸通过肽键环合形成

(文章资料汇总:陕西新研博美生物科技有限公司小编MISSwu)​ 【产品描述】 Cyclo(-Ala-Tyr),环(丙氨酸-酪氨酸)二肽,环二肽由两个氨基酸通过肽键环合形成,在氢键相互作用驱动下具有较强的自组装倾向&#x…

python的作用域、globals()-全局变量 和 locals()-局部变量

目录 查看全局变量和局部变量 变量解析规则 变量生存周期 在python中,函数会创建一个自己的作用域,也称为为命名空间。当我们在函数内部访问某个变量时,函数会优先在自己的命名空间中寻找。 我们自己定义的全局变量均在python内建的globa…

java项目linux启动文件

更改jar包名称和jar包所在目录 JAR包名称 替换成自己的项目包名称 JAR包所在目录替换成自己的jar包所在的目录 这里面的字符建议手打到服务器文件内,复制粘贴的话可能存在特殊符号 ps -ef|grep java SERVICE_PID$(ps aux | grep JAR包名称 | grep -v grep | awk…

influxDB聚合类函数

influxDB聚合类函数 1&#xff09;count()函数 返回一个&#xff08;field&#xff09;字段中的非空值的数量。 SELECT COUNT(<field_key>) FROM <measurement_name> [WHERE <stuff>] [GROUP BY <stuff>] 例子1 计算非空water_level数量SELECT COUN…

Web3 处理智能合约部署到本地区块链,并在本地进行测试

上文 Web3 在Truffle项目中编写出自己的第一个solidity智能合约我们演示了 在Truffle环境下写一个智能合约并编译的功能 编译出的文件夹中的这个JSON就非常重要了 我们就可以通过 它这个ABI链接到需要的智能合约程序上去 但这也仅仅是编译完了 我们的智能合约还没有部署到我们…

gma 2 教程(一)概述:2.GMA 安装

依赖环境 系统环境 【操作系统】&#xff1a;64位&#xff08;amd64&#xff09;Windows、Linux 【内存】&#xff1a;≥8 GBPython 环境 【Windows】&#xff1a;3.8.8~3.11 【Linux】&#xff1a;3.9~3.11 目前不支持MacOS和其他平台。建议安装Anaconda创建Python环境。Anac…

解决postman接口自动化测试中登录后401权限问题

大家在做接口自动化测试的时候&#xff0c;碰到有登录的系统应该都会遇到401权限的问题&#xff0c;下面我来说下如何解决这个问题。 首先需要了解问题的本质&#xff0c;是要解决什么&#xff1f;这样我们才好对症下药&#xff0c;报401是因为用户在登录的时候&#xff0c;服务…

亚马逊云科技让AI开发速度更快,门槛更低

过去只有大型科技公司、政府机构和大学才有能力和时间、金钱去部署生成式AI能力。近二十年来&#xff0c;云服务把计算的门槛降低了。亚马逊云科技全球产品副总裁Matt Wood博士表示&#xff1a;“我们希望在生成式AI上做同样的事&#xff0c;把技术提供到每个开发者和商业用户的…

kaggle免费服务器全攻略

1. kaggle服务器16G显卡一周40小时. 所以我们直接干一堆谷歌账号即可 2. 谷歌账号的注册: 我们需要FQcolab for windows可以做到. 然后我们注册好账号后.我们注册4个账号. 注册方法. 打开chrome 点最下面的添加按钮.然后一直下一步即可.无脑注册. 3. 为Chrome多账户添加单独的…

机器人制作开源方案 | 立式铣床模型

1. 功能说明 铣床主要是指用铣刀在工件上加工多种表面的机床&#xff0c;本文示例将通过程序控制模拟铣床的运动效果--模拟铣床进行加工时各个结构的运动方式。铣床的运动主要包括&#xff1a;主轴的旋转运动、立铣头的上下进给运动、工作台的前后左右进给运动。 2. 结构说明 该…

期权专业知识常用术语有哪些?虚值期权和实值期权怎么选择合理的执行价

【1】美式期权&#xff1a;每个交易日都可以行权的期权 【2】欧式期权&#xff1a;只有在到期日才可以执行的期权 【3】平值期权&#xff1a;内在价值为零或极小的期权&#xff0c;或行权价格等于或接近于标的物合约市场价格的期权。通常是指行权价格最接近标的合约市场价格的期…

JavaEE语法之第二章、多线程(初阶三)

目录 一、多线程带来的风险-线程安全 (重点) 1.1观察线程不安全 1.2线程安全的概念 1.3线程不安全的原因 1.3.1抢占式执行&#xff08;进程的随机调度&#xff09; 1.3.2多个线程修改同一个变量 1.3.3内存的可见性 1.3.4原子性 1.3.5指令重排序 二、解决之前的线程不…

Spring Boot 中的 @Query 注解是什么,原理,如何使用

Spring Boot 中的 Query 注解是什么&#xff0c;原理&#xff0c;如何使用 在 Spring Boot 中&#xff0c;Query 注解是一个非常常用的注解&#xff0c;用于定义自定义查询语句。本文将介绍 Query 注解的作用、原理和使用方法。 1. Query 注解的作用 在 Spring Boot 中&#…

【论文精读】《Classifying User Activities in the Encrypted WeChat Traffic》

Classifying User Activities in the Encrypted WeChat Traffic Authors:Chengshang Hou,Junzheng Shi,Cuicui Kang,Zigang Cao,Xiong Gang Journal:2018 IEEE 37th International Performance Computing and Communications Conference (IPCCC) (2018) 摘要 加密移动应用程序…

【算法】从记忆化搜索到递推——动态规划入门

文章目录 笔者说&#xff1a;我们为什么要学记忆化搜索&#xff1f;预备知识例题&#xff1a;198. 打家劫舍记忆化搜索 相关题目练习70. 爬楼梯记忆化搜索dp 746. 使用最小花费爬楼梯记忆化搜索dp 2466. 统计构造好字符串的方案数记忆化搜索dp 213. 打家劫舍 II记忆化搜索dp 笔…

unity + python socket通信,自定义数据包

unity和python相互之间通过socket通信来发送自定义数据包是一个利用unity构建场景和通过python来做数据处理的方式&#xff0c;能够有效的利用两种不同语言的优势。 我已经将对应的操作封装为对应的一个模块&#xff0c;SocketTools.cs&#xff0c;我们先来看一下具体的代码用…

7.3.2 【Linux】磁盘分区: gdisk/fdisk

MBR 分区表使用 fdisk 分区&#xff0c; GPT 分区表使用 gdisk 分区。 gdisk 通过lsblk或blkid先找到磁盘&#xff0c;再用parted /dev/xxx print来找出内部的分区表类型&#xff0c;之后采用gdisk或fdisk来操作系统。上表中可以发现 gdisk 会扫描 MBR 与 GPT 分区表&#xff…

【Arduino】超声波实验

4个端&#xff1a; Vcc &#xff1a; 5V电源Trig &#xff1a; 控制端&#xff08;触发&#xff09;Echo &#xff1a; 接收端&#xff08;回声&#xff09;Gnd &#xff1a; 接地端 相关参数 &#xff1a; 工作电流 &#xff1a; 15mA工作电压 &#xff1a; 5V工作频率 &am…

Linux常用命令——expr命令

在线Linux命令查询工具 expr 一款表达式计算工具 补充说明 expr命令是一款表达式计算工具&#xff0c;使用它完成表达式的求值操作。 expr的常用运算符&#xff1a; 加法运算&#xff1a;减法运算&#xff1a;-乘法运算&#xff1a;\*除法运算&#xff1a;/求摸&#xff0…