首页
社区
课程
招聘
[原创]root加载jni
发表于: 2014-6-13 18:27 6339

[原创]root加载jni

2014-6-13 18:27
6339
最近下载了一份code,主要是在root的基础上,向system/bin中拷贝一份执行文件,并且修改为root执行权限,此后,apk只需要通过这个执行文件,就可以实现永久root。
    在这个代码基础上,利用可执行文件,运行app_process,实现root执行class中方法,在这个方法中,我进行NDK的加载和native方法的使用。但是存在如下问题。
     1.app_process方式运行的方法,没有应用的上下文,也就是context,application等都不存在。所以在jni中所实现的功能,不能依靠应用上下文。
     代码如下:
     a.
     String[] progArray = new String[] {
                        JniCall.ROOT_SU,//这里就是system/bin下的执行文件,其实就是sh调用
                        "-c",
                        "export CLASSPATH="
                        + classpath
                        + " && export      LD_LIBRARY_PATH=/vendor/lib:/system/lib:"
                        + LibraryDir
                        + " && exec app_process /data/app "
                        + minePkgName + "/RootUtil " + minePkgName + " "
                        + LibraryDir};
                               
                        RootUtil.exeCmd(progArray);
                        jni.nativeTraceMe();
      b.
      public static void main(String[] args) {
            Jni.Init();
            //是activity中定义的静态方法,返回context,但是被root下执行后,取值为空。
            Context context = TestApplication.getInstance();
            DexClassLoader dLoader = Jni.JniLoad(context);
      }
      
     2.在上面a处理完成,调用ndk的接口nativeTraceMe,会提示找不到对应的方法。
        java.lang.UnsatisfiedLinkError: Native method not found: com.example.test.RootUtil.nativeTraceMe:(Landroid/content/Context;)I
        不明白为什么,既然ndk加载进系统,怎么就不能使用其方法呢。
     3.b中的dLoader,如何在shell结束后传递会app中?
     4.在base_classdex加载jar后,一定要按照如下设定加载环境,才可以使用dex中的内容吗?
        这里jar其实就是应用中部分activity的处理,单独打包成jar,资源还是app中的。
        环境配置如下:
        Object currentActivityThread = RefInvoke.invokeStaticMethod(
                                        "android.app.ActivityThread",
                                        "currentActivityThread",
                                        new Class[] {}, new Object[] {});
        String packageName = getPackageName();
        HashMap mPackages = (HashMap) RefInvoke.getFieldOjbect(
                                        "android.app.ActivityThread", currentActivityThread,
                                        "mPackages");
        WeakReference wr = (WeakReference) mPackages.get(packageName);
        RefInvoke.setFieldOjbect("android.app.LoadedApk", "mClassLoader",
                                        wr.get(), dLoader);

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回