利用无效字节码指令引发逆向工具崩溃(一)

由于大部分逆向工具都是线性读取字节码并解析,当遇到无效字节码时,就会引起反编译工具字节码解析失败。

 我们可以插入无效字节码到DEX文件,但要保证该无效字节码永远不会被执行(否则您的程序就会崩溃了!)。

首先我们新建一个测试类。为了绕过Dalvik运行时代码验证,BadCode.java要保证不被调用。(否则运行app,会出现java.lang.verifyerror异常)

然后生成apk,用ida打开classes.dex。并找到BadCode类的aaa方法。选中的三行代码对应”System.out.println("aaaa");”

切换到HexView-a视图,记录下指令码 “62 00 02 04 1A 01 8E 07 6E 20 19 10 10 00” 和对应偏移“0003A2A4”

使用C32asm,以十六进制的方式打开dex文件。按快捷键“Ctrl + G”,定位到“0003A2A4”

把“62 00 02 04 1A 01 8E 07 6E 20 19 10 10 00”改为“12 01 38 01 03 00 FF FF 00 00 00 00 00 00”

Opcodes解释:

12 01 // const/4 v1, 0 //v1=0

38 01 03 00 // if-eqz v1, loc_3A2AC //if(v1==0) 跳转到 loc_3A2AC:

FF FF // FFFF (Bad opcodes) //本行代码被跳过永远不会执行

// loc_3A2AC:

保存dex。把修改后的dex文件拖入DexFixer进行修复。

用修复后的dex覆盖原apk中的dex文件。

删除META-INF签名文件

使用签名工具,对apk重新签名。

Apk安装到手机,运行成功

下面试试反逆向工具的效果

Apktool:(很遗憾,新版本已经修复了这个错误)

Dex2jar:(反编译失败)

用到的工具:

IDA :http://pan.baidu.com/share/link?shareid=132208&uk=1795434040

C32Asm :http://www.crsky.com/soft/3128.html

DexFixer:http://bbs.pediy.com/showthread.php?p=1158816

Ijiami signer:http://www.ijiami.cn/

更多内容,期待您的探索,请关注爱加密,让您精彩不断!

爱加密APP漏洞分析平台:http://safe.ijami.cn/

爱加密官方地址:http://www.ijiami.cn/

时间: 2024-10-13 22:23:09

利用无效字节码指令引发逆向工具崩溃(一)的相关文章

利用无效字节码指令引发逆向工具崩溃(二)

上一节我们介绍了一种利用无效字节码指令引发逆向工具崩溃的方法.可惜的是大部分反编译工具已经修复了该bug.但是如果我们插入有效的字节码指令,但是后跟无效的数据引用,结果会是怎么样呢? 使用C32asm,以十六进制的方式打开dex文件.按快捷键"Ctrl + G",定位到"0003A2A4" 把"62 00 02 04 1A 01 8E 07 6E 20 19 10 10 00"改为"12 01 38 01 03 00 1A 00 FF

字节码指令

Java 虚拟机指令集所支持的数据类型: opcode byte short int long float double char reference Tipush bipush sipush Tconst iconst lconst fconst dconst aconst Tload iload lload fload dload aload Tstore istore lstore fstore dstore astore Tinc iinc Taload baload saload ia

从字节码指令看重写在JVM中的实现

Java是解释执行的,包括动态链接的特性,都给解析或运行期间提供了很多灵活扩展的空间.面向对象语言的继承.封装和多态的特性,在JVM中是怎样进行编译.解析,以及通过字节码指令如何确定方法调用的版本是本文如下要探讨的主要内容,全文围绕一个多态的简单举例来看在JVM中是如何实现的. 先简单介绍几个概念.对于字节码执行模型及字节码指令集的相关概念可以参考之前的一篇介绍http://blog.csdn.net/lijingyao8206/article/details/46562933. 一.方法调用的

Java字节码指令

1. 简介 Java虚拟机的指令由一个字节长度的.代表着某种特定操作含义的数字(称为操作码)以及跟随其后的零至多个代表此操作所需参数(称为操作数)而构成. 由于Java虚拟机采用面向操作数栈而不是寄存器的架构,所以大多数的指令都不包含操作数,只有一个操作码. Java虚拟机操作码的长度为一个字节(即0~255),这意味着指令集的操作码总数不可能超过256条. 2. 字节码和数据类型 在Java虚拟机的指令集中,大多数的指令都包含了其操作所对应的数据类型信息.例如,iload指令用于从局部变量中加

JVM总括三-字节码、字节码指令、JIT编译执行

JVM总括三-字节码.字节码指令.JIT编译执行 java文件编译后的class文件,java跨平台的中间层,JVM通过对字节码的解释执行(执行模式,还有JIT编译执行,下面讲解),屏蔽对操作系统的依赖.一个字节(8位)可以储存256中不同的指令,这样的指令就是字节码,java所有指令有200个左右,这些指令组成了字节码文件(.class). 一.字节码的主要指令: .class文件里面的十六进制文件(如:图一),其中CAFE BABE是标志这个文件为java的编译后的文件,00000034代表

深入理解java虚拟机(六)字节码指令简介

Java虚拟机指令是由(占用一个字节长度.代表某种特定操作含义的数字)操作码Opcode,以及跟随在其后的零至多个代表此操作所需参数的称为操作数 Operands 构成的.由于Java虚拟机是面向操作数栈而不是寄存器的架构,所以大多数指令都只有操作码,而没有操作数. 字节码指令集是一种具有鲜明特点.优劣势都很突出的指令集架构: 由于限定了Java虚拟机操作码的长度为1个字节,指令集的操作码不能超过256条.Class文件格式放弃了编译后代码中操作数长度对齐,这就意味者虚拟机处理那些超过一个字节数

在Myeclipse下查看Java字节码指令信息

在实际项目开发中,有时为了了解Java编译器内部的一些工作,需要查看Java文件对应的具体的字节码指令集,这里提供两种方式供参考. 一.使用javap命令 javap是JDK提供的一个原生工具,它可以反汇编class文件得到对应的字节码信息,通过调节命令参数,可以获取类的package.fileds和methods等的字节码信息,用的最多的参数也就是-verbose了: 二.Bytecode Outline插件 javap固然可以实现反编译字节码的效果,但是每次都要在命令行中执行,显得有点麻烦,

[jvm解析系列][十三]字节码指令小节,从字节码看JVM的栈解释器执行过程。

众所周知,JVM以前一直采用的是解释执行,但是后来在历代的版本更迭中也加入了编译执行.所以总的来说JVM是包含了解释执行和编译执行.这一部分不属于JVM的范畴了,已经属于编译了,大多数都是进行词法分析之类的,以后有时间会补充. 同时大家都知道现在大体上分为两种指令集架构,第一种就是基于栈的第二种是基于寄存器的,简单点说,基于寄存器的架构速度更快,但是可移植性不强,但是基于栈的指令集架构虽然慢,但是可移植性很强,大家都知道java本身就是依靠可移植性出名的,所以无可争议的使用了栈的指令集架构.(也

JVM | 字节码指令基础

操作数栈管理指令 1)pop.pop2:将操作数栈的栈顶一个或两个元素出栈.2)dup.dup2.dup_x1.dup2_x1.dup_x2.dup2_x2:复制栈顶一个或两个数值并将复制值或双份的复制值重新压入栈顶.3)swap:将栈最顶端两个数值互换. public static void main(String[] args) { heavyMethod(); } 对应的字节码: public static void main(java.lang.String[]); Signature: