-
除了Hook技术,也可用ARouter(更推荐)技术。
-
Hook技术又称钩子函数。
- 它是处理消息的程序段,通过系统调用,把它挂入系统。
- 在系统没有调用函数之前,钩子程序就先捕捉该消息,那么钩子函数就先获得控制权。
- 这时钩子函数可以加工处理(改变)该函数的执法行为
- 还可以强制结束消息的传递
-
Hook实现途径:
- 找到Hook点----->找到Hook方法(执行前的代码)------->startActivity(系统,执行后代码)
Hook技术:
- JAVA层:反射,对象一定是静态, 才可以还原系统对象。
- NDK层::略
开发思想:
- 举例:灰太狼想吃懒洋洋,首先灰太狼必须伪装自己成羊,才可以接近懒洋洋、当擒获了羊之后、在把自己的羊皮摘掉恢复成狼
- 调用startctivity、伪装Intent。
阅读源码:
ActivityManager.getService() .startActivity == Singleton.Create() -==IActivityManager.startActivity
所以我们要通过反射
APP是一个事件性驱动 类似不断执行的Main函数 代码封装在 ActivityThread类中(main方法),里面封装着消息泵,通过handler发送消息,handler里封装着编码为100就是startActivity。我们通过钩子函数伪装就可以为所欲为 HooK点是mh(Handler)
//进程不死 此处looper就一直运转
public static void main(String[] args) {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");
SamplingProfilerIntegration.start();
// CloseGuard defaults to true and can be quite spammy. We
// disable it here, but selectively enable it later (via
// StrictMode) on debug builds, but using DropBox, not logs.
CloseGuard.setEnabled(false);
Environment.initForCurrentUser();
// Set the reporter for event logging in libcore
EventLogger.setReporter(new EventLoggingReporter());
// Make sure TrustedCertificateStore looks in the right place for CA certificates
final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
TrustedCertificateStore.setDefaultUserDirectory(configDir);
Process.setArgV0("<pre-initialized>");
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
thread.attach(false);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
}
// End of event ActivityThreadMain.
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
startActivty,就是handler发送一个100的消息,进行接下的操作,我们只需要让Handler设置接口,
public void handleMessage(Message msg) {
if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
switch (msg.what) {
case LAUNCH_ACTIVITY: {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
final ActivityClientRecord r = (ActivityClientRecord) msg.obj;
r.packageInfo = getPackageInfoNoCheck(
r.activityInfo.applicationInfo, r.compatInfo);
handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
} break;
}
网友评论