首页 > 其他分享 >Smali语言

Smali语言

时间:2023-06-08 10:33:48浏览次数:31  
标签:vA String object v0 cond 跳转 Smali 语言

什么是Smali

smali语言是Davlik的寄存器语言,语法上和汇编语言相似,DalvikVM与JVM的最大的区别之一就是DalvikVM是基于寄存器的。基于寄存器的意思是,在smali里的所有操作都必须经过寄存器来进行。
因为安卓软件编译后,就得不到源代码了,我们只可以通过反编译后的Smail代码去修改来实现逆向的目的。

静态分析Android程序的两种方法

阅读反编译生成的Dalvik字节码。

  • 使用AndroidKiller_1.3.1分析dex文件
  • 使用MT管理器分析dex文件
  • 使用jadx查看

头信息------类的主体信息

在打开smali文件的时候,它的头三行描述了当前类的一些信息

.class <访问权限> [关键修饰字] <类名>;
.super <父类名>
.source <源文件名>
Java代码如下:
public class MainActivity extends AppComatActivity{
          //......
}
对应的Smali代码如下:
.class Lcom/example/myapplication/MainActivity$1;  //该表示MainActivity是该包的一个对象
.super Ljava/lang/Object;
.source "MainActivity.java"

.class 指令表示当前的类名,类的访问权限是public,类名是Lcom/example/myapplication/MainActivity$1; ,类开头的L是遵循Dalvik字节码的相关约定,表示后面跟随的字符串是一个类。
.super指定了当前类所继承的父类,后面指的就是这个父类的类名,L表示后面跟的字符串是一个类
.source指定了当前类的源文件名

数据原始类型

  • B---byte
  • C---char
  • D---double
  • F---float
  • I---int
  • L---long
  • S---short
  • V---void
  • Z---boolean
  • [XXX---array
  • Lxxx/yyy---object

Smali的数组表示

在基本类型前加上"["即表示该类型的数组;如

[I:表示整型的数组;[F:表示浮点型float的数组

  • 如果是对象类型,则以L作为开头,格式是LpackageName/objectName;如Ljava/lang/String;表示String是该包的一个对象。

  • 类对象表示为LpackageName/objectName;类对象中的内部类则使用"$"来连接。

Smali方法的定义

方法的一般定义为:
Func-Name(Para-Type1Para-Type-2Para-Type...)Return-Type
参数之间没有任何间隔;如
Hello()V:表示 void hello()
Hello(III)Z表示:Boolean hello(int,int,int)
Hello(Z[I[ILjava/lang/String;L)Ljava/lang/String; 表示:String Hello(boolean,int[],int[],String,,long)

Smali的一些关键词

  • .filed private isFlage:z 定义变量
  • .method 方法
  • .parameter 方法参数
  • .prologue 方法开始
  • .line 此方法位于第123行
  • .invoke-super 调用父函数
  • .const/high16 v0,0x7fo3 把0x7fo3赋值给v0
  • .invoke-direct 调用函数
  • .return-void 函数返回void
  • .end-method 函数结束
  • new-instance 创建实列
  • input-object 对象赋值
  • iget-object 调用对象
  • invoke-static 调用静态函数

Smali的条件跳转

  • "if-eq vA,vB:cond_" 如果vA等于vB则跳转到cond**(eq==equal)

  • "if-ne vA,vB:cond_" 如果vA不等于vB则跳转到cond**
    (nq == not equal)

  • "if-lt vA,vB:cond_" 如果vA小于vB则跳转到cond**
    (lt == less)

  • "if-ge vA,vB:cond_" 如果vA大于等于vB则跳转到cond**
    (ge==greater equal)

  • "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-ltz 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**

Smali中内部类声明

一般来说在Smail文件中是这个样子的:

annotations

.annotation system Ldalvik/annotation/MemberClasses;
value = {
Lcom/aaa$qqq;
Lcom/aaa$wwww;
}
.end annotation
这个声明式内部类的声明;aaa这个类它有两个内部类----qqq和www。

Smali类的信息

.class public Lcom/aaaaa;
.super Lcom/bbbbb;
.source "ccccc.java"
这是一个由ccccc.java编译得到的smail文件(第三行)
它是com.aaaaa这个package下的一个类(第一行)
继承自com.bbbbb这个类(第二行)

Smali类中成员变量表示和操作

  • 成员变量格式是:.filed public/private[static][final] varName<类型>
  • 获取的指令有:iget sget、iget-boolean、sget-boolean、iget-object 、sget-object等
  • 写入的指令有:iput、sput、iput-boolean、sput-boolean、iput-object、sput-object等。
  • 没有"-object"后缀的表示操作的成员变量对象是基本数据类型,带"-object"表示操作的成员变量是对象类型,特别地,boolean类型则使用"-boolean"的指令操作

Smail成员变量指令简析

  • sget-object v0,Lcom/aaa;->ID:Ljava/lang/String
    sget-object用来获取变量赋值并保存到紧接着的参数的寄存器中,本例中,它获取ID这个String类型的成员变量并发到v0这个寄存器中。
    注意:前面需要该变量所属的类的类型,后面需要加一个冒号和该成员变量的类型,中间"->"表示所属关系。
  • iget-object v0,p0,Lcom/aaa;->view:Lcom/aaa/view;
    可以看到iget-object指令比sget-object多了一个参数,就是该变量所在类的实例,在这里就是p0即"this"。

Smali代码函数的调用

1.invoke-static:用于调用static函数

  • const-string v0,"NDKLIB"
  • invoke-static{v0},Ljava/lang/System;->loadLibrary(Ljava/kang/String;)V
    调用static void System.loadLibrary(String)来加载NDK编译的so库用的方法;这里v0就是参数"NDKLIB"
    2.invoke-super:一般用于onCreate、onDestory等方法。调用父类方法用的指令。
    3.invoke-direct:调用private函数
    invoke-direct{p0},Landroid/app/TabActivity;->()V
    这里init()就是定义在TabActivity中的一个private函数
    4.invoke-virtual:用于调用protected或public函数。
    sget-object v0,Lcom/dddd;->bbb:Lcom/ccc
    invoke-virtual{v0,v1},Lcom/ccc;->Message(Ljava/lang/Object;)V
    V0是bbb:Lcom/ccc
    v1是爨地给Messages方法的Ljava/lang/Object参数。
    5.invoke-xxxx/range:当方法的参数多于5个时(含5个),不能直接使用以上的指令,而是在后面加上"range",range表示范围,使用方法也有所不同:
    invoke-direct/range{v0......v5},Lcmb/pb/ui/PBContainerActivity;->h(ILjava/lang/CharSequence;Ljava/lang/String;Landroid/content/Intent;l)Z 需要传递v0到v5一共6个参数,这时候大括号的参数采用省略形式,且需要连续。

Smali返回结果的操作

  • 在java代码中调用函数和返回函数结果可以用一条语句完成,而在Smail里则需要分开来完成,在使用上述指令后,如果调用的函数返回非void,那么还需要用到move-result(返回基本数据类型)和move-result-object(返回对象)指令:
    const-string v0,"Eric"
    invoke-static{v0},Lcmb/pbi;->t(Ljava/lang/String;)Ljava/lang/String;
    move-result-object v2
    v2保存的就是调用t方法的String字符串。

标签:vA,String,object,v0,cond,跳转,Smali,语言
From: https://www.cnblogs.com/doubleconquer/p/17173799.html

相关文章

  • 如何快速使用ChatGPT AI语言模型
    如何快速使用ChatGPTAI语言模型测试日期:2023年6月初1.打开浏览器访问:https://gpt.aigcfast.com2.输入问题后,点击“发送”按钮。3.说明:大型语言模型AI答案会随即给出;支持手机和电脑等各种设备请自我考量隐私和信息的正确性,只做一个临时推荐,有效期不确定,本文将持续更新......
  • 自然语言处理(NLP)学习笔记——文本预处理
    自然语言处理入门1、什么是自然语言处理自然语言处理(NaturalLanguageProcessing,简称NLP)是计算机科学与语言学中关注于计算机与人类语言间转换的领域。2、自然语言处理的发展简史1950年,计算机科学之父图灵在论文中提出“机器可以思考吗”者一划时代的问题,从此促成了人类语言学与计......
  • 谈一谈冷门的C语言爬虫
    C语言可以用来编写爬虫程序,但是相对于其他编程语言,C语言的爬虫开发可能会更加复杂和繁琐。因为C语言本身并没有提供现成的爬虫框架和库,需要自己编写网络请求、HTML解析等功能。不过,如果你对C语言比较熟悉,也可以尝试使用C语言编写爬虫程序,这样可以更好地掌握爬虫的底层原理和实现方......
  • 6-8|如何使用Python语言开发IOS混淆工具
    在iOS开发中,混淆工具主要用于保护代码的安全性,避免别人通过反编译等手段获取到关键代码。Python语言是一门高效、易于编写和调试的开发语言,可以用它来编写iOS混淆工具。下面是一个简单的示例代码,用Python实现对Objective-C代码进行简单的混淆。```pythonimportosimportrandom......
  • 李开复谈AI和大语言模型的竞争格局和未来展望:谁将引领人工智能的下一个飞跃?
    原创|文BFT机器人李开复谈AI和大语言模型的竞争格局和未来展望:谁将引领人工智能的下一个飞跃?01AI2.0时代下:壮志凌云,自强不息5月28日,在2023中关村论坛“人工智能大模型发展论坛”上,创新工场董事长兼首席执行官李开复的演讲主要围绕,在AI2.0时代下,中国的大模型发展应该做到壮志凌云......
  • 谈一谈冷门的C语言爬虫
    C语言可以用来编写爬虫程序,但是相对于其他编程语言,C语言的爬虫开发可能会更加复杂和繁琐。因为C语言本身并没有提供现成的爬虫框架和库,需要自己编写网络请求、HTML解析等功能。不过,如果你对C语言比较熟悉,也可以尝试使用C语言编写爬虫程序,这样可以更好地掌握爬虫的底层原理和实现......
  • R语言进行支持向量机回归SVR和网格搜索超参数优化|附代码数据
    全文链接:http://tecdat.cn/?p=23305最近我们被客户要求撰写关于支持向量机回归的研究报告,包括一些图形和统计输出。在这篇文章中,我将展示如何使用R语言来进行支持向量回归SVR我们将首先做一个简单的线性回归,然后转向支持向量回归,这样你就可以看到两者在相同数据下的表现。一个......
  • R语言Copula对债券时间序列数据的流动性风险进行度量
    全文链接:http://tecdat.cn/?p=32707原文出处:拓端数据部落公众号在金融市场中,债券的流动性风险一直是一个备受关注的问题。流动性风险是指在市场上,债券价格的波动程度受到市场流动性的影响,这种影响可能导致债券价格的剧烈波动,从而影响投资者的收益。因此,对于债券流动性风险的度量......
  • 初识C语言:从0开始,由菜鸟变大牛(完结)
    上篇内容分享了两种语句(选择语句、循环语句)、函数、数组、各种操作符,本篇文章我们再来了解关于初识C语言的内容,同样,涉及到的知识不会太复杂,废话不多说,正文开始:1.常见关键字autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatf......
  • C语言编程—预处理器
    预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。我们将把C预处理器(CPreprocessor)简写为CPP。所有的预处理器命令都是以井号(#)开头。它必须是第一个非空字符,为了......