odex

android apk 防止反编译技术第二篇-运行时修改字节码

牧云@^-^@ 提交于 2020-03-03 18:24:05
上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372。接下来我们将介绍另一种防止apk反编译的技术-运行时修改字节码。这种方法是在工作中在实现app wrapping时,看到国外的一篇关于android 安全的介绍实现的并且独创。下面我们来介绍一下这种方法。 我们知道apk生成后所有的java生成的class文件都被dx命令整合成了一个classes.dex文件,当apk运行时dalvik虚拟机加载classes.dex文件并且用dexopt命令进行进一步的优化成odex文件。我们的方法就是在这个过程中修改dalvik指令来达到我们的目的。 一、dex文件格式 dex的文件格式通常有7个主要部分和数据區组成,格式如下: header部分记录了主要的信息其他的部分只是索引,索引的内容存在data区域。 Header部分结构如下: 字段名称 偏移值 长度 描述 magic 0x0 8 'Magic'值,即魔数字段,格式如”dex/n035/0”,其中的035表示结构的版本。 checksum 0x8 4 校验码。 signature 0xC 20 SHA-1签名。 file_size 0x20 4 Dex文件的总长度。 header_size 0x24 4 文件头长度

Android odex文件反编译

送分小仙女□ 提交于 2020-02-24 23:23:49
odex 是经过优化的dex文件,且独立存在于apk文件。odex 多用于系统预制应用或服务。通过将apk中的dex文件进行 odex,可以加载 apk 的启动速度,同时减小空间的占用。请参考 ODEX 关于 odex 的说明。 在反编译 odex 文件的过程中,我们需要使用到以下工具 smali/baksmali dex2jar JD Compiler, jar反编译工具 smali/baksmali 是odex与dex文件格式互相转换的两个工具, dex2jar 则是将dex文件转为java的jar文件, JD Compiler 用于反编译jar文件。也就是说,经过以上一系列的操作,我们最终可以从一个odex文件得到一个可读的java文件。(事实上,也不是完全可读,与源码上还是有差别,有时候部分代码还无法反编译过来,只能以jdk虚拟机指令的方式存在了)。 首先,一个 odex 文件的生成过程是:java -> class -> dex -> odex,那么反编译的就是上面过程的逆操作了:odex -> dex -> class -> java。 我的测试环境: Android 4.1.2 Samsung Galaxy II 以Android系统中的 uiautomator.odex 文件为例,目标是反编译其源码(其实它的源码 grepcode ). 工具准备

android apk反编译和odex转dex

旧时模样 提交于 2020-02-24 23:23:30
大家好,这里介绍apk反编译操作。 1:apk反编译 2:odex转dex 操作环境:ubuntu A:apk反编译 .到code.google上下载apktool.jar以及相关文件: http://code.google.com/p/android-apktool/downloads/list 点击下载apktool-1.0.0.tar.bz2 和apktool-install-linux-2.1_r01-1.zip Apktool 命令 ./apktool d geek.apk test 反编译 geek.apk到文件夹test B:odex转dex http://code.google.com/p/smali/downloads/list 下载下面4个文件。 现在我们要对CardManager.odex进行反编译,以CardManager.odex为例。 1:java -jar baksmali-1.3.2.jar -a 12 -x CardManager.odex //注意:这里要有core.jar:ext.jar:framework.jar:android.policy.jar:services.jar文件支持。这个 apk 所在的 rom 里面的一些 jar 文件,都在 /system/framework 里面: core.jar, ext. jar,

Android APK安装过程学习笔记

末鹿安然 提交于 2019-12-16 15:45:15
1.什么是APK   APK,即Android Package,Android安装包。不同平台的安装文件格式都不同,类似于Windows的安装包是二进制的exe格式,Mac的安装包是dmg格式。APK可以再Android上执行安装,APK的本质是一个Zip压缩包,只是后缀被修改为apk,其中打包了源代码编译出的class.dex、一些图片视屏资源文件和一些Native库文件。APK文件与Zip文件最大的一个不同是APK包含签名文件,用于保证安装包安全不被修改。 2.什么是DEX文件和ODEX文件   Java卡平台是由源代码编译出的class文件分别运行在不同平台的虚拟机上,由虚拟机屏蔽了不同平台的差异。但是由于Android系统针对手持设备,对Dalvik虚拟机进行了优化,主要包括:     (1)将原来class文件进行优化,例如将其中的常量冗余信息进行合并,提供虚拟机解析效率;     (2)修改JVM运行时基于栈的数据结构修改为Dalvik基于寄存器的数据结构,数据访问方式更快,运行效率更高。   这种情况下,原来的.class文件就有些不适用了,因此,出现了dex文件格式,它是源代码编译后打包生成的文件。它是APK的一个组成部分。ODEX文件是Dalvik将dex文件中可执行文件class.dex文件解压出来后,存储在本地后生成的

Android odex的反编译,回编译

徘徊边缘 提交于 2019-12-03 16:30:36
现在,许多Android手机的ROM包在生成过程中都启用优化,把jar文件抽空,生成odex和vdex文件,以在运行时省掉编译时间。如果想对这些jar进行修改,就要修改它们所对应的odex文件。本文以 /system/framework/oat/arm64/am.odex 为例,讲解它的反编译和回编译过程 本文用到的工具:baksmali.jar和smali.jar 下载地址: https://bitbucket.org/JesusFreke/smali/downloads 将odex反编译 在执行反编译前,先将odex和它的依赖复制到同一目录下。如果在反编译odex的时候,没有找到依赖,就会报类似于下面的错误: Exception in thread "main" org.jf.dexlib2.DexFileFactory$DexFileNotFoundException: Could not locate the embedded dex file /system/framework/am.jar. Is the vdex file missing? at org.jf.dexlib2.dexbacked.OatFile$OatDexEntry.getDexFile(OatFile.java:586) at org.jf.dexlib2.dexbacked.OatFile

Dalvik Optimization and Verification With dexopt

匿名 (未验证) 提交于 2019-12-02 23:55:01
原文引用 大专栏 https://www.dazhuanlan.com/2019/08/26/5d6344d89bd96/ # # Dalvik 虚拟机是专门针对Android这种移动平台设计的. 移动平台一般内存较小, 磁盘读取也很慢. 针对这些特点和限制必须主要聚焦以下目标: 传统的经典java虚拟机运行类的时候先从压缩的文档中解压出来,然后存储在内存中. 这种实现方式, 没个进程中都回有一份独立的拷贝, 并且进程的启动速度 也会比较慢, 因为需要一个解压过程(或者从磁盘上读取一个一个的独立的class数据). 另外在本地内存中存储这些字节码,似的重新改写这些命令变得很方便, 这样促使进行一些优化操作. 这些目标让我们做出以下决定: 所有的 class 文档合并成一个 “DEX” 文档. DEX 文档是只读的,并且进程间共享使用. 字节的顺序和字节对齐方式根据操作系统进行调整过的. 字节码的 verification 必须对所有类都要强制执行, 但是最好是提前进行. Optimizations 对字节码的修改也需要AOT, 进程执行前进行. 分以下几个部分进行讲解. 应用进程代码是通过jar或者apk的方式交给系统运行的. jar 和 apk 其实就是 zip 文档, 额外的加了一些 meta-data 元数据. Dalvik DEX 数据文档 叫做 classes.dex.

系统源码预制APK检测是否可以进行ODEX抽取

感情迁移 提交于 2019-12-02 11:07:51
odex抽取会导致增加内存,开机时间变短,公司公司的要求是增加内存可以接受.增加开始时间不能接受. 公司每次打包的时候都会遇到预制公司内部apk的时候,进行源码编译进行报错,导致编译失败的问题. 如果是预制纯正的第三方apk不能进行odex抽取,那只能进行在对应的Android.mk关闭odex抽取 LOCAL_DEX_PREOPT := false 要是预制的大部分是自己公司开发的APK还进行odex抽取就需要应用开发修改,那么公司想要知道在编译之前有那些apk可以进行抽取,公司内部的那些apk不能进行抽取. 可以避免因为预制APK而导致的错误,节省了人力物力和时间成本. 前期调研的时候发现odex抽取可以使用 dex2oat 工具进行抽离.但是odex 命令抽取,但是odex 命令太长,而且容易导致错误,最终抛弃,有兴趣的同学可以去看看 Odex命令 第二种方式是相对好一点的方式,但是环境 依赖于源码 解决方式是在 jenkins 放一套编译好的源码 让应用同事上传apk到 jenkins 上面 每次进行检测 ,每个应用的检测时间应该是 30秒左右,这样大大降低了公司的人力财力和时间成本.并且每个应用在提供给系统编译之前先进行检测. 具体的jenkins 构建脚本编写如下: #设置编译JDK环境 export JAVA_HOME=/usr/lib/jvm/java-8