使用Apktool反编译apk文件后,会在反编译工程目录下生成一个smali文件夹,里面存放着所有反编译出的smali文件,这些文件会根据程序包的层次结构生成相应的目录,程序中所有的类都会在相应的目录下生成独立的smali文件。如上一节中程序的主Activity名为com.droider.crackme0502. MainActivity,就会在smali目录下依次生成com\droider\ crackme0502目录结构,然后在这个目录下生成MainActivity.smali文件。

smali文件的代码通常情况下比较长,而且指令繁多,在阅读时很难用肉眼捕捉到重点,如果有阅读工具能够将特殊指令(例如条件跳转指令)高亮显示,势必会让分析工作事半功倍,为此笔者专门为文本编辑器Notepad++编写了smali语法文件来支持高亮显示与代码折叠,并以此作为smali代码的阅读工具。

无论是普通类、抽象类、接口类或者内部类,在反编译出的代码中,它们都以单独的smali文件来存放。每个smali文件都由若干条语句组成,所有的语句都遵循着一套语法规范。在smali文件的头3行描述了当前类的一些信息,格式如下。

.class [修饰关键字]

.super

.source

打开MainActivity.smali文件,头3行代码如下。

.class public Lcom/droider/crackme0502/MainActivity;

.super Landroid/app/Activity;

.source "MainActivity.java"

第1行“.class”指令指定了当前类的类名。在本例中,类的访问权限为public,类名为“Lcom/droider/crackme0502/MainActivity;”,类名开头的L是遵循Dalvik字节码的相关约定,表示后面跟随的字符串为一个类。

第2行的“.super”指令指定了当前类的父类。本例中的“Lcom/droider/crackme0502/ MainActivity;”的父类为“Landroid/app/Activity;”。

第3行的“.source”指令指定了当前类的源文件名。

回想一下,在上一章中讲解dex文件格式时介绍的DexClassDef结构,这个结构描述了一个类的详细信息,该结构的第1个字段classIdx就是类的类型索引,第3个字段superclassIdx就是指向类的父类类型索引,第5个字段sourceFileIdx就是指向类的源文件名的字符串索引。baksmali在解析dex文件时,也是通过这3个字段来获取相应的类的值。

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

前3行代码过后就是类的主体部分了,一个类可以由多个字段或方法组成。smali文件中字段的声明使用“.field”指令。字段有静态字段与实例字段两种。静态字段的声明格式如下。

# static fields

.field static [修饰关键字] :

baksmali在生成smali文件时,会在静态字段声明的起始处添加“static fields”注释,smali文件中的注释与Dalvik语法一样,也是以井号“#”开头。“.field”指令后面跟着的是访问权限,可以是public、private、protected之一。修饰关键字描述了字段的其它属性,如synthetic。指令的最后是字段名与字段类型,使用冒号“:”分隔,语法上与Dalvik也是一样的。

实例字段的声明与静态字段类似,只是少了static关键字,它的格式如下。

# instance fields

.field [修饰关键字] :

比如以下的实例字段声明。

# instance fields

.field private btnAnno:Landroid/widget/Button;

第1行的“instance fields”是baksmali生成的注释,第2行表示一个私有字段btnAnno,它的类型为“Landroid/widget/Button;”。

如果一个类中含有方法,那么类中必然会有相关方法的反汇编代码,smali文件中方法的声明使用“.method”指令。方法有直接方法与虚方法两种。直接方法的声明格式如下。

# direct methods

.method [修饰关键字]

[.parameter]

[.prologue]

[.line]

.end method

“direct methods”是baksmali添加的注释,访问权限和修饰关键字与字段的描述相同,方法原型描述了方法的名称、参数与返回值。“.locals”指定了使用的局部变量的个数。“.parameter”指定了方法的参数,与Dalvik语法中使用“.parameters”指定参数个数不同,每个“.parameter”指令表明使用一个参数,比如方法中有使用到3个参数,那么就会出现3条“.parameter”指令。“.prologue”指定了代码的开始处,混淆过的代码可能去掉了该指令。“.line”指定了该处指令在源代码中的行号,同样的,混淆过的代码可能去除了行号信息。

虚方法的声明与直接方法相同,只是起始处的注释为“virtual methods”。

如果一个类实现了接口,会在smali文件中使用“.implements”指令指出。相应的格式声明如下。

# interfaces

.implements

“# interfaces”是baksmali添加的接口注释,“.implements”是接口关键字,后面的接口名是DexClassDef结构中interfacesOff字段指定的内容。

如果一个类使用了注解,会在smali文件中使用“.annotation”指令指出。注解的格式声明如下。

# annotations

.annotation [注解属性]

[注解字段 = 值]

.end annotation

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

# instance fields

.field public sayWhat:Ljava/lang/String;

.annotation runtime Lcom/droider/anno/MyAnnoField;

info = "Hello my friend"

.end annotation

.end field

实例字段sayWhat为String类型,它使用了com.droider.anno.MyAnnoField注解,注解字段info值为“Hello my friend”。将其转换为Java代码为:

@ com.droider.anno MyAnnoField(info = "Hello my friend")

public String sayWhat;

samli文件_5.3 smali文件格式相关推荐

  1. R语言write.xlsx函数将数据写入Excel文件:写入Excel文件并自定义表单的名称、将数据写入Excel文件新的表单(sheet)中、将文件保存为xls文件格式(而不是xlsx)

    R语言write.xlsx函数将数据写入Excel文件:写入Excel文件并自定义表单的名称.将数据写入Excel文件新的表单(sheet)中.将文件保存为xls文件格式(而不是xlsx) 目录

  2. so文件linux注册,SO文件格式

    概要 SO文件是Linux下共享库文件,它的文件格式被称为ELF文件格式.由于Android操作系统的底层基于Linux系统,所以SO文件可以运行在Android平台上.Android系统也同样开放了 ...

  3. php下载apk文件源码下载,PHP_php下载文件源代码(强制任意文件格式下载),一个简单的php文件下载源代码 - phpStudy...

    php下载文件源代码(强制任意文件格式下载) 一个简单的php文件下载源代码,虽不支持断点续传等,但是可以满足一些常用的需求了.php下载文件其实用一个a标签就能实现,比如 magento-1.8.1 ...

  4. 已解决Excel无法打开文件test.xIsx“,因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。

    已解决Excel无法打开文件test.xIsx",因为文件格式或文件扩展名无效.请确定文件未损坏,并且文件扩展名与文件的格式匹配. 文章目录 报错代码 报错原因 解决方法 帮忙解决 报错代码 ...

  5. POI导出excel出现excel无法打开文件“xxx.xlsx”,因为文件格式或文件扩展名无效的问题

    POI导出excel出现excel无法打开文件"xxx.xlsx",因为文件格式或文件扩展名无效的问题 HSSFWorkbook和XSSFWorkbook混用会出现该问题 参考 h ...

  6. Word打开文件时,提示文件扩展名和文件格式不匹配,无法打开

    今天早上打开学习笔记的时候,word提示文件扩展名和文件格式不匹配,无法打开,在网上搜了很多教程,终于成功了,方法如下: 1.打开word,选择----->选项 2. 选择--->保存,复 ...

  7. pycharm 新建文件后选错文件格式怎么改

    pycharm 新建文件后选错文件格式怎么改 pycharm 版本 2021.1.3 版本 网上搜的都不能用, 版本不太一样, 可能设置的方式也不一样 比如这里新建文件时 指定了错误的文件类型, 虽然 ...

  8. 存在文件student.txt,文件格式为Sname:Sbirthyear:Sdept:Sage:Ssex,从文件中查找Sdept为“cs”的行信息,输出到文件csStudent.txt文件中去。

    题目:存在文件student.txt,文件格式为Sname:Sbirthyear:Sdept:Sage:Ssex,从文件中查找Sdept为"cs"的行信息,输出到文件csStude ...

  9. C4D不能加载object文件、obj文件?提示未知文件格式

    <C4D的十万个为什么>首发于 公众号:苦七君 免费搜索查看更多问题:kuqijun.com 问题: C4D不能加载object文件,obj文件?提示未知文件格式 答案: 要显示文件名后缀 ...

最新文章

  1. cast函数 oracle 日期_从Oracle到PG 该做的改造工作一个都不能少!
  2. 牛客小白月赛12:月月给华华出题(欧拉函数)
  3. 【Python】list和tuple 区别比较
  4. 数据中台的使命、愿景、本质和六大核心能力
  5. 通过避免下列 10 个常见 ASP.NET 缺陷使网站平稳运行
  6. FFMPEG 图像拉伸缩放及数据格式转换
  7. MySQL02:DQL语言的学习
  8. 【离散期末复习】:集合论
  9. 从Jira到GitHub,详解Spring Framework问题跟踪系统的迁移过程
  10. python验证码校验代码_python 图片验证码代码
  11. 用android编写使用按钮ImageButton和切换器ImageSwitcher
  12. 代码整洁之道内容概括
  13. 微信语音红包小程序开发如何提高精准度 红包小程序语音识别精准度 微信小程序红包开发语音红包...
  14. 试用钉钉内网映射工具
  15. 基于keras实现双向GRU的中文情感分析
  16. 基于JAVAweb唐院寻人表白系统计算机毕业设计源码+数据库+lw文档+系统+部署
  17. 荒野、车居生活与自由世界——读《车轮上的瓦尔登湖》
  18. 客观评价,一起看看iPhone 12是否值得你入手?
  19. linux图像编辑,Photoflare:Linux下简单的开源图像编辑器
  20. 过勇 清华计算机系,16位清华学霸的简历—比你牛的人还比你努力,膝盖已跪碎...

热门文章

  1. python3.7安装numpy模块-Python3.7模块numpy
  2. 黑客用python还是ruby-Python、Ruby、Go语言哪个更值得学习?
  3. python入门教程2word-使用python操作word
  4. python基础教程书籍推荐-初学者python入门必看书籍推荐(上)
  5. python怎么学最快-零基础怎么样才能学好Python?Python入门必看
  6. python安装流程-python安装流程和注意事项
  7. python基础语法第10关作业-Python基础语法习题
  8. python自学免费课堂-python自学——文件打开
  9. python操作excel-Python对Excel的读写等操作(转)
  10. 通俗易懂的sys.argv[]的用法