//加载器,apkPath为包含dex文件的.apk或jar路径,dexPath是优化后的dex文件路径,第三个表示libraryPath表示Native库的路径,最后是父类加载器
DexClassLoader classLoader= new DexClassLoader(apkPath, dexPath,null,getClassLoader());

try{
     //类,在加载类时,先检查父类是否已经加载过这个类?
     Class<?> mLoadClass=classLoader.loadClass("com.example.dexClassloaderslave.DexSlave");
     //构造器
     Constractor<?> constructor=mLoadClass.getConstructor(new Class[] {});
     //对象
     Object dexSlave=constructor.newInstance(new Object[]{});
     //方法
     Method sayHello=mLoadClass.getDeclareMethod("sayHello",new Class[]{});
     sayHello.setAccessible(true);
     sayHello.invoke(dexSlave,new Object[]{});
}catch...


ClassLoader localClassLoader=ClassLoader.getSystemClassLoader();
DexClassLoader localDexClassLoader=new DexClassLoader(dexpath,dexOutputPath,null,localClassLoader);
try{
     ...


//args代表传递给方法的参数,receiver表示哪个对象上调用该方法

public Object invoke (Object receiver, Object... args)



dalvik.system.DexFile也可以动态加载dex文件,但是它只能被VM调用。
因为:DexFile的构造器中,要在/data/dalvik-cache目录下生成dex文件,但是普通应用程序没有对该目录的写权限。





对被调用的.apk .jar文件可以采取以下措施保护:
  1. 完整性校验,防止文件被篡改
  2. 加密处理,调用加载前解密
  3. 对需要调用的函数相关信息通过网络获取方式;该方式可以真正实现动态调用,提高静态分析难度
  4. 对网络服务器分发的方式,注意对网络服务器地址的保护,不要以字符串硬编码方式写入代码中,对下载请求也需要使用cookie等辅助技术


JNI方式动态加载:
     static void com_mtn_javainject_CopyFile_callHook(JNIEnv *env, jclass,jstring path1, jstring path2, jstring className, jstring methodName){
          //找到ClassLoader
               jclass  classLoaderClass=env->FindClass("java/lang/ClassLoader");
               
               //找到ClassLoader的静态方法getSystemClassLoader
               jMethodID getsysLoaderMethod=env->GetStaticMethodID(classLoaderClass,"getSystemClassLoader","()Ljava/lang/ClassLoader:");

               //调用getSystemClassLoader方法,返回ClassLoader对象
               jobject loader=env->CallStaticObjectMethod(classLoaderClass,getsysLoaderMethod);

               //jar包存放位置
               jstring dexpath=path1;
               
               //优化后的jar包存放位置
               jstring dex_odex_path=path2;     

               

               //找到DexClassLoader类
               jclass dexLoaderClass=env->FindClass("dalvik/system/DexClassLoader");
               //获取DexClassLoader的构造函数ID
               jmethodID initDexLoaderMethod=env->GetMethodIDdexLoaderClass,"<init>",(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader:)V");
               //新建一个DexClassLoader对象
               jobject  dexLoader=env->NewObject(dexLoaderClass,initDexLoaderMethod,dexpath,dex_odex_path,NULL,loader);

               jmethodID findClassMethod=env->GetMethodID(dexLoaderClass,"findClass","(Ljava/lang/String;)Ljava/lang/Class;");
               //如果返回空,则找DexClassLoader的loadClass()方法--新版本SDK中
               if(NULL==findClassMethod){
                    findClassMethod=env->GetMethodID(dexClassLoader,"loadClass","(Ljava/lang/String;)Ljava/lang/Class;");
               }
               
               //存储需要调用的类,传入进来的
               jstring javaClassName=className;
               jclass javaClientClass=(jclass)env->CallObjectMethod(dexLoader,findClassMethod,javaClassName);
               
               //将jstring类型的方法名转换为utf-8编码的字符串,methodName是传进来的
               const  char *func=env->GetStringUFTChars(methodName,NULL);
               //获取加载的类中的方法
               jmethodID inject_method=env->GetStaticMethodID(javaClientClass,func,"()V");
               //调用加载的类中的静态方法
               env->CallStaticVoidMethod(javaClientClass,inject_method);
}


classLoader动态加载技术的更多相关文章

  1. 插件化开发—动态加载技术加载已安装和未安装的apk

    首先引入一个概念,动态加载技术是什么?为什么要引入动态加载?它有什么好处呢?首先要明白这几个问题,我们先从 应用程序入手,大家都知道在Android App中,一个应用程序dex文件的方法数最大不能超 ...

  2. flash的动态加载技术

    这里所说的动态加载技术, 主要是指代码模块(可以是swc也可以是swf)的动态加载.即主swf在运行的时候, 可以根据需要动态加载所需的代码模块. 为了讨论方便, 下面所说的代码模块都用swc表示,用 ...

  3. 【转】Android类动态加载技术

    http://www.blogjava.net/zh-weir/archive/2011/10/29/362294.html Android应用开发在一般情况下,常规的开发方式和代码架构就能满足我们的 ...

  4. Android动态加载技术初探

    一.前言: 现在,已经有实力强大的公司用这个技术开发应用了,比如淘宝,大众点评,百度地图等,之所以采用这个技术,实际上,就是方便更新功能,当然,前提是新旧功能的接口一致,不然会报Not Found等错 ...

  5. 【Android编程实战】源码级免杀_Dex动态加载技术_Metasploit安卓载荷傀儡机代码复现

    /文章作者:MG193.7 CNBLOG博客ID:ALDYS4 QQ:3496925334/ 在读者阅读本文章前,建议先阅读笔者之前写的一篇对安卓载荷的分析文章 [逆向&编程实战]Metasp ...

  6. Android动态加载技术(插件化技术)

    No1: 插件化技术的好处: 1)减轻应用的内存和CPU占用 2)实现热插拔,即在不发布新版本的情况下更新某些模块 No2: 插件化方案必须要解决三个基础性问题:资源访问.Activity生命周期的管 ...

  7. js 页面图片等元素在普通元素中滚动动态加载技术

    /*! * 2012-01-13 v1.1 偏移值计算修改 position → offset * 2012-09-25 v1.2 增加滚动容器参数, 回调参数 * 2015-11-17 v1.3 只 ...

  8. Android 插件技术:动态加载dex技术初探

    1.Android动态加载dex技术初探 http://blog.csdn.net/u013478336/article/details/50734108 Android使用Dalvik虚拟机加载可执 ...

  9. APK动态加载框架(DL)解析

    转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/39937639 (来自singwhatiwanna的csdn博客) 前言 好久 ...

随机推荐

  1. VS2010下创建MVC4项目注意事项

    1.安装VS SP1. 2.安装NuGet Package Manager. (1)打开VS2010,进入"工具--扩展管理器". (2)点击"联机库",等待搜 ...

  2. Python 3的f-Strings:增强的字符串格式语法(指南)

    最近也在一个视频网站的爬虫,项目已经完成,中间有不少需要总结的经验. 从Python 3.6开始,f-Strings是格式化字符串的一种很棒的新方法.与其他格式化方式相比,它们不仅更具可读性,更简洁且 ...

  3. Pymongo 笔记

    Pymongo 1.MongoDB概念 MongoDB是一种非关系型数据库(NoSQL),MongoDB数据存储于内存,内存不足则将热度低数据写回磁盘.存储的数据结构为文档.每个数据库包含若干集合(c ...

  4. 美团CodeM资格赛第二题

    锦标赛 时间限制:1秒 空间限制:32768K 组委会正在为美团点评CodeM大赛的决赛设计新赛制.比赛有 n 个人参加(其中 n 为2的幂),每个参赛者根据资格赛和预赛.复赛的成绩,会有不同的积分. ...

  5. Java开发工程师最新面试题库系列——Java基础部分

    JAVA基础 面向对象有哪些特征? 答:继承.封装.多态 JDK与JRE的区别是什么? 答:JDK是java开发时所需环境,它包含了Java开发时需要用到的API,JRE是Java的运行时环境,JDK ...

  6. 如何优雅的阅读 GitHub 上开源 js 框架和库的源码

    如何优雅的阅读 GitHub 上开源 js 框架和库的源码 step 先总后分,即先了解一下啊框架的大体架构,又一个全局的认识,在选择某些和感兴趣的部分,仔细阅读,各个击破: 带着问题阅读,用到了什么 ...

  7. taro alipay

    taro alipay 开发指南 https://nervjs.github.io/taro/docs/GETTING-STARTED.html#支付宝小程序 { "name": ...

  8. js generator和yield

    function co<T>(fn: () => Generator<any, any, any>): Promise<T> { const g: Gener ...

  9. Flutter ColorFiltered 将ColorFilter应用于其子级。

    ColorFiltered ColorFilter BlendMode Example <summary>main.dart</summary> import 'package ...

  10. go-admin在线开发平台学习-4[细节解析]

    紧接着上一期的内容,继续对go-admin的一些细节进行解析. 通用的增删改查方法 在go-admin/common/actions下封装了通用的增删改查方法.在对这些方法进行说明前,先移步到另一个文 ...