我将静态代码分析与动态分析相结合。我基本上创建了一个新活动并将其设置为启动活动。在运行期间,应该调用现有活动中的各种方法。
我可以打电话给但是,来自外部的onCreate
,对Activity
的超级调用将失败(或调用SharedPreferences或其他有趣的类),因为Android在使用意图调用活动时执行一些初始化操作(例如设置上下文)。但我需要以某种方式从外部调用onCreate
或onPause
等方法,同时为目标活动提供有效的上下文。
在我新创建的活动中,我有一个有效的上下文。我尝试通过调用ContextWrapper.attachBaseContext
传递它,但由于缺少上下文,因此在Android中某处仍有NullPointerException
。有没有办法以某种方式将其破解为工作状态?使用反射或其他黑客攻击是没有问题的,因为它仅用于分析目的。
非常感谢您的任何提示。我可以通过任何方式修改分析的应用程序,以实现这一目标。
但是:使用Intent是没有选择的,因为我无法控制调用哪些Activity方法,时间和频率。我知道android并没有直接调用这些方法,但它也不是常见的用例:);
答案 0 :(得分:0)
我创建了一个hack,这似乎有所帮助(我可以在黑客活动中获得有效的上下文)。让我们看看我使用它有多远。 public static void hack(Activity hack,Activity main){ 尝试{ Field mActivityInfo = getField(Activity.class,“mActivityInfo”); mActivityInfo.set(hack,getClass(“android.content.pm.ActivityInfo”)。newInstance()); 字段mFragments = getField(Activity.class,“mFragments”); 字段mContainer = getField(Activity.class,“mContainer”); Field mApplication = getField(Activity.class,“mApplication”); 字段mWindow = getField(Activity.class,“mWindow”); FragmentManagerImpl = getClass(“android.app.FragmentManagerImpl”); FragmentManager manager =(FragmentManager)mFragments.get(hack);
mApplication.set(hack, main.getApplication());
mWindow.set(hack, main.getWindow());
Class<?> FragmentContainer = getClass("android.app.FragmentContainer");
Method attachActivity = getMethod(FragmentManagerImpl, "attachActivity", Activity.class, FragmentContainer, Fragment.class);
attachActivity.invoke(manager, hack, mContainer.get(hack), null);
Method attachBaseContext = getMethod(ContextWrapper.class, "attachBaseContext", Context.class);
attachBaseContext.invoke(hack, new HackContext(main));
System.out.println("Hack performed");
} catch (Exception e) {
e.printStackTrace();
System.err.println("Hack failed :(");
}
}