日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

011 smali语法详解

發(fā)布時間:2025/3/21 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 011 smali语法详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • smali文件解讀
      • 描述類信息
      • 靜態(tài)字段
      • 實(shí)例字段
      • 直接方法
      • 虛方法
      • 接口
    • Smali基礎(chǔ)語法
      • 寄存器
      • 數(shù)據(jù)類型
      • 字段和方法的表示
    • Smali指令集
      • 空操作指令
      • 數(shù)據(jù)操作指令
      • 返回指令
      • 數(shù)據(jù)定義指令
      • 跳轉(zhuǎn)指令
      • 方法調(diào)用指令

smali文件解讀

描述類信息

在打開Smali文件時,它的頭三行描述了當(dāng)前類的一些信息:

.class public Lcom/test/helloworld16/MainActivity; .super Landroid/support/v7/app/AppCompatActivity; .source "MainActivity.java"
  • 第一行表示的含義是當(dāng)前class的包名和類名
  • 第二行表示的是父類的包名和類名
  • 第三行表示的是源文件的名稱

靜態(tài)字段

Smali文件類的主體部分:一個類由字段和方法組成。.field字段聲明,字段分兩類:靜態(tài)字段和實(shí)例字段

語法格式如下

.field < 訪問權(quán)限> static [ 修飾關(guān)鍵字]< 字段名>:< 字段類型>

實(shí)例字段

實(shí)例字段相比于靜態(tài)字段少了一個static的靜態(tài)聲明,其他均相同

直接方法

smali的方法聲明使用的.method指令,方法分為直接方法和虛方法兩種。

方法格式如下:

.method <訪問權(quán)限> [ 修飾關(guān)鍵字] < 方法原型>

其他字段含義

  • **.registers:**指令指定了方法中寄存器的總數(shù),這個數(shù)量是參數(shù)和本地變量總和
  • **.param :**表明了方法的參數(shù),每個.param指令表示一個參數(shù),方法使用了幾個參數(shù)就有幾個.parameter指令
  • **.prologue:**指定了代碼的開始處,混淆過的代碼可能去掉了該指令
  • **.line:**指明了該處代碼在源代碼中的行號,同樣,混淆后的代碼可能去掉了行號
  • **.local:**使用這個指定表明方法中非參寄存器

虛方法

虛方法:是指從父類中繼承的方法或者實(shí)現(xiàn)的接口的方法,它的聲明跟直接方法相同,只是起始的初始為virtual methods ,格式如下

.method <訪問權(quán)限> [ 修飾關(guān)鍵字] < 方法原型>

接口

如果一個類實(shí)現(xiàn)了一個接口,那么會在smali文件中用.implements指令指出

Smali基礎(chǔ)語法

寄存器

Dalvik中的寄存器都是32位大小,支持所有類型。對于小于或等于32位類型,使用一個寄存器就可以了,對64位(long和double)類型,需要使用兩個相鄰的寄存器來存儲。

寄存器的命名法有兩種:V命名法和P命名法:

v命名法:局部變量寄存器V0-Vn,參數(shù)寄存器是Vn-Vn+m。

p命名法:參數(shù)寄存器P0-Pn,變量寄存器V0-Vn。

  • p0->this
  • p1,p2參數(shù)
  • v0,v1局部變量

數(shù)據(jù)類型

在smali代碼中數(shù)據(jù)類型以類型描述符來表示

基本數(shù)據(jù)類型標(biāo)識方法如下:

引用數(shù)據(jù)類型標(biāo)識方法如下:

  • String–>Ljava/lang/String;
  • int[]–>I[
  • String[]–>Ljava/lang/String;[

例如:

.method protected onCreate(Landroid/os/Bundle;)V

上面的smali代碼,翻譯成JAVA源碼則是下面的方式

protected void onCreate(Bundle bundle);

字段和方法的表示

字段格式:類型(包名+類名)+字段名稱+字段類型

字段描述

在JAVA中假設(shè)有一個類:com.test.Person,類有一個屬性:int id,在smali中則用下面的方法表示:

Lcom/test/Person;->id:I

語法為:類名->屬性名:屬性類型

方法描述

在JAVA中假設(shè)有一個類:com.test.Person,類有一個方法:void setId(int id);,在smali中則用下面的方法表示:

Lcom/test/Person;->setId(I)V

語法為:完整類名->方法名(參數(shù)類型)返回類型

Smali指令集

Dalvik的指令格式:

基礎(chǔ)字節(jié)碼 - 名稱后綴/字節(jié)碼后綴 目的寄存器 源寄存器

名稱后綴是wide,表示數(shù)據(jù)寬度為64位。字節(jié)碼后綴是from16,表示源寄存器為16位。

Dalvik指令集中大多數(shù)指令用到了寄存器作為目的操作數(shù)或者是源操作數(shù),其中A/B/C/D/E/F/G表示一個4位的數(shù)值,AA/BB/HH表示一個8位的數(shù)值,AAAA/BBBB表示16位的數(shù)值

空操作指令

空操作指令的助記符為nop,它的值為00,通常nop指令被用來做對齊代碼之用,無實(shí)際操作含義

數(shù)據(jù)操作指令

數(shù)據(jù)操作指令為move。move指令根據(jù)字節(jié)碼大小和類型不同,后面會跟上不同的后綴,表達(dá)的意義也不同

  • **“move vA, vB”:**將vB寄存器的值賦給vA寄存器,源寄存器與目的寄存器都為4位
  • **“move/from16 vAA, vBBBB”:**將vBBBB寄存器的值賦給vAA寄存器,寄存器為16位,目的寄存器為8位
  • **“move/16 vAAAA, vBBBB”:**將vBBBB寄存器的值賦給vAAAA寄存器,源寄存器與目的寄存器都為16位。
  • **“move-wide vA, vB”:**為4位的寄存器對賦值。源寄存器與目的寄存器都為4位。
  • **“move-object vA, vB”:**object是對象的意思,出現(xiàn)這個詞即表示為對象賦值。源寄存器與目的寄存器都為4位
  • **“move-result vAA”:**將上一個invoke類型指令操作的單字非對象結(jié)果賦給vAA寄存器
  • **“move-exception vAA”:**保存運(yùn)行時發(fā)生的異常到vAA寄存器。這條指令必須是異常發(fā)生時的異常處理器的一條指令,否則指令無效。

總結(jié)起來move指令有三種作用:

  • 進(jìn)行賦值操作
  • 接收返回值操作
  • 處理異常的操作
  • 返回指令

    返回指令即return指令,指的是函數(shù)結(jié)尾時運(yùn)行的最后一條指令。共有以下四條返回指令 :

    • **“return-void”:**表示函數(shù)從一個void方法返回,返回值為空
    • **“return vAA”:**表示函數(shù)返回一個32位非對象類型的值,返回值寄存器為8位的寄存器vAA。
    • **“return-wide vAA”:**表示函數(shù)返回一個64位非對象類型的值,返回值為8位的寄存器對vAA
    • **“return-object vAA”:**表示函數(shù)返回一個對象類型的值,返回值為8位的寄存器vAA

    數(shù)據(jù)定義指令

    數(shù)據(jù)定義指令用來定義程序中用到的常量,字符串,類等數(shù)據(jù)。它的基礎(chǔ)字節(jié)碼為const

    • **“const/4 vA, #+B”:**將數(shù)值符號擴(kuò)展為32位后賦給寄存器vA。
    • **“const/16 vAA, #+BBBB”:**將數(shù)據(jù)符號擴(kuò)展為32位后賦給寄存器vAA
    • **“const-wide/16 vAA, #+BBBB”:**將數(shù)值符號擴(kuò)展為64位后賦給寄存器對vAA
    • **“const-string vAA, string@BBBB”:**通過字符串索引構(gòu)造一個字符串并賦給寄存器vAA
    • **“const-class vAA, type@BBBB”:**通過類型索引獲取一個類引用并賦給寄存器vAA

    跳轉(zhuǎn)指令

    if條件跳轉(zhuǎn)有如下幾種

    跟x86的JCC跳轉(zhuǎn)有異曲同工之妙

    方法調(diào)用指令

    方法調(diào)用指令負(fù)責(zé)調(diào)用類實(shí)例的方法,它的基礎(chǔ)指令為invoke

    • invoke-virtual或invoke-virtual/range :調(diào)用實(shí)例的虛方法
    • invoke-super或invoke-super/range :調(diào)用實(shí)例的父類/基類方法
    • invoke-direct或invoke-direct/range :調(diào)用實(shí)例的直接方法
    • invoke-static或invoke-static/range :調(diào)用實(shí)例的靜態(tài)方法
    • invoke-interface或invoke-interface/range :調(diào)用實(shí)例的接口方法

    總結(jié)

    以上是生活随笔為你收集整理的011 smali语法详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 天天干一干 | 久久咪咪| 久久久久久久香蕉 | 白浆四溢 | 午夜日韩视频 | 嘿咻视频在线观看 | 国产极品999| 免费黄色大片网站 | 欧美一区二区免费视频 | 亚洲aa在线观看 | 精品在线二区 | 在线三区| 欧美一级色图 | 亚洲视频第一页 | 性色av无码久久一区二区三区 | 国产精品久久福利 | 女人扒开双腿让男人捅 | 伊人网站 | 中文字幕高清一区 | 操操影视 | 日韩中文字 | 欧美日国产 | 国产麻豆精品在线观看 | 色噜噜狠狠一区二区三区果冻 | 一级片免费在线观看 | 成人片黄网站色大片免费毛片 | 日韩二区在线 | 自拍视频啪 | 在线观看成人av | 青青伊人国产 | 国产精品白嫩极品美女视频 | 日韩有码专区 | 免费av在线网 | 精品国产区 | 亚洲一区二区色 | 国产一区二区久久精品 | 肉肉h | 亚洲av无码一区二区三区在线播放 | 久草超碰| 亚洲a精品 | 波多野吉衣一二三区乱码 | 亚洲性网站 | 国产中文字幕视频 | 久久网站免费看 | 日韩精品极品 | 在线中出 | 国产在线一区视频 | 致单身男女免费观看完整版 | 欧美偷拍第一页 | 先锋影音av资源站 | av网站观看 | 亚洲欧洲日本国产 | 久久在线免费观看视频 | 先锋av资源网站 | 国产伦精品一区二区三区四区 | 久久亚洲一区二区三区四区 | 91毛片在线观看 | 免费看黄色av | www性| 一级片播放| 日日色av| 午夜看片 | 亚洲第一成肉网 | av首页在线观看 | 国产免费内射又粗又爽密桃视频 | 婷婷综合亚洲 | 久久新网址 | 国产三级黄色 | 亚洲品质自拍视频网站 | 国产外围在线 | 色人人 | a天堂在线观看 | 亚洲精品3 | 国产农村妇女精品一区二区 | 性色国产成人久久久精品 | 久久精品导航 | 国产一区二区a | 在线观看特色大片免费网站 | 中文人妻熟女乱又乱精品 | jlzzzjlzzz国产免费观看 | 欧美成人极品 | 中国一级大黄大黄大色毛片 | 欧美激情国产一区 | 成人在线影视 | 在线观看sm | 日韩欧美99 | 96日本xxxxxⅹxxx17| 一级片免费看视频 | 欧美色爽| 91插插插永久免费 | 中文字幕一区二区免费 | 先锋影音亚洲 | 日韩深夜福利 | 在线免费看污片 | 久久蜜桃av一区二区天堂 | 精品丰满少妇一区二区三区 | 老司机午夜免费福利 | 黑人干日本少妇 | 深夜福利院 |