• Dalvik字节码和Smali基本语法


    什么是Dalvik字节码

    Dalvik是Google专门为Android设计的一个虚拟机。
    Dalvik VM是基于寄存器的,而JVM是基于栈的,Dalvik有专属的文件执行格式dex(Dalvik executable),jvm使用的是java字节码。
    Dalvik VM你jvm速度更快,占用空间更少。

    什么是Smali

    Smali,baksmali分贝时指安卓系统里的java虚拟机(Dalvik)所使用的一种。dex格式文件的汇编器,反汇编器。
    语法为一行宽松的Jasmin/dedeser语法,且实现了.dex格式的所用功能(注解,调试信息,线路信息等)。
    对apk文件进行反汇编后,便会生成此类文件。其中在Dalvik字节码中,寄存器都是32位的,能够支持任何类型,64位类型(Long/Double)用2个寄存器表示。
    Dalvik字节码有两种类型:原始类型,引用类型。

    原始类型:  
    B --- byte
    C --- char
    D --- double
    F --- float
    I --- int
    J --- long
    S --- short
    V --- void
    Z --- boolean
    
    [XXX --- array  //数组表示方式:基本类型前加上“[”,
    eg:int型数组表示为:[I
    
    
    LXXX/yyy --- object  //对象表示以L开头,格式为LpackageName/objectName;(分号必须有)
    //eg:String在Smali中为:LJava/lang.String; ,其中java/lang对应java.lang包,String就是定义在该包中的一个对象。
    
    
    //内部类表示为:LpackName/objectNamesubObjectName;。即在内部类前面加“subObjectName;。即在内部类前面加“”符号。
    方法定义:Func-Name(para-Type1para-Type2para-Type3...)Return-Type  //参数之间没有空格
    
    eg:hello()v    //void hello()
    
    hello(III)Z    //boolean hello(int,int,int)
    
    hello(Z[I[ILjava/lang/String;J)Ljava/lang/String    //String hello(boolean,int[],int[],String,long)
    
    

    Smali基本语法

    
    .field private isFlag:z  定义变量
    
    .method       方法
    
    .parameter     方法参数
    
    .prologue      方法开始
    
    .line 123     此方法位于第123行
    
    invoke-super   调用父函数
    
    const/high16 vO, 0x7fo3   把0x7fo3赋值给v0
    
    invoke-direct   调用函数
    
    return-void   函数返回void
    
    .end method   函数结束
    
    new-instance   创建实例
    
    iput-object   对象赋值
    
    iget-object   调用对象
    
    invoke-static   调用静态函数
    
    条件跳转分支:
    "if-eq vA, vB, :con_**"   如果vA等于vB则跳转到:cond_ **
    
    "if-ne vA, vB, :cond_**"    如果vA不等于vB则跳转到:cond_ **
    
    "if-It vA, vB, :cond_**"    如果vA小于vB则跳转 到:cond_ **
    
    "if-ge vA, vB, :cond_**"     如果vA大于等于vB则跳转到:cond_ **
    
    "if-gt vA, vB, :cond_**"    如果vA大于vB则跳转到:cond_ **
    
    "if-le vA, vB, :cond_ *"     如果vA小于等于vB则跳转到:cond_ **
    
    "if-eqz vA, :cond_**"    如果vA等于0则跳转到:cond_ **
    
    "if-nez vA, :cond_**"    如果vA不等于0则跳转到:cond_ **
    
    "if-Itz vA, :cond_**"    如果vA小于0则跳转到:cond_**
    
    "if-gez vA, :cond_**"   如果vA大于等 于0则跳转到:cond_ **
    
    "if-gtz vA, :cond_**"     如果vA大于0则跳转到:cond_ **
    
    "if-lez vA, :cond_**"    如果vA小于 等于0则跳转到:cond ** 
    
  • 相关阅读:
    SpringMVC框架学习笔记(一)
    Spring框架学习笔记(四)
    Spring框架学习笔记(三)
    Spring框架学习笔记(二)
    Spring框架学习笔记(一)
    单点登录与权限管理本质:cookie安全问题
    单点登录与权限管理本质:单点登录介绍
    单点登录与权限管理本质:HTTP重定向
    单点登录与权限管理本质:session和cookie介绍
    「单点登录与权限管理」系列概述
  • 原文地址:https://www.cnblogs.com/gqv2009/p/16276641.html
Copyright © 2020-2023  润新知