package mobi.acpm.inspeckage.hooks; import org.apache.http.HttpHost; import org.apache.http.conn.params.ConnRoutePNames; import org.apache.http.impl.client.DefaultHttpClient; import java.net.URI; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XSharedPreferences; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_LoadPackage; import mobi.acpm.inspeckage.Module; import static de.robv.android.xposed.XposedBridge.hookAllConstructors; import static de.robv.android.xposed.XposedHelpers.findAndHookMethod; /** * Created by acpm on 21/11/15. */ public class ProxyHook extends XC_MethodHook { public static final String TAG = "Inspeckage_Proxy:"; private static XSharedPreferences sPrefs; public static void loadPrefs() { sPrefs = new XSharedPreferences(Module.class.getPackage().getName(), Module.PREFS); sPrefs.makeWorldReadable(); } public static void initAllHooks(final XC_LoadPackage.LoadPackageParam loadPackageParam) { findAndHookMethod("java.net.ProxySelectorImpl", loadPackageParam.classLoader, "select", URI.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { loadPrefs(); if (sPrefs.getBoolean("switch_proxy", false)) { System.setProperty("proxyHost", sPrefs.getString("host", null)); System.setProperty("proxyPort", sPrefs.getString("port", null)); System.setProperty("http.proxyHost", sPrefs.getString("host", null)); System.setProperty("http.proxyPort", sPrefs.getString("port", null)); System.setProperty("https.proxyHost", sPrefs.getString("host", null)); System.setProperty("https.proxyPort", sPrefs.getString("port", null)); System.setProperty("socksProxyHost", sPrefs.getString("host", null)); System.setProperty("socksProxyPort", sPrefs.getString("port", null)); URI uri = (URI) param.args[0]; XposedBridge.log(TAG + " [P:" + sPrefs.getString("host", null) + ":" + sPrefs.getString("port", null) + "] - URI = " + uri); } } }); findAndHookMethod("java.net.ProxySelectorImpl", loadPackageParam.classLoader, "isNonProxyHost", String.class, String.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { loadPrefs(); if (sPrefs.getBoolean("switch_proxy", false)) { param.args[1] = "--inpeckage--"; } } }); hookAllConstructors(XposedHelpers.findClass("org.apache.http.impl.client.DefaultHttpClient", loadPackageParam.classLoader), new XC_MethodHook() { protected void afterHookedMethod(MethodHookParam param) throws Throwable { loadPrefs(); if (sPrefs.getBoolean("switch_proxy", false)) { String proxyHost = sPrefs.getString("host", null); int proxyPort; try { proxyPort = Integer.parseInt(sPrefs.getString("port", null)); } catch (NumberFormatException ex) { proxyPort = -1; } DefaultHttpClient httpClient = (DefaultHttpClient) param.thisObject; HttpHost proxy = new HttpHost(proxyHost, proxyPort); httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); } } }); } }