//加载器,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下如何查看类的内存布局

    用VS2010查看类的内存布局,这里用两种方法 (1)MSVC有个隐藏的"/d1"开关,通过这个开关可以查看项目中类的内存布局情况. 修改项目属性,添加"/d1 repo ...

  2. Spring配置声明式事务

    Spring的事务有两种配置,一种是编程式,另一种是声明式,这里我们配置的是声明式事务 <?xml version="1.0" encoding="UTF-8&qu ...

  3. Gif2mp4 by Python

    参考链接 目的: $ .gif \rightarrow .mp4 $ 解决: pip install MoviePy import moviepy.editor as mp clip = mp.Vid ...

  4. surge & free online docs website service

    surge & free online docs website service surge 自定义域的域名 https://surge.sh/help/adding-a-custom-dom ...

  5. Web 实时通信方案 All In One

    Web 实时通信方案 All In One HTTP 轮询, 单向通信,开销大 HTTP 长轮询, 单向通信,开销较小 WebSocket,双向通信,开销小 (TCP 高延迟,保证数据完整性) Ser ...

  6. how to remove git commit history

    how to remove git commit history 如何删除 GitHub 仓库的历史数据 git filter-branch remove GitHub git commit hist ...

  7. js in depth: event loop & micro-task, macro-task & stack, queue, heap & thread, process

    js in depth: event loop & micro-task, macro-task & stack, queue, heap & thread, process ...

  8. Datahero Inc利用区块链溯源,造福各行各业

    近些年来,随着区块链技术的不断崛起以及快速发展,越多越多的人提出将区块链技术引入到溯源系统当中,溯源也成为了区块链技术的重要应用场景之一. 目前,Datahero inc已建设一整套的溯源平台系统,基 ...

  9. 在.NET Core 中使用 FluentValidation 进行规则验证

    不用说,规则验证很重要,无效的参数,可能会导致程序的异常. 如果使用Web API或MVC页面,那么可能习惯了自带的规则验证,我们的控制器很干净: public class User { [Requi ...

  10. css中的transform,transition,translate的关系

    transform 旋转(transform是没有动画效果,你改变了它的值,元素的样子就唰的改变了.其中的位移的函数名就叫translate,所以说,translate是transform的一部分.) ...