现在,许多Android手机的ROM包在生成过程中都启用优化,把jar文件抽空,生成odex/oat和vdex文件,以在运行时省掉编译时间。如果想对这些jar进行修改,就要修改它们所对应的odex或者oat文件。本文以/system/framework/oat/arm64/am.odex为例,讲解它的反编译和回编译过程

本文用到的工具:baksmali.jar和smali.jar

下载地址:

https://bitbucket.org/JesusFreke/smali/downloads

将odex/oat反编译

在执行反编译前,先将odex/oat和它的依赖复制到同一目录下。如果在反编译odex/oat的时候,没有找到依赖,就会报类似于下面的错误:

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$OatDexEntry.getDexFile(OatFile.java:567)
at org.jf.baksmali.DexInputCommand.loadDexFile(DexInputCommand.java:158)
at org.jf.baksmali.DisassembleCommand.run(DisassembleCommand.java:162)
at org.jf.baksmali.Main.main(Main.java:102)
Caused by: org.jf.dexlib2.dexbacked.DexBackedDexFile$NotADexFile: Not a valid dex magic value: 7f 45 4c 46 02 01 01 03
at org.jf.dexlib2.util.DexUtil.verifyDexHeader(DexUtil.java:93)
at org.jf.dexlib2.dexbacked.OatFile$OatDexEntry.getDexFile(OatFile.java:583)
... 4 more

(1) 在复制依赖前先挂载system.img到mysystem目录:

mkdir -p mysystem && sudo mount -o loop system.img mysystem

(2) 复制以boot开头的文件依赖

然后执行下面的命令复制依赖到当前目录:

cp mysystem/framework/arm64/* .

(3) 复制odex/oat本身及相关文件

cp mysystem/framework/oat/arm64/am.* .

这个路径不是死的,请根据实际情况复制。如果没有system.img镜像,或者无法挂载,也可以从手机把相关文件复制出来:adb pull /system/framework

(4) 反编译odex/oat

java -jar baksmali-2.3.4.jar x am.odex

  • x deodex的缩写

反编译后,会生成out目录,里面存放反编译出来的代码,代码格式为smali

现在,你可以对里面的代码进行修改了

将smali编译成dex

修改完毕后,将out目录下smali代码编译成dex:

java -jar smali-2.3.4.jar as out/ -a 28 -o am.dex

  • as assemble的缩写
  • -a 指定API版本
  • -o 指定输出的dex文件

如果没有错误就会生成am.dex文件。如果有错误就根据日志的内容去解决错误

将dex编译成odex/oat

dex编译成odex/oat是在手机上进行的,所以生成了dex文件以后,我们把am.dex推到手机:

adb push am.dex /data/local/tmp

让手机连接到电脑,打开USB调试,在命令行执行adb shell,接着输入下面的命令进行编译:

export ANDROID_DATA=/data

export ANDROID_ROOT=/system

dex2oat --dex-file=/data/local/tmp/am.dex --oat-file=/data/local/tmp/am.odex  --instruction-set=arm64 --runtime-arg -Xms64m --runtime-arg -Xmx128m
  • --dex-file 指定要编译的dex文件
  • --oat-file 指定要输出的odex/oat文件
  • --instruction-set 指定cpu架构
  • --runtime-arg 指定dex2oat运行时的参数,如果编译时发生内存不足,可以把Xms和Xmx调大

编译成功后,会在/data/local/tmp目录生成odex/oat和vdex文件,将它们替换到系统试试吧

Android odex,oat文件的反编译,回编译的更多相关文章

  1. apktool 反编译 回编译

    下载apktool 安装好Java环境 拷贝apk 拷贝game.apk到当前文件夹.apk随便指定 反编译 反编译完成.生成game目录 game目录内容 回编译 回编译完成.生成build和dis ...

  2. Android的APK文件的反编译方法【转】

    实用的收藏一下. 来自:http://www.dewen.org/q/711/%E8%AF%B7%E6%95%99Android%E7%9A%84APK%E6%96%87%E4%BB%B6%E7%9A ...

  3. 修改Android手机内核,绕过反调试

    本文博客链接:http://blog.csdn.net/qq1084283172/article/details/57086486 0x1.手机设备环境 Model number: Nexus 5 O ...

  4. [转]Android应用安装包apk文件的反编译与重编译、重签名

    背景介绍: 最近在做Robotium自动化测试,使用到solo.takeScreenshot()函数以在测试过程中截图,但此函数需要被测试APP具有<uses-permission androi ...

  5. Android开发:APK的反编译(获取代码和资源文件)

    一.反编译工具: 1.APKTool: APKTool是由GOOGLE提供的APK编译工具,能够完成反编译及回编译apk的工作.同时,它也有着安装反编译系统apk所需要的framework-res框架 ...

  6. Android apk逆向:反编译,回编译,签名,打包。

    Android apk逆向:反编译,回编译,签名,打包流程. 第一步: apk 反编译. 1) 打开命令行窗口,输入java -version, 检测当前java版本,若版本较低, 则下载JAVA S ...

  7. 使用apktool.jar工具反编译和回编译Android APK 终端命令模式

    1.工具准备 工具可以网上搜索下载新版本,也可以从这里Download:https://github.com/FlymeOS/tools/blob/lollipop-5.1/reverses/apkt ...

  8. DEX、ODEX、OAT文件&Dalvik和ART虚拟机

    https://www.jianshu.com/p/389911e2cdfb https://www.jianshu.com/p/a468e714aca7 ODEX是安卓上的应用程序apk中提取出来的 ...

  9. apk反编译、smali修改、回编译笔记

    最近下了一个apk程序,但是一启动会弹出一个流氓广告.这个广告不是原厂商加的,而是有人在原有apk程序的基础上,加了一个壳,让apk先启动他加的广告,再启动原来的程序,很恶心.于是想去掉它. 试了几个 ...

随机推荐

  1. 高并发编程-CountDownLatch深入解析

    要点解说 CountDownLatch允许一个或者多个线程一直等待,直到一组其它操作执行完成.在使用CountDownLatch时,需要指定一个整数值,此值是线程将要等待的操作数.当某个线程为了要执行 ...

  2. C#语法--委托,架构的血液

    委托的定义 什么是委托? 委托实际上是一种类型,是一种引用类型. 微软用delegate关键字来声明委托,delegate与int,string,double等关键字一样.都是声明用的. 下面先看下声 ...

  3. python BeautifulSoup4 获取 script 节点问题

    在爬取12306站点名时发现,BeautifulSoup检索不到station_version的节点 因为script标签在</html>之外,如果用‘lxml’解析器会忽略这一部分,而使 ...

  4. ubuntu部署.Net Core3.1(Nginx+pm2)

    前言 虽然.NetCore已经出来很久了,但是很多初学者还是不会在linux部署.所以写一篇初学者在ubuntu下部署Core的全过程,大佬请无视. 环境搭建 ubuntu18.04 NetCore3 ...

  5. luogu P1712 [NOI2016]区间

    题目描述 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就是使得存在一个 x,使得对于每一 ...

  6. hdu3999 The order of a Tree

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3999 题意:给一序列,按该序列插入二叉树,给出字典序最小的插入方法建相同的一棵树出来.即求二叉树的先序 ...

  7. 洛谷 题解 P2117 【小Z的矩阵】

    这题这么无聊,亏我还用了读入输出优化... 关键在于,这还是道黄题QWQ 掀桌而起 (╯‵□′)╯︵┻━┻ 显而易见,在i != j的情况下,a[i][j] + a[j][i]和a[j][i] + a ...

  8. Java实现数列的排列组合

    定义: 排列:从给定个数的元素中取出指定个数的元素,进行排序 组合:从给定个数的元素中仅取出指定个数的元素,不考虑排序 公式: 从n个元素中取出m个元素进行排序的个数: A(m,n)=n(n-1)(n ...

  9. 基于 HTML5 + WebGL 的 3D 太阳系系统

    前言 近年来随着引力波的发现.黑洞照片的拍摄.火星上存在水的证据发现等科学上的突破,以及文学影视作品中诸如<三体>.<流浪地球>.<星际穿越>等的传播普及,宇宙空间 ...

  10. JS系列:js数据类型的转换

    数据类型的转换[基本数据类型]数字 number字符串 string布尔 boolean空 null未定义 undefined[引用数据类型]对象 object普通对象 {}数组对象 [](Array ...