/*----------------------------------------------------------------------------+
*| |
*| 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 Georges Bossert & Dimitri Kirchner.
* This class has been renamed to SystemManager to group
* PackageManager, SecurityManager and ActivityManager hookers.
*/
public class SystemHooker extends Hooker {
public static final String NAME = "System";
public SystemHooker() {
super(SystemHooker.NAME);
}
@Override
public void attach() {
attachOnPackageManagerClass();
attachOnActivityManagerClass();
attachOnSecurityManagerClass();
attachOnPowerManagerClass();
}
/**
* Attach on PackageManager class
*/
private void attachOnPackageManagerClass() {
Map<String, Integer> methodsToHook = new HashMap<String, Integer>();
methodsToHook.put("addPermission", 2);
methodsToHook.put("addPermissionAsync", 2);
methodsToHook.put("checkPermission", 0);
methodsToHook.put("getActivityInfo", 1);
methodsToHook.put("getAllPermissionGroups", 1);
methodsToHook.put("getApplicationEnabledSetting", 1);
methodsToHook.put("getInstalledPackages", 1);
// methodsToHook.put("getPackageInfo", 1); //This is quiet verbose and
// frequent...
methodsToHook.put("getPermissionInfo", 1);
methodsToHook.put("getServiceInfo", 1);
methodsToHook.put("getSystemSharedLibraryNames", 1);
methodsToHook.put("hasSystemFeature", 1);
methodsToHook.put("removePermission", 2);
methodsToHook.put("setComponentEnabledSetting", 2);
methodsToHook.put("setApplicationEnabledSetting", 2);
try {
hookMethods(null, "android.app.ApplicationPackageManager",
methodsToHook);
SubstrateMain
.log("hooking android.app.ApplicationPackageManager methods sucessful");
} catch (HookerInitializationException e) {
SubstrateMain
.log("hooking android.app.ApplicationPackageManager methods has failed",
e);
}
}
/**
* Attach on ActivityManager class.
*/
private void attachOnActivityManagerClass() {
final String className = "android.app.ActivityManager";
Map<String, Integer> methodsToHook = new HashMap<String, Integer>();
methodsToHook.put("clearApplicationUserData", 2);
methodsToHook.put("dumpPackageState", 1);
methodsToHook.put("getDeviceConfigurationInfo", 0);
methodsToHook.put("getLargeMemoryClass", 0);
methodsToHook.put("getMemoryClass", 0);
methodsToHook.put("getMemoryInfo", 0);
methodsToHook.put("getMyMemoryState", 0);
methodsToHook.put("getProcessMemoryInfo", 0);
methodsToHook.put("getProcessesInErrorState", 0);
methodsToHook.put("getRecentTasks", 0);
methodsToHook.put("getRunningAppProcesses", 0);
methodsToHook.put("getRunningServiceControlPanel", 0);
methodsToHook.put("getRunningServices", 0);
methodsToHook.put("getRunningTasks", 0);
methodsToHook.put("isLowRamDevice", 0);
methodsToHook.put("isRunningInTestHarness", 0);
methodsToHook.put("isUserAMonkey", 0);
methodsToHook.put("killBackgroundProcesses", 0);
methodsToHook.put("moveTaskToFront", 0);
methodsToHook.put("restartPackage", 0);
Map<String, Object> outputs = new HashMap<String, Object>();
outputs.put("isUserAMonkey", false);
try {
hookMethodsWithOutputs(null, className, methodsToHook, outputs);
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 SecurityManager
*/
private void attachOnSecurityManagerClass() {
final String className = "java.lang.SecurityManager";
Map<String, Integer> methodsToHook = new HashMap<String, Integer>();
methodsToHook.put("checkAccept", 0);
methodsToHook.put("checkAccess", 0);
methodsToHook.put("checkConnect", 0);
methodsToHook.put("checkCreateClassLoader", 0);
methodsToHook.put("checkDelete", 0);
methodsToHook.put("checkExec", 0);
methodsToHook.put("checkExit", 0);
methodsToHook.put("checkLink", 0);
methodsToHook.put("checkListen", 0);
methodsToHook.put("checkMulticast", 0);
methodsToHook.put("checkPackageAccess", 0);
methodsToHook.put("checkPackageDefinition", 0);
methodsToHook.put("checkPermission", 0);
methodsToHook.put("checkPrintJobAccess", 0);
methodsToHook.put("checkPropertiesAccess", 0);
methodsToHook.put("checkPropertyAccess", 0);
methodsToHook.put("checkRead", 0);
methodsToHook.put("checkSecurityAccess", 0);
methodsToHook.put("checkSetFactory", 0);
methodsToHook.put("checkSystemClipboardAccess", 0);
methodsToHook.put("checkWrite", 0);
methodsToHook.put("checkSecurityContext", 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 PowerManager class.
*/
private void attachOnPowerManagerClass() {
final String className = "android.os.PowerManager";
Map<String, Integer> methodsToHook = new HashMap<String, Integer>();
methodsToHook.put("goToSleep", 0);
methodsToHook.put("isScreenOn", 0);
methodsToHook.put("newWakeLock", 1);
methodsToHook.put("reboot", 1);
methodsToHook.put("userActivity", 1);
methodsToHook.put("wakeUp", 1);
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);
}
}
}