Vdex Extractor 一款命令行工具,用于从Vdex文件反编译和提取Android Dex字节码的工具。...(don't de-odex) --deps : 转储经过验证的依赖信息 --dis : 启用字节码反汇编器 --ignore-crc-error...Unquickening解码器 Vdex文件包含所有quick_info数据(旧vtable),用于恢复字节码优化过程中应用的dexto -dex转换。...验证迭代器的依赖关系 当第一次编译(优化)Dex字节码文件时,dex2oat将执行验证依赖项收集器,作为方法学验证者的一部分。...但是,由于该工具未实现Dex IR,因此无法在不使用外部工具的情况下将Cdex文件转换回标准Dex。
文章目录 一、 热修复框架简介 1、类替换 2、so 替换 3、资源替换 4、全平台支持 5、生效时间 6、性能损耗 7、总结 二、 将 Java 字节码文件打包到 Dex 文件 一、 热修复框架简介..., 然后转为 dex 文件 , 打包到 apk 中 , 然后在 Android 平台的 Dalvik虚拟机 或 Art 虚拟机中执行 ; 类替换就是将 Java 类编译后的字节码 , 进行完整的替换...Class 字节码文件 , 需要转为 Dex 格式 , 才能在 Android 虚拟机中执行 ; 获取字节码文件 : 字节码文件在 Module 目录下的 " build\intermediates\...javac\debug\classes " 目录中 , 如下图所示 ; 将需要修复的 Class 字节码文件保留 , 删除不需要修复的字节码文件 ; 这里只需要修改 MainActivity.Java...源码 , 只保留该文件的字节码文件 MainActivity.class , 其它文件删除 ; 将需要修复的 Class 字节码文件打包成 dex 文件 : 将上述整个 " build\intermediates
实例对象作为 PathClassLoader 的父节点 二、完整代码示例 三、执行结果 四、博客资源 前言 ---- 在 上一篇博客 【Android 逆向】启动 DEX 字节码中的 Activity...组件 ( 替换 LoadedApk 中的类加载器 | 加载 DEX 文件中的 Activity 类并启动成功 ) 中 , 通过 替换 LoadedApk 中的类加载器可以成功加载 DEX 字节码文件中的...Activity 类 , 并成功启动 Activity ; 本篇博客中尝试使用 【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 使用 DexClassLoader 获取组件类失败...字节码文件路径 optFile.getAbsolutePath(), // 优化目录 libFile.getAbsolutePath...文件拷贝完毕"); } return dexPath; } /** * 测试调用 Dex 字节码文件中的方法 * * @
但是这篇论文LLM2Vec,可以将任何的LLM转换为文本嵌入模型,这样我们就可以直接使用现有的大语言模型的信息进行RAG了。...嵌入模型和生成模型 嵌入模型主要用于将文本数据转换为数值形式的向量表示,这些向量能够捕捉单词、短语或整个文档的语义信息。...在论文中对encoder-only和decoder-only模型的特点进行了讨论,特别是在解释为什么将decoder-only的大型语言模型(LLM)转换为有效的文本编码器时。...LLM2Vec 在论文中提出了一种名为LLM2Vec的方法,用于将仅解码器的大型语言模型(LLM)转换为强大的文本编码器。...利用LLM2Vec将Llama 3转化为文本嵌入模型 首先我们安装依赖 pip install llm2vec pip install flash-attn --no-build-isolation
它可以支持已转换为 .dex 格式的 Java 应用程序的运行,.dex 格式是专为Dalvik 设计的一种压缩格式,适合内存和处理器速度有限的系统。...的dex字节码文件: 详见:使用dx将class转dex总结 ?...在 Dalvik 下,应用每次运行的时候,字节码都需要通过即时编译器(just in time ,JIT)转换为机器码,这会拖慢应用的运行效率,而在ART 环境中,应用在第一次安装的时候,字节码就会预先编译成机器码...为了在 JVM 优化出一个 Dalivk 虚拟机,所以把 JVM 运行的 class 文件进行打包优化为 dex 文件,但其本质还是和 class 文件一样属于字节码文件。...但是为了每次启动时都去掉从字节码到机器码的编译过程,Google 又从 Dalivk 中优化出了 ART,在其安装应用的时候将 dex 文件进行预处理生成可执行的 oat 文件。
数组类型 Lpackage/name/ObjectName;->FieldName:Ljava/lang/String; 字段格式:类型(包名+类名)-> 字段名称:字段类型 dalvik 指令 基础字节码...- 名称后缀/字节码后缀 目的寄存器 源寄存器 nop 空操作指令,值为 00,对其代码,无实际操作 move 数据操作指令 move 作用: 1、赋值 2、接受方法返回值操作 3...、处理异常操作 move vA, vB 将 vB 寄存器的值赋给 vA 寄存器,源寄存器和目的寄存器都为 4 位 move-wide vA, vB 为 4 位的寄存器赋值,源和目的寄存器都为 4...这条指令占用两个字节,值为 0xooff (Android4.0新增) 实例操作指令 check-cast vAA, type@BBBB 将 vAA 寄存器中的对象引用转换为指定类型 instance-of...1转换为数据类型2 数据运算指令 add/sub/mul/div/rem 加、减、乘、除、模 and/or/xor 与、或、异或 shl/shr/ushr 有符号左移、有符号右移、无符号右移
Smali 是一种低级语言,比 Java 字节码更接近汇编语言,但比原始的字节码更易于人类阅读和编辑。...三、技术原理 3.1 Smali/Baksmali 这是 apktool 使用的工具,用于将 DEX 文件转换为 smali 代码,以及将修改后的 smali 代码转换回 DEX 文件。...通过 baksmali,我们可以将这些字节码转换成 smali 代码,smali 是一种更接近于汇编语言的中间表示形式,它比原始的字节码更易于阅读和编辑。...反汇编字节码:对于 DEX 文件中的每个方法,baksmali 将其包含的字节码指令序列转换为 smali 指令。...这一步是反汇编过程的核心,涉及将低级的字节码指令(如操作寄存器的指令、分支、调用等)转换为相对易懂的 smali 格式。
前情提要 今天上班的时候,我的一位专于web安全的网友联系我,让我帮忙分析一款app的架构和运行方式。虽然之前没有弄过这一块,但是出于好奇,也希望在安卓相关方面多接触点陌生的东西,我欣然地接受了。...下载反编译工具 反编译用到的相关工具主要有三个,分别为: dex2jar jd-gui AndroidCrackTool 三者的作用分别是: 将dex文件转为jar文件 查看jar包里的源码 字节码转源码...使用反编译工具 反编译工具的使用操作步骤如下: 得到dex文件 使用解压工具将apk安装包解压缩,在解压后的文件根目录下得到以classes.dex命名的dex文件。...dex文件转jar文件 下载好反编译工具并解压后得到命名为dex2jar-0.0.9.15的文件夹,将classes.dex文件拷贝至该文件夹下,打开终端,执行命令: cd dex2jar-0.0.9.15...但是查看直接解压后的manifest文件,我们可以看到里面只有十六进制的字节码,这时候我们需要用到AndroidCrackTool工具。 ?
中赋值,并且之前没有付过非默认值,且此次赋值是默认值,那么这个赋值就是可以优化的 实现: 1.遍历init,clinit的字节码找到putField和putStatic指令 2.过滤不是当前类的变量,指令中可以看到...5.遍历完整个字节码之后进行统一删除 删除无用代码 一.使用proguard 的 -assumenosideeffects配置消除无副作用的函数调用 当方法不会修改堆上某个对象或者栈上方法参数的值时,...强转 如果不记录该类型之后比对的时候就会有疑惑,入栈string,出栈的是int??...找到getsatic指令,分析其访问的字段是否在1中出现,接着消除这条指令替换为对应的常量入栈即可 风险: 替换为直接传播后如果不在同一个dex文件会有dex体积变大的风险。...观察字节码会发现访问R文件的getstatic指令会变成ldc直接引入id常量 module:未使用常量消除 由于R文件中的id不能重复,而原生的aapt是根据类别和顺序生成的资源id,是固定的。
) 将 Java 字节码转换为 Dalvik 字节码,并将所有生成的类打包到统一的 DEX 文件中,最终和资源文件一起 zip 压缩为 .apk 文件。...; } 加载过程首先将 vdex 映射到内存中,然后将已经映射到内存中的 dex 或者在磁盘中的 dex 转换为 DexFile 结构体,最后再将 vdex 和 oat 文件关联起来。...安全加固 了解过 Android 逆向工程的人应该都知道,基于 Java 编译出来的 Dalvik 字节码其实很好理解,加上一些开源或者商业的反编译工具,甚至可以将字节码还原为和源代码非常接近的 Java...如果当前内存中的 dex 部分偏移被恶意修改,那么还可以通过 method->GetCodeItem() 获取对应方法解密后的字节码地址进行手动转储恢复。...,将字节码的执行顺序打乱,插入各种无效指令来阻碍逆向工程;又或者将字节码的实现抽批量自动取到 JNI 层,并辅以二进制级别的安全加固,这种方案通常称为 Java2C,即将 Java 代码转译成 C 代码编译来防止逆向分析
系统中执行 Java 程序 , 【开发环境】Android 命令行中执行 Java 程序 ( IntelliJ IDEA 中创建 Java / Kotlin 工程 | dx 打包 DEX 字节码文件...| dalvikvm 命令 ) , 出现的错误记录 ; 一、Android 命令行与 PC 可执行 JAR 文件不兼容 ---- 尝试将 【开发环境】Android 命令行中执行 Java 程序 ( IntelliJ...IDEA 中创建 Java / Kotlin 工程 | dx 打包 DEX 字节码文件 | dalvikvm 命令 ) 三、编译在 PC 上可执行的 Java / Kotlin JAR 包 生成的 JAR...包打包成 dex 文件 , 打包过程中出错 ; 报错信息 : D:\002_Project\003_Java_Work\workspace\AndroidShell\out\artifacts>dx...BuiltInsResourceLoader.class 1 error; aborting D:\002_Project\003_Java_Work\workspace\AndroidShell\out\artifacts> 直接打包字节码文件是成功的
dex文件最终会和资源文件等一起打包成为apk,签名后安装到手机上。...在dex文件中,方法体里面的内容最终存储在classData区域,方法体里面存储的是二进制的字节码。...文件,解析字节码为对应的smali语法(反汇编),同时也可以将smali语法的文件重新转换为字节码生成dex文件(汇编)。...dex优化过程,其实是将一些字节码替换为dalvik相关的, 优化后的等价字节码。...爱加密的方法则是,将方法体里面的字节码从dex中抠出来,加密到了自己的so中,在app运行时,从so中解密出方法体,然后修改mmap对应的内存,还原内存结构。
的区别 Dalvik: Dalvik是Google公司自己设计用于Android平台的Java虚拟机它可以支持已转换为 .dex(即Dalvik Executable)格式的Java应用程序的运行,.dex...另一方面,如果系统属性persist.sys.dalvik.vm.lib的值等于libart.so,那么该子进程就会调用函数run_dex2oat来将dex文件翻译成oat文件,实际上就是将dex字节码翻译成本地机器码...函数run_dexopt通过调用/system/bin/dexopt来对dex字节码进行优化,而函数run_dex2oat通过调用/system/bin/dex2oat来将dex字节码翻译成本地机器码。...注意,无论是对dex字节码进行优化,还是将dex字节码翻译成本地机器码,最终得到的结果都是保存在相同名称的一个odex文件里面的,但是前者对应的是一个dey文件(表示这是一个优化过的dex),后者对应的是一个...ART : .dex->.odex(机器码)(AOT Ahead-Of-Time) Dalvik: .dex->.odex(字节码)(JIT Just-In-Time) 机器码可直接执行,而字节码每次启动都需要执行将优化过的
->打包到dex中->DVM通过解释DEX文件来执行这些字节码。...Dalvik虚拟机 SDK中有个dx工具负责将JAVA字节码转换为Dalvik字节码,**对JAVA类文件重新排列,**将所有JAVA类文件中的常量池分解,消除其中的冗余信息,重新组合形成一个常量池,...JIT(Just In Time,即时编译技术)和AOT(Ahead Of Time,预编译技术) JIT:javac将java源码变为class字节码,逐条解释class,翻译成对应的机器指令,逐条解释翻译...Dalvik虚拟机执行的是dex字节码,ART虚拟机执行的是本地机器码 Dalvik执行的是dex字节码,依靠JIT编译器解释执行,运行时动态地将执行频率很高的dex字节码翻译成本地机器码,然后在执行,...但这个过程发生在应用程序的运行过程中,应用程序每一次重新运行的时候,都要重新做这个翻译工作 ART:安装应用的时候,dex中的字节码将被编译成本地机器码,之后每次打开应用,执行的都是本地机器码。
这其中涉及到两个很关键的环节: javac:将 .java 格式的源代码文件编译成 class 文件; dex:将 class 格式的文件打包汇总,组成一个或者多个 dex 文件。...我们想要对字节码进行修改,只需要在 javac 之后 dex 之前遍历所有的字节码文件,并按照一定的规则过滤修改就好了,这里便是字节码插桩的入口。...那么我们到底如何介入打包过程,在 class 转换为 dex 文件的时候实现对字节码的修改呢?...修改字节码 找到了插桩入口,接下来就要对字节码进行修改。对于字节码的修改,比较常用的框架有 Javassist 和 ASM。...ASM 和 Javassit 相比,API 贴近底层,比较难使用,需要对 Java 字节码和虚拟机方面有一定程度的了解。
代码编译成字节码,进而运行在虚拟机当中,这样就无需关注底层操作系统、内存和CPU的差异,应用开发者只需要关注业务逻辑。...回到Android,我们的代码是需要跑在容量更小,电量更小的移动设备当中,JVM那套就不太适用了,所以Google就针对Android开发了Dex编译器来编译dex格式的字节码,而运行Dex字节码的Android...脱糖 即在编译阶段将在语法层面一些底层字节码不支持的特性转换为基础的字节码结构,(比如 List 上的泛型脱糖后在字节码层面实际为 Object);Android 工具链对 Java8 语法特性脱糖的过程可谓丰富多彩...D8 D8的功能是将Java字节码转化成dex代码,D8作为DX的一个替代方案。编译流程如下图所示: ? Android Studio 3.1版本开始,将D8作为默认的Dex编译器。...R8之前采用D8+Proguard的形式构建,R8则将混淆和D8工具进行整合,目的是加速构建时间和减少输出apk的大小。 ? Gradle插件版本达到3.4.0及以上,默认会开始R8进行代码优化。
这其中涉及到两个很关键的环节: javac:将 .java 格式的源代码文件编译成 class 文件; dex: 将 class 格式的文件打包汇总,组成一个或者多个 dex 文件。...我们想要对字节码进行修改,只需要在 javac 之后 dex 之前遍历所有的字节码文件,并按照一定的规则过滤修改就好了,这里便是字节码插桩的入口。...那么我们到底如何介入打包过程,在 class 转换为 dex 文件的时候实现对字节码的修改呢?...修改字节码 找到了插桩入口,接下来就要对字节码进行修改。对于字节码的修改,比较常用的框架有 Javassist 和 ASM。...ASM 和 Javassit 相比,API 贴近底层,比较难使用,需要对 Java 字节码和虚拟机方面有一定程度的了解。
字节码(Bytecode)。这是一般情况下讨论最多的操作字节码的方式。可以操作“.class”的 Java 字节码,也可以操作“.dex”的 Dalvik 字节码,这取决于我们使用的插桩方法。...相对于 Java 文件方式,字节码操作方式功能更加强大,应用场景也更广,但是它的使用复杂度更高 说到这里,有必要说一下Java字节码和Dalvik 字节码 java字节码可以参考这篇文章作为了解一文让你明白...Java字节码,里面演示了如何将字节码反过来解析出对应的class文件。...我自己也按照他的方法解析了一次class文件字节码解析 Dalvik 字节码可以看这篇dex文件字节码解析这篇文章开头还有对应的参考链接,本人按照这两个链接做的 总的来说,dex文件比class文件要复杂得多...基于对象的 API 提供了一种方法,可以将表示一个类的事件序列转换为表示同一个类的对象树,也可以反过来,将对象树表示为等价的事件序列。换言之,基于对象的 API 构建在基于事件的 API 之上。
而DVM 运行的是Dalvik字节码,所有的Dalvik字节码由JAVA字节码转换而来,并被打包到一个DEX(Dalvik Executable)可执行文件中,DVM通过解释DEX文件来执行这些字节码...为了减小执行文件的体积,安卓使用Dalvik虚拟机,SDK中有个dx工具负责将JAVA字节码转换为Dalvik字节码,dx工具对JAVA类文件重新排列,将所有JAVA类文件中的常量池分解,消除其中的冗余信息...dx工具的转换过程和DEX文件的结构如下图所示。...Dalvik虚拟机执行的是dex字节码,ART虚拟机执行的是本地机器码 Dalvik执行的是dex字节码,依靠JIT编译器去解释执行,运行时动态地将执行频率很高的dex字节码翻译成本地机器码,然后在执行...,但是将dex字节码翻译成本地机器码是发生在应用程序的运行过程中,并且应用程序每一次重新运行的时候,都要重新做这个翻译工作,因此,及时采用了JIT,Dalvik虚拟机的总体性能还是不能与直接执行本地机器码的
执行的字节码不同 在Java SE程序中,Java类会被编译成一个或多个.class文件,打包成jar文件,而后JVM会通过相应的.class文件和jar文件获取相应的字节码。...执行顺序为: .java文件 -> .class文件 -> .jar文件 而DVM会用dx工具将所有的.class文件转换为一个.dex文件,然后DVM会从该.dex文件读取指令和数据。...从上图可以看出,首先Java编译器编译的.class文件经过DX工具转换为.dex文件,.dex文件由类加载器处理,接着解释器根据指令集对Dalvik字节码进行解释、执行,最后交与Linux处理。...ART与DVM的区别 DVM中的应用每次运行时,字节码都需要通过即时编译器(JIT,just in time)转换为机器码,这会使得应用的运行效率降低。...而在ART中,系统在安装应用时会进行一次预编译(AOT,ahead of time),将字节码预先编译成机器码并存储在本地,这样应用每次运行时就不需要执行编译了,运行效率也大大提升。
领取专属 10元无门槛券
手把手带您无忧上云