//加载器,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. Kubernets二进制安装(7)之部署主控节点服务--apiserver简介

    API Server简介 Kubernetes API Server提供了K8S各类资源对象(如:pod.RC.Service等)的增删改查及watch等HTTP Rest接口,是整个系统的数据总线和 ...

  2. Leetcode(2)-两数相加(包含链表操作的注意事项)

    给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...

  3. springboot使用RestTemplate+httpclient连接池发送http消息

    简介 RestTemplate是spring支持的一个请求http rest服务的模板对象,性质上有点像jdbcTemplate RestTemplate底层还是使用的httpclient(org.a ...

  4. Dapr 正式发布1.0

    年前我写了一篇博客<Dapr 已在塔架就位 将发射新一代微服务>, 今天Dapr 正式发布了1.0 : Dapr Runtime v1.0.0 Dapr dotnet SDK v1.0.0 ...

  5. js & document.execCommand

    js & document.execCommand click copy document.execCommand 已废弃 过时的 此功能已过时.尽管它可能在某些浏览器中仍然可以使用,但不建议 ...

  6. HTML5 动效

    HTML5 动效 motion graphics toolbelt for the web https://github.com/xgqfrms/mojs A collection of loadin ...

  7. what's the difference amount of pdf, epub, and mobi format

    what's the difference amount of pdf, epub, and Mobi format What is the difference between pdf, epub ...

  8. taro ref & wx.createSeletorQuery

    taro ref & wx.createSeletorQuery https://developers.weixin.qq.com/miniprogram/dev/api/wxml/wx.cr ...

  9. js IdleDetector 检测用户是否处于活动状态API

    btn.addEventListener("click", async () => { try { const state = await Notification.requ ...

  10. 如何快速搞定websocket

    5 个步骤快速掌握websocket消息发送和接收 1. 获取您的 appkey 先注册一个账号,登录后,创建一个应用,就能得到您的 appkey. 详情见 获取开发者账号和 appkey 2. 客户 ...