简单的从odex或oat文件中解压出dex文件

2023-11-10 07:11
文章标签 简单 解压 dex odex oat

本文主要是介绍简单的从odex或oat文件中解压出dex文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目前解压这两种文件的方法都是用apktool,然而还有一种简单的方法。

odex和oat是dex文件的一种优化,但是解压他们的方法是相同的。

首先用WinHex打开一个odex文件,我们可以看到dex 035这个字符串,其实这个地方就是dex文件开始的位置,根据dex文件的数据结构可知向后再偏移32个字节就是dex文件的大小。于是从头的偏移位置向后取出dex大小个字节就是dex文件的内容。


我们再来看boot.oat这个文件,打开后搜索字符串dex,找到dex 035,一个boot.oat中有多个dex文件头,说明boot.oat中有多个dex文件,而普通oat文件里一般只有一个。我们可以用同样的方法将他们解压出来



于是我们可以写一个java程序,用于解压odex和oat文件。基本思想是在内存中搜索dex文件头,记录下偏移。再获取dex文件大小。然后获取这块区域的字节,写出文件。

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;public class DEODEX {/*** 从内存中搜索数据,并返回在内存中的偏移***/public static int findPos(MappedByteBuffer data, int offset, byte[] found) {for (int i = offset; i < data.capacity(); i++){boolean bFound = true;for (int j = 0; j < found.length; j++) {bFound = bFound && data.get(i + j) == found[j];}if (bFound) {return i;}}return -1;}private static void write_to_file(MappedByteBuffer buffer, int offset, int dexsize, int file_count, String out)throws IOException {RandomAccessFile file = new RandomAccessFile(String.format("%s%02d.dex", out, file_count), "rw");FileChannel channel = file.getChannel();byte[] data = new byte[dexsize];buffer.position(offset);buffer.get(data);ByteBuffer bw = ByteBuffer.wrap(data);channel.write(bw);channel.close();file.close();}public static void oat2dex(String in, String out) throws IOException {RandomAccessFile raf = new RandomAccessFile(in, "rw");// 内存映射文件FileChannel channel = raf.getChannel();MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, raf.length());int file_count = 0;int length = (int) raf.length();//dex头byte[] magic = { 0x64, 0x65, 0x78, 0x0A, 0x30, 0x33, 0x35, 0x00 };int offset = 0;while (offset != -1) {offset = findPos(buffer, offset + 8, magic);if (offset == -1) { // 未发现dex magicbreak;}int dexsize = (buffer.get(offset + 35) << 24) | (buffer.get(offset + 34) & 0xff) << 16| (buffer.get(offset + 33) & 0xff) << 8 | (buffer.get(offset + 32) & 0xff);if (offset + dexsize > length)continue;write_to_file(buffer, offset, dexsize, ++file_count, out);}channel.close();raf.close();}
}


调用这个方法后,我们得到了dex文件




OK,这是boot.oat中的文件,随便拿一个出来测试一下。转换成jar,用jdgui打开



大功告成微笑

这篇关于简单的从odex或oat文件中解压出dex文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/381145

相关文章

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

Jenkins的安装与简单配置过程

《Jenkins的安装与简单配置过程》本文简述Jenkins在CentOS7.3上安装流程,包括Java环境配置、RPM包安装、修改JENKINS_HOME路径及权限、启动服务、插件安装与系统管理设置... 目录www.chinasem.cnJenkins安装访问并配置JenkinsJenkins配置邮件通知

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

Java中使用 @Builder 注解的简单示例

《Java中使用@Builder注解的简单示例》@Builder简化构建但存在复杂性,需配合其他注解,导致可变性、抽象类型处理难题,链式编程非最佳实践,适合长期对象,避免与@Data混用,改用@G... 目录一、案例二、不足之处大多数同学使用 @Builder 无非就是为了链式编程,然而 @Builder

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

java如何解压zip压缩包

《java如何解压zip压缩包》:本文主要介绍java如何解压zip压缩包问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解压zip压缩包实例代码结果如下总结java解压zip压缩包坐在旁边的小伙伴问我怎么用 java 将服务器上的压缩文件解压出来,

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

windows和Linux安装Jmeter与简单使用方式

《windows和Linux安装Jmeter与简单使用方式》:本文主要介绍windows和Linux安装Jmeter与简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows和linux安装Jmeter与简单使用一、下载安装包二、JDK安装1.windows设