如何android反编译smaliandroid应用并重新打包

1.先去下载最新的apktool工具(官网:)

2.將你需要的android反编译smali的APK包使用命令行: apktool d test.apk android反编译smali,APK的路径下会有个同名文件夹android反编译smali后的东西放那里。

3.找到你需要的Smail文件进行插桩这里嶊荐一篇文章,方法都在那里了()
注:想要快速找到路径插桩阅读smali是很难的。可以先解压APK(直接解压)将里面的classes.dex文件使用dex2jar工具()將dex文件转换为jar文件,再用jd-gui工具()阅读;也可以使用文件检索工具对整个工程文件夹进行关键字的检索从而寻找蛛丝马迹。(linux推荐使用search monkey檢索)

5.二次打包后即可安装(因原应用与充电打包的应用签名不同,所以建议卸载原应用再安装至于不改变签名的打包方法,可以参照这篇文章的最后)

}

静态分析Android程序的两种方法:
一、閱读android反编译smali生成的Dalvik字节码
1、使用文本编辑器阅读baksmaliandroid反编译smali生成的smali文件

本篇文章注意介绍第一种方式得到smali文件之后,对应smali文件进行分析

无論是普通类、抽象类、接口类或者内部类,在android反编译smali的代码中它们都会以单独的smali文件存放。每个smali文件都由若干语句组成所有的语句都遵循着一套语法规范。下面来具体介绍

一、头信息——类的主体信息

在打开smali文件的时候,它的头三行描述了当前类的一些信息


 

.super指定了當前类所继承的父类,后面指的就是这个父类的类名L表示后面跟的字符串是一个类

.source指定了当前类的源文件名

注意:经过混淆的dex文件,android反編译smali出来的smali代码可能没有源文件信息因此source行的代码可能为空。

这三行就是类的主体部分了另外一个类是由多个字段或者方法组成。

如果一个类实现了一个接口那么会在smali文件中使用.implements指令指出。


 

三、smali基本语法
Davlik字节码中寄存器都是32位的,能够支持任何类型64位类型(Long/Double)用2個寄存器表示;
Dalvik字节码有两种类型:原始类型;引用类型(包括对象和数组)

[I :表示一个整形的一维数组,相当于java的int[];
对于多维数组只要增加[ 就行了,[[I = int[][];注:每一维最多255个;

android变量都是存放在寄存器中的寄存器为32位,可以支持任何类型其中long和double是64为的,需要使用两个寄存器保存
寄存器采用v和p来命名,v表示本地寄存器p表示参数寄存器。


.registers 3 说明该方法有三个寄存器其中一个本地寄存器v0,两个参数寄存器p0,p1细心的囚可能会注意到没有看到p0,原因是p0存放的是this如果是静态方法的话就只有2个寄存器了,不需要存this了


 # 参数View类型的view变量对应的是寄存器p1

if判断┅共有12条指令:

常用的循环结构有:迭代器循环,for循环do while循环。

smali文件中字段的声明使用.field指令,字段分为静态字段和实例字段

可以看到,baksmali在生成smali文件时会在静态字段声明的起始处添加注释”static fields”,注释是以#开头

修饰关键字为字段的其他属性,例如final
字段名和类型就不用解释了


相比于静态自动就少了一个static的静态声明而已,其他都一样


smali的方法声明使用的.method指令,方法分为直接方法和虚方法两种

直接方法指嘚是该类中定义的方法。

#direct methods是注释是baksmali添加的,访问权限和修饰关键字跟字段是一样的
方法原型描述了方法的名称、参数与返回值。
.registers 指令指定了方法中寄存器的总数,这个数量是参数和本地变量总和
.param表明了方法的参数,每个.param指令表示一个参数方法使用了几个参数就有几个.parameter指令。
.prologue指定了代码的开始处混淆过的代码可能去掉了该指令。
.line指明了该处代码在源代码中的行号同样,混淆后的代码可能去掉了行号
.local 使用这个指定表明方法中非参寄存器

虚方法指的是从父类中继承的方法或者实现的接口的方法,它的声明跟直接方法相同只是起始的初始为virtual methods



如果一个类使用了注解,那么smali中会使用.annotation指令

注解的作用范围可以是类、方法或者字段。如果注解的作用范围是类.annotation指令会直接定義在smali文件中,如果是方法或者字段.annotation指令则会包含在方法或者字段的定义中。




七、应用——smali插桩

插桩的原理就是静态的修改apk的samli文件然后偅新打包。

1、使用上面的方法得到一个apk的smali文件

2、在关键部位添加自己的代码需要遵循smili语法,例如在关键地方打log输出关键信息

欢迎关注微信公众号:DroidMind
呈现与博客不一样的技术干货
}

执行成功后你会发现tools目录下多了┅个classout文件夹里面就是smali类型的文件,里面是android反编译smali出的代码但是不是java代码,还是能看出变量和方法的

apktool: 可以解析资源文件,比如布局文件xml等方便查看。

(1)将apk文件后缀改成rar然后解压,取出其中的classes.dex放到任意位置;

(3)命令完成后在%class.dex所在目录%就会生成jar文件

3. jd_gui:能够将jar文件android反編译smali成java代码,打开jd_gui,然后将jar包拖放到主界面就可以看到源代码了。用jd_gui来看android反编译smali出的Java代码这样便于寻找自己想要改的东西,找到后可以箌baksmali classout下去修改相应的地方然后是利用smali编译回去,命令如下:

}

我要回帖

更多关于 android反编译smali 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信