android http hook

package com.example.testhook;

import android.os.Build;
import android.util.Log;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
import static de.robv.android.xposed.XposedHelpers.findClass;
import static de.robv.android.xposed.XposedBridge.hookAllConstructors;
import static de.robv.android.xposed.XposedHelpers.getObjectField;

public class httpHook  {

    public static void initHooking(XC_LoadPackage.LoadPackageParam lpparam) throws NoSuchMethodException {

        final Class <?> httpUrlConnection = findClass("java.net.HttpURLConnection",lpparam.classLoader);

        hookAllConstructors(httpUrlConnection, new XC_MethodHook() {
            @Override
            protected void beforeHookedMethod(MethodHookParam param) {
                if (param.args.length != 1 || param.args[0].getClass() != URL.class)
                    return;
                XposedBridge.log("HttpURLConnection: " + param.args[0] + "");
                Log.d("httpHook : ","HttpURLConnection: " + param.args[0] + "");
            }
        });

        XC_MethodHook RequestHook = new XC_MethodHook() {
            @Override
            protected  void beforeHookedMethod(MethodHookParam param) throws Throwable{
                HttpURLConnection urlConn = (HttpURLConnection)param.thisObject;

                if(urlConn!=null)
                {
                    StringBuilder sb = new StringBuilder();
                    boolean isconnected = (boolean) getObjectField(param.thisObject,"connected");
                    if(!isconnected)
                    {
                        Map<String,List<String>> properties = urlConn.getRequestProperties();

                        if(properties!=null && properties.size()>0)
                        {
                            for(Map.Entry<String,List<String>> entry : properties.entrySet())
                            {
                                sb.append(entry.getKey()+":"+entry.getValue()+"\n");
                            }
                        }
                        Log.d("httpHook","HTTPrequest "+ "REQUEST: \nmethod="+urlConn.getRequestMethod()+" \nURL="+urlConn.getURL().toString()
                                +"\nHeader : "+ sb.toString()
                        );
                    }
                }
            }

        };
        XC_MethodHook ResponseHook = new XC_MethodHook() {
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                HttpURLConnection urlconn = (HttpURLConnection) param.thisObject;

                int code=urlconn.getResponseCode();
                if(code == 200){
                    Map<String, List<String>> properties = urlconn.getHeaderFields();

                    StringBuilder sb = new StringBuilder();
                    if(properties!=null && properties.size()>0){
                        for(Map.Entry<String,List<String>> entry:properties.entrySet())
                        {
                            sb.append(entry.getKey()+":"+entry.getValue()+"\n");
                        }
                        Log.d("httpHook","RESPONSE: method :"+urlconn.getRequestMethod()+"\nURL:"+urlconn.getURL().toString()+"\nheader: "+ sb.toString() );
                    }
                }
            }
        };
        findAndHookMethod("java.io.OutputStream", lpparam.classLoader, "write", byte[].class,int.class,int.class, new XC_MethodHook() {
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                OutputStream os = (OutputStream)param.thisObject;
                if(!os.toString().contains("internal.http"))
                    return;
                String print = new String((byte[]) param.args[0]);
                Log.d("httpHookDATA",print);
                Pattern pt = Pattern.compile("(\\w+=.*)");
                Matcher match = pt.matcher(print);
                if(match.matches())
                {
                    Log.d("httpHook : ","POST DATA: "+print);
                }
            }
        });

        findAndHookMethod("java.io.OutputStream", lpparam.classLoader, "write", byte[].class, new XC_MethodHook() {
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                OutputStream os = (OutputStream)param.thisObject;
                if(!os.toString().contains("internal.http"))
                    return;
                String print = new String((byte[]) param.args[0]);
                Log.d("httpHook : ","DATA: "+print);
                Pattern pt = Pattern.compile("(\\w+=.*)");
                Matcher match = pt.matcher(print);
                if(match.matches())
                {
                    Log.d("httpHook : ","POST DATA: "+print);
                }
            }
        });

        try {
            if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {

                findAndHookMethod("libcore.net.http.HttpURLConnectionImpl", lpparam.classLoader, "getOutputStream", RequestHook);
            } else {
                findAndHookMethod("com.android.okhttp.internal.http.HttpURLConnectionImpl", lpparam.classLoader, "getOutputStream", RequestHook);
                findAndHookMethod("com.android.okhttp.internal.http.HttpURLConnectionImpl", lpparam.classLoader, "getInputStream", ResponseHook);
            }
        } catch (Error e){
        }

    }
}

猜你喜欢

转载自blog.51cto.com/haidragon/2405169
今日推荐