Android反编译与Xposed所必须了解的事情(二)

2024-04-02 05:58

本文主要是介绍Android反编译与Xposed所必须了解的事情(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、Xposed使用步骤

  1. Gradle引用依赖
  2. Manifest中添加meta内容识别
  3. 添加assets文件夹,创建xposed_init文件,用于hook文件识别
  4. 编写hook代码,hook对应的类和方法

二、流程解析

接上篇内容,依旧以打开LOG为目的,之前我们已经找到了对应的自定义log类,下面只需要打开log开关。

  • 添加Gradle依赖
compileOnly 'de.robv.android.xposed:api:82'
  • Manifest添加meta内容识别
        <meta-dataandroid:name="xposedmodule"android:value="true"/><meta-dataandroid:name="xposeddescription"android:value="描述"/><!-- 支持的xposed的最低版本 --><meta-dataandroid:name="xposedminversion"android:value="82"/>
  • 添加xposed_init文件,并放到assets文件夹下

对应的是XposedInstaller会回调类。

    com.alzzz.xxxx.xposed.Hook
  • hook对应的package和对应的类

1、实现IXposedHookLoadPackage接口,实现handleLoadPackage类

2、判断包名,是否是想要hook的apk(非必须)

3、找到Hook时机(这次是在Application的attach方法进行hook的)

4、找到对应的类,通过反射修改对应字段

 

三、代码实现

1、Hook.java

主要工作:hook在Application的attach方法,读取文件中的json配置,看是否开启了log开关,开了就进行hook

public class Hook implements IXposedHookLoadPackage {private static final String CLASS_NAME = "com.xxx.xxxx";private IConfig mConfig = new IConfig();private Context mApplicationContext;private ClassLoader mClassLoader;@Overridepublic void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {if (CLASS_NAME.equalsIgnoreCase(lpparam.packageName)){//初始化配置initConfig();setupHookComponent();}}/*** 组建context和appliction组件*/private void setupHookComponent() {XposedHelpers.findAndHookMethod(Application.class, "attach",Context.class,new XC_MethodHook() {@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);mApplicationContext = (Context) param.args[0];mClassLoader = mApplicationContext.getClassLoader();LOGGER.d("mClassLoader = "+mClassLoader);startHook();}});}/*** 开始hook*/private void startHook() {if (mConfig.isLogHook()){//开启了log hook开关LOGGER.d("starting log hook");IFishHook logHook = new FishLogHook(mApplicationContext, mClassLoader);logHook.startHook();}}/*** 初始化设置,必须在最前*/private void initConfig() {mConfig = new IConfig();try {String content = FileUtils.getFileContent(FileUtils.PATH_FILE_DIR, FileUtils.FILE_NAME_CONFIG);if (!TextUtils.isEmpty(content)){JSONObject jsonObject = new JSONObject(content);mConfig.decode(jsonObject);LOGGER.d(content);}} catch (IOException e) {e.printStackTrace();} catch (JSONException e) {e.printStackTrace();}}
}

2、FishLogHook

主要功能:反射打开LOG开关

public class FishLogHook implements IFishHook {private Context mApplicationContext;private ClassLoader mClassLoader;Class<?> instanceClazz;boolean hasHooked = false;public FishLogHook(Context mApplicationContext, ClassLoader mClassLoader) {this.mApplicationContext = mApplicationContext;this.mClassLoader = mClassLoader;}@Overridepublic void startHook() {if (instanceClazz == null) {try {instanceClazz = Class.forName("com.xxx.xxxx.xframework.util.Log", true, mClassLoader);} catch (ClassNotFoundException e) {e.printStackTrace();LOGGER.e(e.getMessage());}}doLogProxy();}private void doLogProxy() {if (instanceClazz != null){try {LOGGER.d("Loghook ===> start log proxy");Field field = instanceClazz.getDeclaredField("enable");field.setAccessible(true);LOGGER.d("Loghook ===> field = "+field.get(null));field.set(null, true);LOGGER.d("Loghook ===> field = "+field.get(null));} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}}
}

至此就打开了LOG开关了,这里需要注意两个事:

1、在Android 7.0以后XSharedPreference已经不好用了,因为SharedPreference的Mode类型只能是Private的了,在其他的应用内是打不开的,所以我采用了文件的方式,通过将config的内容存在文件中进行配置的管理。

2、如果想要加载外部的类或方法,需要拿到真正可以用的ClassLoader,这个比较关键。

 

由此,可以考虑一下是否可以直接把OkHttp的Log拦截器打开呢?是否可以Hook住网络请求,默认不验证签名呢?更换View功能是不是也可以?想想热更新相关,是不是可以替某些用三方热更的Apk,热更一些dex进去呢?这当然都可以。而且代码量也不多,只需要读懂想要hook的App的代码就行了。

这篇关于Android反编译与Xposed所必须了解的事情(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

一文带你了解SpringBoot中启动参数的各种用法

《一文带你了解SpringBoot中启动参数的各种用法》在使用SpringBoot开发应用时,我们通常需要根据不同的环境或特定需求调整启动参数,那么,SpringBoot提供了哪些方式来配置这些启动参... 目录一、启动参数的常见传递方式二、通过命令行参数传递启动参数三、使用 application.pro

一文带你深入了解Python中的GeneratorExit异常处理

《一文带你深入了解Python中的GeneratorExit异常处理》GeneratorExit是Python内置的异常,当生成器或协程被强制关闭时,Python解释器会向其发送这个异常,下面我们来看... 目录GeneratorExit:协程世界的死亡通知书什么是GeneratorExit实际中的问题案例

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

Java中有什么工具可以进行代码反编译详解

《Java中有什么工具可以进行代码反编译详解》:本文主要介绍Java中有什么工具可以进行代码反编译的相关资,料,包括JD-GUI、CFR、Procyon、Fernflower、Javap、Byte... 目录1.JD-GUI2.CFR3.Procyon Decompiler4.Fernflower5.Jav