package com.sf.myapplication;
import android.app.NotificationManager;
import android.content.Context;
import android.util.Log;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
class SystemServiceHookUtil {
public static void hookNMS(MainActivity context) {
try {
NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
Method getService = NotificationManager.class.getDeclaredMethod("getService");
getService.setAccessible(true);
Class iNotiMngClz = Class.forName("android.app.INotificationManager");
Object proxyNotiMng = Proxy
.newProxyInstance(context.getClass().getClassLoader(), new Class[]{iNotiMngClz}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Log.d("invoke(). method:{}", method.getName());
return null;
}
});
Field sServiceField = NotificationManager.class.getDeclaredField("sService");
sServiceField.setAccessible(true);
sServiceField.set(notificationManager, proxyNotiMng);
} catch (Exception e) {
e.printStackTrace();
}
}
}
HOOK注意事项:
Hook 静态变量和单例,因为一旦创建对象,它们不容易变化,非常容易定位。
考虑 Android API 的变化,注意做好兼容