smali 订阅
Smali,Baksmali分别是指安卓系统里的Java虚拟机(Dalvik)所使用的一种.dex格式文件的汇编器,反汇编器。 展开全文
Smali,Baksmali分别是指安卓系统里的Java虚拟机(Dalvik)所使用的一种.dex格式文件的汇编器,反汇编器。
信息
实    现
dex格式所有功能
冰岛语
Smali,Baksmali
中文名
smali
性    能
宽松式的Jasmin/dedexer语法
smali性能
其语法是一种宽松式的Jasmin/dedexer语法,而且它实现了.dex格式所有功能(注解,调试信息,线路信息等)。
收起全文
精华内容
下载资源
问答
  • smali

    2014-05-03 19:37:51
    https://code.google.com/p/smali/wiki/TypesMethodsAndFields

    https://code.google.com/p/smali/wiki/TypesMethodsAndFields

      TypesMethodsAndFields  
    Some general information about how types, methods and fields are represented in dalvik bytecode
    Updated  Jul 20, 2011

    Types

    dalvik's bytecode has two major classes of types, primitive types and reference types. Reference types are objects and arrays, everything else is a primitive.

    Primitives are represented by a single letter. I didn't come up with these abbreviations - they are what is actually stored in the dex file, in string form. They are specified in the dex-format.html document (dalvik/docs/dex-format.html in the AOSP repository)

    Vvoid - can only be used for return types
    Zboolean
    Bbyte
    Sshort
    Cchar
    Iint
    Jlong (64 bits)
    Ffloat
    Ddouble (64 bits)

    Objects take the form Lpackage/name/ObjectName; - where the leading L indicates that it is an object type, package/name/ is the package that the object is in, ObjectName is the name of the object, and ; denotes the end of the object name. This would be equivalent topackage.name.ObjectName in java. Or for a more concrete example, Ljava/lang/String; is equivalent to java.lang.String

    Arrays take the form [I - this would be an array of ints with a single dimension. i.e. int[] in java. For arrays with multiple dimensions, you simply add more [ characters. [[I = int[][][[[I = int[][][], etc. (Note: The maximum number of dimensions you can have is 255).

    You can also have arrays of objects, [Ljava/lang/String; would be an array of Strings.

    Methods

    Methods are always specified in a very verbose form that includes the type that contains the method, the method name, the types of the parameters and the return type. All this information is required for the virtual machine to be able to find the correct method, and to be able to perform static analysis on the bytecode (for verification/optimization purposes)

    They take the form

    Lpackage/name/ObjectName;->MethodName(III)Z

    In this example, you should recognize Lpackage/name/ObjectName; as a type. MethodName is obviously the name of the method. (III)Z is the method's signature. III are the parameters (in this case, 3 ints), and Z is the return type (bool).

    The method parameters are listed one right after another, with no separators between them.

    Here's a more complex example:

    method(I[[IILjava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;

    In java, this would be

    String method(int, int[][], int, String, Object[])

    Fields

    Fields are likewise always specified in verbose form that includes the type that contains the field, the name of the field, and the type of the field. Again, this is to allow the virtual machine to be able to find the correct field, as well as to perform static analysis on the bytecode.

    They take the form

    Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;

    This should be pretty self-explanatory - it is the package name, the field name and the type of the field respectively.




    类型



    Dalvik的字节码中拥有两个主要的类型:基类和引用类型。引用类型




    引用类型是对象和数组,其他的一切都是基类
     
    基类被一个简单的字符描述。我没有提出这些缩写词———他们实际以字符串的形式存储于dex文件中
    他们被定义与dex格式网页文档中(在AOSP库中的路径是dalvik/docs/dex-format.html)
    V  空类型---仅仅可以用来作为返回类型
    Z  Boolean 布尔型
    B  Byte字节型
    S  Short短整型(16位)
    C  Char字符型
    I  Int 整形
    J  long (64 bits)长整型(64位)
    F  Float浮点型
    D  double (64 bits)双精度型(64位)


    对象采用这样的形式Lpackage/name/ObjectName---开始的L表明这是一个对象类型,package/name/就是该对象,对象名是是对象的名称,并且分号表明对象名的结束。这个等同于java语言中的package.name.ObjectName结构,举个更具体的例子,“ Ljava/lang/String;”就等同于java语言的“java.lang.String”。数组采用[I的形式—这代表一个一维整形数组就像java语言中的int[]。而多维数组,你简单的增加字符‘[’就行了,例如[[I=int[][](最大的维度是255).你也可以使用数组对象,例如[Ljava/lang/String就是一个字符串数组。


    方法



    方法总是被定义为一个非常复杂的包括方法,方法名,参数类型和返回值的形式。


    所有的这些信息被要求对于虚拟机而言可以找到正确的方法并且能够表现字节码上的静态分析(为了确认挥着选择最优化)。他们采用如下形式
    Lpackage/name/ObjectName;->MethodName(III)Z
    在这个例子中,你应该识别出“ Lpackage/name/ObjectName; 是一个类, MethodName明显是一个方法名,(III)Z是方法的签名,‘III’在这个例子中是三个整形参数,Z是表示返回一个布尔类型的返回值。


    They take the form
    Lpackage/name/ObjectName;->MethodName(III)Z
    In this example, you should recognize Lpackage/name/ObjectName; as a type. MethodName is obviously the name of the method. (III)Z is the method's signature. III are the parameters (in this case, 3 ints), and Z is the return type (bool).
    方法的参数一个接一个的列举在右边,中间没有分号。给出一个更复杂的例子:
    method(I[[IILjava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
    在java语言中,他应该是这样的
    String method(int, int[][], int, String, Object[])






    域同样的被指定为一个冗长的包括域,域名,域类型的形式。此外,它也允许虚拟机找到正确的域来表现字节编码的静态分析。
    它们采用如下形式:
    Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;
    这相当的不言自明---分别表示域名,域名和域类型






    2222222


    在dalvik字节码中,寄存器总是32位可以存放任何类型的值,2个寄存器可以用来存放64位类型(长整形和双精度型)


    指定方法中的寄存器数字


    这里有两种办法来指定一种方法中的多个寄存器。寄存器直接指定方法中的寄存器总数,或者区域变量直接指定方法中的非参数寄存器数。寄存器总数包括方法中参数所需的所有寄存器。


    多少参数传入方法


    当一个方法被调用,方法中的参数被放置到最近的几个寄存器。如果一个方法拥有两个参数和五个寄存器,这些参数会被存放到最后的两个寄存器V3和V4.


    动态方法的第一个参数总是被调用的第一个对象,例如让你写一个动态方法 LMyObject;->callMe(II)V,这个方法有两个整形参数,但是还有一个隐含的参数‘LMyObject’在两个整形参数之前,所以总共有三个参数在这个方法中。


    我们假设你在一个方法中制定了5个寄存器(v0-v4),既不是寄存器5管理也不是本地寄存器2管理(2个本地寄存器和3个参数寄存器)


    当该方法被调用后,被调用的对象是V2,第一个整型参数是V3,第二个是V4。在静态方法中也是同样的,除非没有隐含的this指针参数。


    寄存器名称


    对于寄存器这里有两种命名方案—标准的V命名方案和对于参数寄存器的P命名方案。


    以p命名的第一个寄存器就是方法中的第一个参数寄存器,所以让我们回到之前的总共拥有5个寄存器其中3个参数的例子。下表中显示了为每个寄存器的标准v命名,紧接着是为参数寄存器的p命名
     
    v0          the first local register            第一个本地寄存器
    v1     the second local register           第二个本地寄存器
    v2    p0    the first parameter register        第一个参数寄存器
    v3    p1    the second parameter register       第二个参数寄存器
    v4    p2  the third parameter register        第三个参数寄存器


    你可以通过每个名称类参照参数寄存器—这没有什么两样


    p命名方案是作为一个实用的内容被引入的来解决编辑smali编码中的共同的难点。


    假设你有一个已经存在的方法拥有一定数目的参数,你想增加一些代码到这个方法,你会发现你需要一个额外的寄存器。


    你会想,没什么大不了的,我仅仅在寄存器管理中增加寄存器数目就可以了。但是不幸的是,这并不容易。请记住方法中的参数是寄存在最近的寄存器中的。如果你增加寄存器数—你会改变方法参数的在寄存器中的输入。所以你就不得不改变寄存器管理并且重编号参数寄存器


    但是如果是你在方法中使用p命名模式来引用参数寄存器,你可以很容易的改变方法中的寄存器数而不必担心重编号任何存在的寄存器。


    注意:默认baksmali对于参数寄存器使用p命名模式来命名。如果你因为某些原因不适用p命名而强制使用V命名模式,你可以使用-p/--no-parameter-registers来选择。
    Long/Double values
    长整型/双精度型值


    鉴于以前提到过,长整型和双精度型(用J和D分别代表)的基本单元是64位,需要使用2个寄存器。


    当你引用方法中的参数时必须牢牢记住。


    例如,我们夹着你拥有一个非静态的方法LMyObject;->MyMethod(IJZ)V。方法的参数是“LMyObject;”,整形,长整形和布尔型。所以在这个方法中会要求五个寄存器来存放所有的参数。并且,当你以后调用这个方法时,你为了调用该指令不得不在寄存器列表中指定两个寄存器来存放任何64位的参数




    Baksmali现在可以来反编译odex文件,并且选择性的deodex他们。


    注意:本页说明仅仅应用于baksmali v0.96-v1.1。v1.2以上版本开始不再要求deodexrant.随心版本说明可以在http://code.google.com/p/smali/wiki/DeodexInstructions找到。


    详细介绍


    他要求deodexrant 的帮助,这是一个较小的可以在手机上运行并且连接到dalvik酷的二进制文件


    他的目的在从正在运行的dalvik中获得类似寄存器表,域偏移量等信息提供给baksmali
    Deodexrant的语法如下:
    deodexerant <odex_file> <port>


     
    接着baksmali拥有一个新的选项来告诉deodex文件,语法如下:
    baksmali -x <host>:<port> <odex_file>


    你也可以用-x :<port> 作为 –x localhots:<port>的快捷方式


    主要的事情你必须记住的是当你将文件deodex化的时候,当odex文件被创建的时候你必须运行一些“bootclasspath”jar文件


    最容易满足的这个的是当你尝试deodex的时候运行在硬件上。如果你需要从不同的硬件上deodex一些文件时也有可能改变根目录环境,但是我会将它作为一个练习留给读者
     
    我们假设你正在运行一个基于美国移动商的官方版本的rom,并且苹果程序在/system/app目录下被deodex。一个deodex交互会像如下情形:
    adb push deodexerant /data/local
    adb shell chmod 755 /data/local/deodexerant
    adb forward tcp:1234 tcp:1234
    adb pull /system/app/Calculator.odex .
    adb shell /data/local/deodexerant /system/app/Calculator.odex 1234 &
    java -jar baksmali.jar -x :1234 Calculator.odex


    你会活得一系列的smali文件在外层目录下,准备好用smali反编译这些dex文件。


    注意我如何适应adb来通过usb来通信。如果你试着用wifi这个将会很慢。


    鉴于baksmali向deodex制造了大量短小的同步请求,潜在上抑制了性能,所以usb连接比wifi用时更少
    Troubleshooting
    解决问题
    When deodexing, there are several common issues you may run into.
    当进行deodex的时候,可能会有几个问题你会遇上
    The most common, which is almost guaranteed to happen if you're deodexing an entire build, is an error which is something like "Cannot find class Lfoo/bar; for common superclass lookup".
    最常见保证很有可能发生的是如果你deodex一个完整的构造,会出现一个类似的错误“Cannot find class Lfoo/bar; for common superclass lookup”。
    这是由于当odex文件拥有在标准的BOOTCLASSPATH一个额外的附属物超出了jars的范围
    This is caused when the odex file has an additional dependency, beyond the jars in the normal BOOTCLASSPATH. To resolve the issue, you need to find which jar contains the class mentioned in the error message, and then add that to the BOOTCLASSPATH environment variable (on the phone/device/emulator) before running deodexerant. 
    为了解决这个问题,你需要找到那个包含错误信息提示的那个类的jar文件并且在运行deodexrant前将它添加到BOOTCLASSPATH环境变量中。
    You can usually guess which jar it is from the class name, but if not, you can disassemble the jars and find which one has that class.
    通常你可以根据类名来猜测是哪个jar,如果不行,你可以反编译jars然后找出包含该类的jar
    Once you find the extra dependency, let's say /system/framework/com.google.android.maps.jar (which is one that is commonly needed), the deodexerant command would be
    (on linux/mac)
    一旦你找到了该额外的附属,我们就假设它是/system/framework/com.google.android.maps.jar
    (这是普遍被需求的一个jar),那么deodexrant命令就如下(linux和mac平台)
    adb shell BOOTCLASSPATH=\$BOOTCLASSPATH:/system/framework/com.google.android.maps.jar deodexerant blah.odex 1234 &


    Windows平台
    adb shell BOOTCLASSPATH=$BOOTCLASSPATH:/system/framework/com.google.android.maps.jar deodexerant blah.odex 1234 &
    ________________________________________


    另外的一件你可能遇到的事实堆溢出。错误提示类似“java.lang.OutOfMemoryError: Java heap space”。解决他的办法是你可以增加java参数-Xmx512m来增加堆到512Mb。当然如果需要你也可以增加到更大。如果你正在使用类似“java -jar baksmali.jar”来运行baksmali,可以用如下指令来代替
    java -Xmx512m -jar baksmali.jar -x :1234 blah.odex


    如果你正在使用封装脚本
    baksmali -JXmx512m -x :1234 blah.odex
    ________________________________________


    另外一件事是发生在一些平台上(个人认为尤其是windows平台)的堆溢出。错误提示类似“java.lang.StackOverflowError”。错误的堆栈轨迹很可能是包含了类似"at org.jf.dexlib.Util.DeodexUtil$insn.propagateRegisters(DeodexUtil.java:1396)"的说明。
    为了修正这个错误,你可以用-Xss10m指令来增加堆空间
    java -Xss10m -jar baksmali.jar -x :1234 blah.odex
    or
    baksmali -JXss10m -x :1234 blah.odex 

    展开全文
  • SMALI

    千次阅读 2013-01-15 22:54:55
    初识SMALI 摘自:http://www.ztx.me/archives/115  前面我们说,apk文件可以解包成smali文件。那么smali是什么?这还要从dalvik说起。dalvik是google专门为android操作系统设计的虚拟机,经过深度...
     
    

    初识SMALI

      前面我们说,apk文件可以解包成smali文件。那么smali是什么?这还要从dalvik说起。dalvik是google专门为android操作系统设计的虚拟机,经过深度优化。虽然android程序也是用java语言来编写,不过dalvik与标准java虚拟机JVM还是两码事。前者是基于寄存器的而后者是基于栈的,前者拥有其专属的文件格式dex(dalvik executable)而后者执行的是java字节码,所以dalvik比jvm速度更快,占用空间更小。

      我们从apk中解出的smali,其实质是把dex转换为smali,dex文件格式相当紧凑,里面包含着指令,只不过都是16进制的看起来相当不便。介绍了一些背景,总结起来一句话,smali是dalvik虚拟机内部执行的核心代码,他也有自己的语法,下面先来看一下他的基本类型:

    • B (byte)
    • C (char)
    • D (double)
    • F (float)
    • I (int)
    • J (long)
    • S (short)
    • V (void)
    • Z (boolean)
    • [XXX (array)
    • LXXX (object)

      这里需要解释的是数组和对象,数组以[开头,如整数数组[I,对象以L开头,格式为LpackageName/objectName;(分号结尾),如字符串对象Ljava/lang/String;,字符串对象数组[Ljava/lang/String;。知道了这些基本类型,再了解方法时就能一目了然:

    function (Z[I[ILjava/lang/String;J)Ljava/lang/String;

    有点晕?没关系,这个方法的声明相当于:

    String function (boolean, int[], int[], String, long)

    在调用的时候要遵循下面的格式:

    LpackageName/objectName;->functionName (ZI[I)V

    在一个类中我们声明域的方法跟上面的都很类似,只是在前面加上.field,就不再多说了,了解一下即可。

    .field LpackageName/objectName;->fieldName:Ljava/lang/String;


      之前说过,dalvik是基于寄存器的,所以在函数内部避免不了的就是操作寄存器,那么在dalvik里是如何定义寄存器的呢?目前最流行的一种方法是,本地寄存器用v开头数字结尾表示,如v0、v1、v2...,参数寄存器用p开头数字结尾,如p0、p1、p2...。在使用寄存器之前,要在函数内部用.locals声明本函数内公用了多少个本地寄存器,结合下面的例子就清楚了:

    # virtual methods
    .method public static printfStr(ZLjava/lang/String;)V
    .locals 1      //声明此函数需要一个本地寄存器v0
    
    if-eqz p0, :cond_0      //判断参数1若为假则跳转到:cond_0
    
    //下面两句相当于System.out.println(String)
    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
     
    invoke-virtual {v0, p1}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
    
    :cond_0
    return-void      //返回
    
    .end method


      最后需要做几个额外的说明,上面的例子我把它声明为static,本身没有this方法,所以参数寄存器是从p0开始计数,若非static方法,参数寄存器则是从p1开始对应,而p0则是隐含的this所用。若变量为double或long方法,则此变量需要两个寄存器来存储。smali最基本语法大致就是如此,我们先做一个简单的了解,含有非常多的指令我们没有用到,贴一个官方的介绍,dalvik操作码,先看一下,具体在后面实战时边用边说。

    展开全文
  • Smali

    2017-12-30 20:33:02
    对于普通的数值, 可以把 const/high16 v0 0x.... 可以直接改成const v0 0x...

    对于普通的数值, 可以把  const/high16  v0 0x....  可以直接改成const v0 0x... 

    展开全文
  • smali2java——直接将smali转换成java

    万次阅读 多人点赞 2016-09-23 11:04:35
    主界面图smali2java是一个将smali代码反编译成java代码的工具。什么是smalismali是将Android字节码用可阅读的字符串形式表现出来的一种语言,可以称之为Android字节码的反汇编语言。使用baksmali或apktool可以将...

    http://www.hensence.com/cn/smali2java/

    这里写图片描述
    主界面图

    smali2java是一个将smali代码反编译成java代码的工具。

    什么是smali?smali是将Android字节码用可阅读的字符串形式表现出来的一种语言,可以称之为Android字节码的反汇编语言。使用baksmali或apktool可以将Android应用程序包(apk或jar)反编译为smali代码。

    smali2java工具基于apktool v1.5.0(baksmali v1.3.4)生成的smali文件,依赖于smali文件中的代码行数(.line关键字)和变量别名(.local关键字)等信息,可以最大程度还原原始的java代码。还原出的java代码将具有原始的变量命名,代码的顺序也与原始的java代码保持一致。因此,本工具也具有局限性,仅适用于带有行数和变量别名信息的smali文件(java编译器的编译选项可以在生成的字节码中剔除这些信息)。

    smali2java使用了apktool将Android字节码文件转换为smali文件。界面显示中使用了CCrystalTextView(作者:Stcherbatchenko Andrei)作为java语法高亮显示控件,在此向这些软件或代码的作者表示感谢。

    原网址:http://blog.csdn.net/jdsjlzx/article/details/41548391

    使用工具:https://pan.baidu.com/s/1Cr1E4Cw7d_djRkU92R12kQ

    展开全文
  • smali, smali/baksmali.zip

    2019-09-18 14:19:11
    smali, smali/baksmali smali/baksmali是dalvik使用的dex格式的汇编器/反汇编程序,它是android虚拟机实现的。 这种语法基于jasmin的/dedexer语法,支持dex格式( 注释。调试信息。行信息。等等 )的全部功能。下载...
  • Smali2Java 该项目尝试从Dalvik使用的反汇编代码创建有效的Java源代码 该项目的主要目标是验证混淆策略的工作效果,以及攻击者可以从您的源中收集到什么。 在此处阅读规范: : 如果有类的工具,为什么还要使用它...
  • smali/baksmali is an assembler/disassembler for the dex format used by dalvik, Android's Java VM implementation. The syntax is loosely based on Jasmin's/dedexer's syntax, and supports the full ...
  • smali_v2.2.2

    2018-04-19 22:39:50
    smali android smali android smali android smali android smali android smali android smali android smali android smali android smali android smali android smali android smali android smali android ...
  • smali 语法 高亮

    2019-05-08 17:17:45
    菜单-》语言-》自定义语言格式-》导入。重新打开.Notepad++ smali语法高亮, 使smali 源码显示更易于理解
  • Smali2Java

    2018-07-21 16:36:59
    smali文件直接反编译成java代码的工具 smali文件由apktool反编译得到
  • Smali手册.zip

    2021-05-12 09:43:19
    smali语法规则解释
  • java2smali

    2019-04-09 10:52:54
    java2smali可以进行java和smali直接的转换,方便不懂smali语言的朋友修改smali代码。
  • smali语法

    千次阅读 2017-01-19 14:20:09
    smali文件格式每个smali文件都由若干条语句组成,所有的语句都遵循着一套语法规则。在smali 文件的头3 行描述了当前类的一些信息,格式如下:[java] view plaincopy.class [ 修饰关键字] .super .source 打开...
  • Smali基础知识

    万次阅读 多人点赞 2018-05-29 11:22:39
    Smali是什么? 简介 Smali是用于Dalvik(Android虚拟机)的反汇编程序实现,汇编工具(将Smali代码汇编为dex文件)为smali.jar,与之对应的baksmali.jar则是反汇编程序(下载地址),官方所说的基于Jasmin/...
  • smali2java

    2018-08-13 20:54:19
    smali2java是一个将smali代码反编译成java代码的工具,是基于apktool v1.5.0(baksmali v1.3.4)生成的smali文件,依赖于smali文件中的代码行数(.line关键字)和变量别名(.local关键字)等信息,可以最大程度还原...
  • Smali to JAVA

    2018-06-26 19:06:49
    smali to java这个软件能够使安卓的smali语言变成可读的JAVA语言,使用方便,适合初学者使用。
  • Smali语法

    千次阅读 2018-11-23 20:51:27
    apk文件通过apktool反编译出来的都有一个smali文件夹,里面都是以.smali结尾的文件。 Smali是什么? Smali是安卓系统里的Java虚拟机(Dalvik)所使用的一种.dex格式文件的汇编器,而Baksmali是反汇编器。其语法是一...
  • ava2Smali(Java代码转Smali工具)是一款可以自动将java代码转换成smali的工具,当然也可以将smali代码转换成java
  • Smali初识

    2018-09-08 17:07:54
    Smali初识 Smali初识 开始Smali的学习之前,也让我回想起很多陈年旧事,它好像就是串联我技术路线的目标或者动力所在。 对Smali接触的真心不多。从大一的时候了解到smali可以用来做ROM移植。之后便在...
  • smali-2.2.1

    2017-10-01 18:01:27
    smali-2.2.1 最新版 官方更新日期:2017-05-23 含: smali-2.2.1.jar,baksmali-2.2.1.jar
  • Smali_BakSmali

    2017-04-14 17:59:27
    Smali_BakSmali jar包
  • smali1.3.3

    2013-03-18 12:08:42
    smali1.3.3;反编译工具~odex反编译~

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,374
精华内容 3,749
关键字:

smali