安卓动态代理

博客探讨了安卓动态代理的实现,包括静态代理和动态代理的原理,并着重讲解了如何利用动态代理hook方法,尤其是getHardwareAddress。文章提到了在Android中动态代理广泛应用于系统服务的获取,通过代理可以实现方法增强和拦截。同时,文中详细阐述了获取Mac地址的流程,涉及到NetworkInterface类和相关方法。此外,还讨论了libcore.io.Libcore在动态代理中的作用和MzPush SDK对隐私的影响。
摘要由CSDN通过智能技术生成

在这里插入图片描述


https://blog.csdn.net/u011016373/article/details/82863710

代理可以实现方法增强,也可以实现方法拦截,通过代理方法修改原方法的参数和返回值
在这里插入图片描述

静态代理

自定义一个类implements实现某个接口里面的方法
这种方式需要为每个代理写一个自定义类,而且无法拦截

动态代理

JVM在运行的时候动态生成一系列代理类
就是hook方法
先找点需要hook的对象,静态变量或单例

注意jdk动态代理只能代理接口,所以想代理类的话需要先手写静态代理类覆盖掉原始的方法

使用Class.forName(“模块名.包名.类名.类型名”)可以获取某个参数类型类
比如Class.forName(“android.net.wifi.IWifiManager”);
在这里插入图片描述
类名.class.getDeclaredField(“变量名”);可以获取某个类里的变量
比如
serviceField = WifiManager.class.getDeclaredField(“mService”);
这个mService变量的类型是IWifiManager
可以设置下这个变量的可控性
serviceField.setAccessible(true);

这个IManager类型的service获取了
但是实际的WiFi管理器是使用app上下文从系统服务里获取的
然后使用这个IWifiManager服务变量获取app的原生wifiobj,把这个wifiobj传入自定义的操作触发器获取到自定义的触发器的代理实例
之后使用Imanager类型的服务变量的set方法,传入获取到的现有的WiFi管理器和使用这个WiFi管理器的WiFiobj重构的WiFi管理器
新的WiFi管理器是需要使用反射类里的代理方法重构处理的,需要传入WiFi服务变量的缓存,这个WiFi服务的新的类实例和自定义的重构的WiFi服务被触发的时候的方法才可以得到真正的WiFi控制器类

现在要动态代理的是getHardwareAddress方法,这个方法由什么在控制呢
这个方法在NetworkInterface。java里
所以我们需要替代的是这个类,然后重新里面获取硬件信息的方法

原理

Subject subject = new RealSubject();
ProxySubject proxy = new ProxySubject(subject);
Subject sub = (Subject) Proxy.newProxyInstance(subject.getClass().getClassLoader(),
        subject.getClass().getInterfaces(), proxy);
sub.operation();
public class ProxySubject implements InvocationHandler
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>