百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

懒人福利:一秒创建Xposed模版(xposed模块使用教程)

ccwgpt 2024-10-02 11:58 55 浏览 0 评论

懒惰是科技的第一生产力。

关注并且私信小编暗号:免重启,即可获取免重启成品哦。

0×00 背景

由于Android逆向每次想要使用Xposed进行Hook时,总是需要重复性地操作一遍Android Studio新建项目的流程.ps:当然可以只用一个项目,强迫症需要分开 :)

由于Xposed实现的方式,每次修改hook代码后,需要重启机器,这也是白白浪费了很多时间。

基于以上两点,参考现有的方案,实现了一个Module,只需在AS中new一下即可解决问题。

0×01 创建XposedModule

1.效果:

2.代码结构:

3.代码解析:

template.xml:

<?xml version="1.0"?><template
 name="XposedModuleFreeRestart"
 description="Creates a new Xposed Module without restart"
 format="3"
 minApi="15"
 minBuildApi="15"
 revision="4">
 <category value="Other"/>
 <!-- parameter 主要是:效果图中,需要输入的几个设置栏 -->
 <parameter
 name="Xposed Mod class"
 constraints="nonempty|unique|class"
 default="XposedMod"
 help="Class that contains Xposed code"
 id="xposedModClass"
 type="string"/>
 <parameter
 name="Xposed Description"
 constraints="nonempty"
 help="Description of Xposed Module"
 id="xposedDescription"
 type="string"/>
 <parameter
 name="Package name"
 constraints="package"
 default="com.xxx.xxxx.xposed"
 id="packageName"
 type="string"/>
 <parameter
 name="Hooked Package name"
 constraints="nonempty"
 default="com.xxxx.xxx.xposed"
 id="hookPackageName"
 type="string"/>
 <!-- Module图标 -->
 <thumbs>
 <thumb>template_xposed_module.png</thumb>
 </thumbs>
 <!-- 全局变量 -->
 <globals file="globals.xml.ftl"/>
 <!-- 需要执行的操作 关键点-->
 <execute file="recipe.xml.ftl"/></template>

recipe.xml.ftl

<?xml version="1.0"?><recipe>
 <!-- 创建文件 -->
 <mkdir at="${escapeXmlAttribute(manifestOut)}/assets/"/>
 <!-- 移动合并文件 -->
 <merge from="AndroidManifest.xml.ftl" to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml"/>
 <merge from="build.gradle.ftl" to="${escapeXmlAttribute(projectOut)}/build.gradle"/>
 <merge from="res/values/strings.xml.ftl" to="${escapeXmlAttribute(resOut)}/values/strings.xml"/>
 <!-- 重命名文件 -->
 <instantiate from="assets/xposed_init.ftl" to="${escapeXmlAttribute(manifestOut)}/assets/xposed_init"/>
 <instantiate from="src/app_package/XposedMod.java.ftl" to="${escapeXmlAttribute(srcOut)}/${xposedModClass}.java"/>
 <!-- 打开文件 -->
 <open file="${escapeXmlAttribute(srcOut)}/${xposedModClass}.java"/></recipe>

xposed_init.ftl 存储的是 Hook类的入口地址

strings.xml.ftl 存储的是 Xpodse模块的描述

XposedMod.java.ftl 创建后的模版代码,可以根据自己的需求,修改模版里面的代码

AndroidManifest.xml.ftl 主要是Xposed的meta字段

build.gradle.ftl 为空

4.bug修复

由于Xposed会预先加载好jar包,因此,build.gradle中的implements需要修改为provided,才不会出现错误。

具体修改build.gradle.ftl,添加下面依赖:

dependencies { provided 'de.robv.android.xposed:api:82'}

0×02 加入免重启功能

原理分析:原理这里不作多描述,实际上就是通过替换Xposed插件生成的APK,然后通过动态加载的方式来调用,以实现免重启的功能。具体可阅读参考文章。

改进:对上面的AS模版进行改造,以实现免重启。

package ${packageName};import android.app.Application;import android.content.Context;import android.content.pm.PackageManager;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.List;import dalvik.system.PathClassLoader;import de.robv.android.xposed.IXposedHookLoadPackage;import de.robv.android.xposed.XC_MethodHook;import de.robv.android.xposed.XposedHelpers;import de.robv.android.xposed.callbacks.XC_LoadPackage;public class HookLoader implements IXposedHookLoadPackage { /**
 * 当前Xposed模块的包名,方便寻找apk文件
 */
 private final String modulePackage = "${packageName}"; /**
 * 宿主程序的包名(允许多个),过滤无意义的包名,防止无意义的apk文件加载
 */
 private static List<String> hostAppPackages = new ArrayList<>(); /**
 * 实际hook逻辑处理类
 */
 private final String handleHookClass = ${xposedModClass}.class.getName(); /**
 * 实际hook逻辑处理类的入口方法
 */
 private final String handleHookMethod = "handleLoadPackage"; static { // TODO: Add the package name of application your want to hook!
 hostAppPackages.add("${hookPackageName}");
 } @Override
 public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable { if (hostAppPackages.contains(loadPackageParam.packageName)) {
 XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() { @Override
 protected void afterHookedMethod(MethodHookParam param) throws Throwable {
 Context context=(Context) param.args[0];
 loadPackageParam.classLoader = context.getClassLoader();
 invokeHandleHookMethod(context, handleHookClass, handleHookMethod, loadPackageParam);
 }
 });
 }
 } /**
 * 安装app以后,通过动态加载这个apk文件,调用相应的方法
 * 从而实现免重启
 * @param context context参数
 * @param handleHookClass 指定由哪一个类处理相关的hook逻辑
 * @param loadPackageParam 传入XC_LoadPackage.LoadPackageParam参数
 * @throws Throwable 抛出各种异常,包括具体hook逻辑的异常,寻找apk文件异常,反射加载Class异常等
 */
 private void invokeHandleHookMethod(Context context, String handleHookClass, String handleHookMethod, XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
 String apkPath = context.getPackageManager().getApplicationInfo(this.modulePackage,PackageManager.GET_META_DATA).sourceDir;
 PathClassLoader pathClassLoader = new PathClassLoader(apkPath, ClassLoader.getSystemClassLoader());
 Class<?> cls = Class.forName(handleHookClass, true, pathClassLoader);
 Object instance = cls.newInstance();
 Method method = cls.getDeclaredMethod(handleHookMethod, XC_LoadPackage.LoadPackageParam.class);
 method.invoke(instance, loadPackageParam);
 }
}

文章作者是通过区分不同的sdk以实现找到apk的findapk的方法,实际上这里有很简便的方法:通过系统API便可找到对应的apk路径:

一行代码即可搞定

String apkPath = context.getPackageManager().getApplicationInfo(this.modulePackage,PackageManager.GET_META_DATA).sourceDir;

关注并且私信小编暗号:免重启,即可获取免重启成品哦。

相关推荐

用Steam启动Epic游戏会更快吗?(epic怎么用steam启动)

Epic商店很香,但也有不少抱怨,其中一条是启动游戏太慢。那么,如果让Steam启动Epic游戏,会不会速度更快?众所周知,Steam可以启动非Steam游戏,方法是在客户端左下方点击“添加游戏”,然...

Docker看这一篇入门就够了(dockerl)

安装DockerLinux:$curl-fsSLhttps://get.docker.com-oget-docker.sh$sudoshget-docker.sh注意:如果安装了旧版...

AYUI 炫丽PC开发UI框架2016年6月15日对外免费开发使用 [1]

2016年6月15日,我AY对外发布AYUI(WPF4.0开发)的UI框架,开发时候,你可以无任何影响的去开发PC电脑上的软件exe程序。AYUI兼容XP操作系统,在Win7/8/8.1/10上都顺利...

别再说C#/C++套壳方案多了!Tauri这“借壳生蛋”你可能没看懂!

浏览器套壳方案,C#和C++有更多,你说的没错,从数量和历史积淀来看,C#和C++确实有不少方式来套壳浏览器,让Web内容在桌面应用里跑起来。但咱们得把这套壳二字掰扯清楚,因为这里面学问可大了!不同的...

OneCode 核心概念解析——Page(页面)

在接触到OneCode最先接触到的就是,Page页面,在低代码引擎中,页面(Page)设计的灵活性是平衡“快速开发”与“复杂需求适配”的关键。以下从架构设计、组件系统、配置能力等维度,解析确...

React是最后的前端框架吗,为什么这么说的?

油管上有一位叫Theo的博主说,React是终极前端框架,为什么这么说呢?让我们来看看其逻辑:这个标题看起来像假的,对吧?React之后明明有无数新框架诞生,凭什么说它是最后一个?我说的“最后一个”不...

面试辅导(二):2025前端面试密码:用3个底层逻辑征服技术官

面试官放下简历,手指在桌上敲了三下:"你上次解决的技术难题,现在回头看有什么不足?"眼前的候选人瞬间僵住——这是上周真实发生在蚂蚁金服终面的场景。2025年的前端战场早已不是框架熟练...

前端新星崛起!Astro框架能否终结React的霸主地位?

引言:当"背着背包的全能选手"遇上"轻装上阵的短跑冠军"如果你是一名前端开发者,2024年的框架之争绝对让你眼花缭乱——一边是React这位"背着全家桶的全能选...

基于函数计算的 BFF 架构(基于函数计算的 bff 架构是什么)

什么是BFFBFF全称是BackendsForFrontends(服务于前端的后端),起源于2015年SamNewman一篇博客文章《Pattern:BackendsFor...

谷歌 Prompt Engineering 白皮书:2025年 AI 提示词工程的 10 个技巧

在AI技术飞速发展的当下,如何更高效地与大语言模型(LLM)沟通,以获取更准确、更有价值的输出,成为了一个备受关注的问题。谷歌最新发布的《PromptEngineering》白皮书,为这一问题提供了...

光的艺术:灯具创意设计(灯光艺术作品展示)

本文转自|艺术与设计微信号|artdesign_org_cn“光”是文明的起源,是思维的开端,同样也是人类睁眼的开始。每个人在出生一刻,便接受了光的照耀和洗礼。远古时候,人们将光奉为神明,用火来...

MoE模型已成新风口,AI基础设施竞速升级

机器之心报道编辑:Panda因为基准测试成绩与实际表现相差较大,近期开源的Llama4系列模型正陷入争议的漩涡之中,但有一点却毫无疑问:MoE(混合专家)定然是未来AI大模型的主流范式之一。...

Meta Spatial SDK重大改进:重塑Horizon OS应用开发格局

由文心大模型生成的文章摘要Meta持续深耕SpatialSDK技术生态,提供开自去年9月正式推出以来,Meta持续深耕其SpatialSDK技术生态,通过一系列重大迭代与功能增强,不断革新H...

&quot;上云&quot;到底是个啥?用&quot;租房&quot;给你讲明白IaaS/PaaS/SaaS的区别

半夜三点被机房报警电话惊醒,顶着黑眼圈排查服务器故障——这是十年前互联网公司运维的日常。而现在,程序员小王正敷着面膜刷剧,因为公司的系统全"搬"到了云上。"部署到云上"...

php宝塔搭建部署thinkphp机械设备响应式企业网站php源码

大家好啊,欢迎来到web测评。本期给大家带来一套php开发的机械设备响应式企业网站php源码,上次是谁要的系统项目啊,帮你找到了,还说不会搭建,让我帮忙录制一期教程,趁着今天有空,简单的录制测试了一下...

取消回复欢迎 发表评论: