当前位置:编程学习 > wap >>

java程序如何hook?

先说下背景

我需要的是在安卓平台上 HOOK某个进程的JAVA代码
这两天查了很多资料 以为反射可以做到,发现根本不是一回事。

Windows平台的HOOK的意思是 钩子

在你想HOOK的某处代码 通过各种方法 执行到你的代码上 

现在要做的是 某安卓进程中的JAVA代码 A方法调用B方法

我想在A方法调用B方法的时候 拦截到A传给B的参数进行过滤

不知道JAVA中怎么做到这样。 

说到底,就是我要把B方法完全替换成我的代码。不知道这样说是否能明白 --------------------编程问答-------------------- 其实反射可以做到的。
Spring里面就有AOP的例子类似这个。 --------------------编程问答--------------------
引用 1 楼 birdsaction 的回复:
其实反射可以做到的。
Spring里面就有AOP的例子类似这个。


敢不敢详细说明啊大哥。。。

昨天看AOP  没觉得是我要的东西。。 --------------------编程问答-------------------- 这个就是个类似于过滤器的功能。
AOP你用一下就知道了,
当你A调用B的时候,中间有个C能得到A传给B的东西,

如果不用AOP,可以用JAVA动态代理能达到你的要求。 --------------------编程问答--------------------

package com.birds.aop;

public interface Action {
   public void process(String msg);
}

package com.birds.aop;

public class MyAction implements Action {

@Override
public void process(String msg) {
System.out.println("result:" + msg);
}

}

public class MyHandler implements InvocationHandler {

private Object obj;

public MyHandler() {

}

public Object newProx(Object obj){
this.obj = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
}

/*
 * (non-Javadoc)
 * 
 * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
 * java.lang.reflect.Method, java.lang.Object[])
 */
@Override
public Object invoke(Object arg0, Method method, Object[] arg2)
throws Throwable {
System.out.println("=============" + method + "," + arg2);
if (arg2 != null) {
for (Object pm : arg2) {
System.out.println("what:" + pm);
}
}
return null;
}

public static void main(String[] args) {
MyHandler handler = new MyHandler();
Action action = (Action) handler.newProx(new MyAction());
action.process("Hello,guys");
}
}


只要执行process方法,就会自动调用invoke方法,你在这个方法里面能看到是什么参数,调用了什么方法。
--------------------编程问答--------------------
引用 4 楼 birdsaction 的回复:

package com.birds.aop;

public interface Action {
   public void process(String msg);
}

package com.birds.aop;

public class MyAction implements Action {

@Override
public void process(String msg) {
System.out.println("result:" + msg);
}

}

public class MyHandler implements InvocationHandler {

private Object obj;

public MyHandler() {

}

public Object newProx(Object obj){
this.obj = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
}

/*
 * (non-Javadoc)
 * 
 * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
 * java.lang.reflect.Method, java.lang.Object[])
 */
@Override
public Object invoke(Object arg0, Method method, Object[] arg2)
throws Throwable {
System.out.println("=============" + method + "," + arg2);
if (arg2 != null) {
for (Object pm : arg2) {
System.out.println("what:" + pm);
}
}
return null;
}

public static void main(String[] args) {
MyHandler handler = new MyHandler();
Action action = (Action) handler.newProx(new MyAction());
action.process("Hello,guys");
}
}


只要执行process方法,就会自动调用invoke方法,你在这个方法里面能看到是什么参数,调用了什么方法。



你好,你这个应该不能完成我想要的。你这个只是监视而已。我昨天看了。

我要的不是监视,监视的话  反射我都不需要的。我只需要注册个消息。

我需要的是   当A调用B的时候,调用的B是我的代码,由我的代码决定传给B的是什么。


你们搞JAVA的是不是根本不需要hook的啊?
或者你们搞java的都不用Windows平台吗?你们可以看看Windows平台hook的意思。

我要的是那个。


现在 A点到B点是直达的。

我要实现的是,在A点到B点这个过程中设立关卡。这样总能明白了吧?
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,