zoukankan      html  css  js  c++  java
  • 安卓逆向学习---初始APK、Dalvik字节码以及Smali

    参考链接:https://www.52pojie.cn/thread-395689-1-1.html

    res目录下资源文件在编译时会自动生成索引文件(R.java ),

    asset目录下的资源文件无需生成索引。

    一般来说:使用C++游戏引擎的资源文件放在asset下

          java开发中除音频和视频资源(放在raw或asset下),均放在res下。

    • 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/objectName$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 **

      

      

  • 相关阅读:
    [转]MyBatis传入多个参数的问题
    【转】赶集网mysql开发36军规
    C#套接字和windowsAPI套接字
    java中的注解
    java中的枚举类型
    过去的汇编代码
    近日错误集锦
    java swing模仿随机频谱
    java泛型中的对象
    XML-RPC远程方法调用
  • 原文地址:https://www.cnblogs.com/BANLOONG/p/10347209.html
Copyright © 2011-2022 走看看