/*----------------------------------------------------------------------------+
*| |
*| Android's Hooker |
*| |
*+---------------------------------------------------------------------------+
*| Copyright (C) 2011 Georges Bossert and Dimitri Kirchner |
*| This program is free software: you can redistribute it and/or modify |
*| it under the terms of the GNU General Public License as published by |
*| the Free Software Foundation, either version 3 of the License, or |
*| (at your option) any later version. |
*| |
*| This program is distributed in the hope that it will be useful, |
*| but WITHOUT ANY WARRANTY; without even the implied warranty of |
*| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
*| GNU General Public License for more details. |
*| |
*| You should have received a copy of the GNU General Public License |
*| along with this program. If not, see <http://www.gnu.org/licenses/>. |
*+---------------------------------------------------------------------------+
*| @url : http://www.amossys.fr |
*| @contact : android-hooker@amossys.fr |
*| @sponsors : Amossys, http://www.amossys.fr |
*+---------------------------------------------------------------------------+
*/
package com.amossys.hooker.hookers;
import java.util.HashMap;
import java.util.Map;
import com.amossys.hooker.SubstrateMain;
import com.amossys.hooker.exceptions.HookerInitializationException;
/**
* @author Dimitri Kirchner.
* Hooker to attach on reflection classes.
* This class may sometimes trigger a stacktrace, but it's not impacting the analysis...
*/
public class ReflectionHooker extends Hooker {
public static final String NAME = "ReflectionHooker";
public ReflectionHooker() {
super(ReflectionHooker.NAME);
}
@Override
public void attach() {
attachOnClass();
// attachOnClassNotFoundException(); //It brings errors
attachOnClassLoader();
attachOnFieldClass();
attachOnMethodClass();
}
/**
* Attach on class Class.
*/
private void attachOnClass() {
final String className = "java.lang.Class";
Map<String, Integer> methodsToHook = new HashMap<String, Integer>();
methodsToHook.put("forName", 0);
methodsToHook.put("isInstance", 0);
methodsToHook.put("getClasses", 0);
methodsToHook.put("getClassLoader", 0);
methodsToHook.put("getConstructor", 0);
methodsToHook.put("getDeclaredClasses", 0);
methodsToHook.put("getDeclaredFields", 0);
methodsToHook.put("getDeclaredMethods", 0);
methodsToHook.put("getDeclaredConstructors", 0);
methodsToHook.put("getDeclaredField", 0);
methodsToHook.put("getDeclaredMethod", 0);
methodsToHook.put("getDeclaredConstructor", 0);
methodsToHook.put("getResourceAsStream", 0);
methodsToHook.put("getResource", 0);
methodsToHook.put("getProtectionDomain", 0);
methodsToHook.put("newInstance", 0);
methodsToHook.put("getName", 0);
methodsToHook.put("getPackage", 0);
methodsToHook.put("getField", 0);
methodsToHook.put("getFields", 0);
try {
hookMethods(null, className, methodsToHook);
SubstrateMain.log(new StringBuilder("hooking ").append(className)
.append(" methods sucessful").toString());
} catch (HookerInitializationException e) {
SubstrateMain.log(new StringBuilder("hooking ").append(className)
.append(" methods has failed").toString(), e);
}
}
/**
* Attach on class ClassLoader.
*/
private void attachOnClassLoader() {
final String className = "java.lang.ClassLoader";
Map<String, Integer> methodsToHook = new HashMap<String, Integer>();
//methodsToHook.put("loadClass", 0); //This is looping with our Hooker.
methodsToHook.put("getSystemClassLoader", 0);
methodsToHook.put("getSystemResource", 0);
methodsToHook.put("getSystemResources", 0);
methodsToHook.put("getResource", 0); //same in class
methodsToHook.put("getResources", 0);
methodsToHook.put("findResource", 0);
methodsToHook.put("findResources", 0);
methodsToHook.put("getResourceAsStream", 0); //same in class
methodsToHook.put("getSystemResourceAsStream", 0);
methodsToHook.put("setClassAssertionStatus", 0);
methodsToHook.put("clearAssertionStatus", 0);
methodsToHook.put("setPackageAssertionStatus", 0);
methodsToHook.put("setDefaultAssertionStatus", 0);
try {
hookMethods(null, className, methodsToHook);
SubstrateMain.log(new StringBuilder("hooking ").append(className)
.append(" methods sucessful").toString());
} catch (HookerInitializationException e) {
SubstrateMain.log(new StringBuilder("hooking ").append(className)
.append(" methods has failed").toString(), e);
}
}
/**
* Attach on class Field.
*/
private void attachOnFieldClass() {
final String className = "java.lang.reflect.Field";
Map<String, Integer> methodsToHook = new HashMap<String, Integer>();
methodsToHook.put("get", 0);
methodsToHook.put("getBoolean", 0);
methodsToHook.put("getByte", 0);
methodsToHook.put("getChar", 0);
methodsToHook.put("getShort", 0);
methodsToHook.put("getInt", 0);
methodsToHook.put("getLong", 0);
methodsToHook.put("getFloat", 0);
methodsToHook.put("getDouble", 0);
methodsToHook.put("set", 0);
methodsToHook.put("setBoolean", 0);
methodsToHook.put("setByte", 0);
methodsToHook.put("setChar", 0);
methodsToHook.put("setShort", 0);
methodsToHook.put("setInt", 0);
methodsToHook.put("setLong", 0);
methodsToHook.put("setFloat", 0);
methodsToHook.put("setDouble", 0);
try {
hookMethods(null, className, methodsToHook);
SubstrateMain.log(new StringBuilder("hooking ").append(className)
.append(" methods sucessful").toString());
} catch (HookerInitializationException e) {
SubstrateMain.log(new StringBuilder("hooking ").append(className)
.append(" methods has failed").toString(), e);
}
}
/**
* Attach on class Method.
*/
private void attachOnMethodClass() {
final String className = "java.lang.reflect.Method";
Map<String, Integer> methodsToHook = new HashMap<String, Integer>();
methodsToHook.put("getName", 0); //same in class
methodsToHook.put("getModifiers", 0);
methodsToHook.put("getTypeParameters", 0);
methodsToHook.put("getReturnType", 0);
methodsToHook.put("getGenericReturnType", 0);
methodsToHook.put("getParameterTypes", 0);
methodsToHook.put("getGenericParameterTypes", 0);
methodsToHook.put("equals", 0);
methodsToHook.put("invoke", 0);
try {
hookMethods(null, className, methodsToHook);
SubstrateMain.log(new StringBuilder("hooking ").append(className)
.append(" methods sucessful").toString());
} catch (HookerInitializationException e) {
SubstrateMain.log(new StringBuilder("hooking ").append(className)
.append(" methods has failed").toString(), e);
}
}
}