在後面的漏洞研究的學習中,必須要會的幾個知識點。反射機制和動態代理機制。至於反射的前面已經講到過了,這裡就不做更多的贅述了。反射是通過class文件去獲取對象對象的方法. ...
0x00動態代理
在後面的漏洞研究的學習中,必須要會的幾個知識點。反射機制和動態代理機制。至於反射的前面已經講到過了,這裡就不做更多的贅述了。反射是通過class文件去獲取對象對象的方法.
動態代理是給目標對象提供一個代理對象,並由代理對象控制對目標對象的引用。
0x01動態代理的基礎
用途:我們使用動態代理的作用是在不改變對象的方法的前提下,增強對象的功能
- 真實對象:被代理的對象
- 代理對象:
- 代理模式:代理對象為真實對象,達到增強真實對象功能的目的
實現的方式:
- 靜態代理:有一個類文件描述代理模式,類似於中介
- 動態代理:在記憶體中形成代理
0x02實現的步驟
-
代理對象和真實對象要實現相同的介面
-
代理對象=proxy.newInstance();
-
使用代理對象調用方法
-
增強方法
實現介面:
package proxyTest;
public interface computer {
public String method(double money);
String show();
}
實現真實對象:
package com.test.web.proxy;
public class lenveo implements computer{
@Override
public String method(double money) {
System.out.println("花了+"+money+"買的電腦");
return "電腦";
}
@Override
public String show() {
System.out.println("展示電腦");
return "展示電腦";
}
}
實現動態代理:
proxy的參數:
- (lenveo.getClass().getClassLoader()類載入器
- lenveo.getClass().getInterfaces()真實對象接入的介面
- 匿名內部類,執行器invoke
public class test {
public static void main(String[] args) {
lenveo lenveo = new lenveo();
computer proxy = (computer) Proxy.newProxyInstance(lenveo.getClass().getClassLoader(), lenveo.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("invoke方法執行了");
//相當於真實對象調用該方法
Object obj = method.invoke(lenveo, args);
return obj;
}
});
String method = proxy.method(3000);
proxy.show();
}
}
invoke的參數
- proxy:代理對象
- method:代理對象執行的方法
- args:代理對象調用方法適合傳遞的實際參數
增強方法
1.篡改參數
java
public class test {
public static void main(String[] args) {
lenveo lenveo = new lenveo();
//獲取傳入類載入器 //獲取傳入真實對象所有介面
computer proxy = (computer) Proxy.newProxyInstance(lenveo.getClass().getClassLoader(), lenveo.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("invoke方法執行了");
if (method.getName().equals(method)){
double money=(double) args[0];
money=money*85;
String Object obj =(String)method.invoke(lenveo,money);
return obj+"送你一套滑鼠";
}
else {
Object invoke = method.invoke(lenveo, args);
return invoke;
}
}
});
String method = proxy.show();
String show = proxy.show();
` System.out.println(proxy.method(200));`
}
}
0x03結尾
使用動態代理,代理對象調用任意方法,代理的invoke方法都會執行。
動態代理機制還是很重要的,這上面這是很簡單的一部分。