精华内容
下载资源
问答
  • 2015-06-13 14:49:05
    我在博客上发表一些我的反编译学习心得,希望对大家能有帮助。
    这一章学习基本的迭代器Iterator基本使用和反编译smali后迭代器的查看
    

    1、常见的两种迭代器代码

    //第一个中使用for-each
    Iterator<对象> <对象名> = <方法返回的一个对象列表>;
    for(<对象> <对象名> : <对象列表>) {
        [具体处理代码]
    }
    
    //第二种使用while
    Iterator<对象> <对象名> = <方法返回的一个对象列表>;
    while(<对象列表>.hasNext()) {
        <对象> <对象名> = <对象列表>.next();
        [具体处理代码]
    }

    Java中的Iterator功能比较简单,并且只能单向移动:

    (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
    (2) 使用next()获得序列中的下一个元素。
    (3) 使用hasNext()检查序列中是否还有元素,如果仍有元素可以迭代,则返回 true。
    (4) 使用remove()将迭代器新返回的元素删除。
    

    Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

    我们常用的实现了该接口的子接口有:

    Collection<E>, Deque<E>, List<E>, Queue<E>, Set<E> 等.
    该接口的iterator()方法返回一个标准的Iterator实现。
    

    2、现在从例子来学习

    //第一个简单的for-each例子
    import java.util.ArrayList;
    import java.util.List;
    
    public class TestIterator {
        public static void main(String []args) {
            List<String> l = new ArrayList<String>();
            l.add("aa");
            l.add("bb"); 
            l.add("cc"); 
            for (String s:l) {    
                System.out.println(s);
            }
        }
    }
    这个程序很简单,创建一个List<String>的迭代器,然后添加3个字符串,最后通过for-each显示出来。
    我们需要把TestIterator.java编译成smali文件才能进行查看反编译代码。
    如何进行请查看  Android学习心得(4) --- MAC下smali文件编写与运行
    

    Android学习心得(4) --- MAC下smali文件编写与运行

    生成的TestIterator.smali文件中处理迭代器的主要代码如下:
    
    //迭代循环开始
    :goto_18
        //开始迭代
        invoke-interface {v1}, Ljava/util/Iterator;->hasNext()Z
        move-result v0
        //如果为空,则跳到cond_2a
        if-eqz v0, :cond_2a 
        //循环每一项
        invoke-interface {v1}, Ljava/util/Iterator;->next()Ljava/lang/Object;
        move-result-object v0
        check-cast v0, Ljava/lang/String;
        .line 12
        sget-object v2, Ljava/lang/System;->out:Ljava/io/PrintStream;
        invoke-virtual {v2, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
        goto :goto_18
        .line 14
        :cond_2a
    

    //第二个简单的while例子
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class TestIterator {
        public static void main(String []args) {
            List<String> l = new ArrayList<String>();
            l.add("aa");
            l.add("bb"); 
            l.add("cc"); 
            Iterator iter = l.iterator(); 
            while (iter.hasNext()) { 
                String s = (String) iter.next();
                System.out.println(s);
            }
        }
    }
      :goto_18
        invoke-interface {v1}, Ljava/util/Iterator;->hasNext()Z
        move-result v0
        if-eqz v0, :cond_2a
        .line 13
        invoke-interface {v1}, Ljava/util/Iterator;->next()Ljava/lang/Object;
        move-result-object v0
        check-cast v0, Ljava/lang/String;
        .line 14
        sget-object v2, Ljava/lang/System;->out:Ljava/io/PrintStream;
        invoke-virtual {v2, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
        goto :goto_18
        .line 16
        :cond_2a
    
    基本上while循环和for-each基本相似。
    迭代循环:
           1、使用hasNext()方法检测循环条件
           2、使用next()方法获得单个对象
           3、循环中用goto指令控制
    
    更多相关内容
  • SMALI语法中文.pdf.zip

    2021-08-04 12:18:26
    SMALI语法中文文档
  • ctf常用工具之一,逆向分析会用到,smail分析转换工具 Smali2Java 。
  • 最近有一个项目需要修改一些dex文件,提起修改dex文件,最有名的就是baksmali和smali项目,这个项目并且开源,所以一个思路就是通过修改这个原来来实现修改dex文件的目的。首先是下载 baksmali源码:下载地址 ...

    最近有一个项目需要修改一些dex文件,提起修改dex文件,最有名的就是baksmali和smali项目,这个项目并且开源,所以一个思路就是通过修改这个原来来实现修改dex文件的目的。

    首先是下载 baksmali源码:

    下载地址 https://code.google.com/p/smali/

    下载完成以后,将项目导入到eclipse工程中,本来笔者认为开源项目直接导入后就能够调试了,结果发现事情远远没有那么简单,这个项目依赖了众多的jar包。

    没有办法笔者只好将需要的jar包一一下载下来,然后加入到建立的工程中,如图1:

    8f620edd3c584c3ae8627dcb124350da.png

    主要需要的jar包以及下载地址:

    1 antlr-4.2.2-complete.jar

    一个开源的词法分析器的jar包,主要用于生成smali和baksmali的语法解释器的

    java文件  生成的 smaliParser.java 和 smaliTreeWalker.java 这两个java文件加起来将近

    1M了

    下载地址

    http://www.antlr.org/download/antlr-4.2.2-complete.jar

    2 guava-17.0.jar

    google的一个开源的库,英文单词的意思是石榴,里面实现了很多容器的类

    下载地址

    http://search.maven.org/remotecontent?filepath=com/google/guava/guava/17.0/guava-17.0.jar

    3 jsr305-1.3.9.jar

    一些用于判断对象类型是否可以为 NULL的jar包,据说将要进入JDK中

    下载地址

    http://www.java2s.com/Code/JarDownload/jsr305/jsr305-1.3.9.jar.zip

    4 ST-4.0.8.jar

    下载地址

    http://www.stringtemplate.org/download/ST-4.0.8.jar

    5 org.apache.commons.cli_1.2.0.v201105210650.jar

    下载地址

    http://dl.shiguanglu.com/jarfiles/o/org.apache.commons/org.apache.commons.cli_1.2.0.v201105210650.jar.zip

    6 com.springsource.org.junit-4.7.0.jar

    下载地址

    将这些jar包加入到工程里面,这个时候还是会报错的,因为在源代码中放的smali语法分析器的文件形式不是java的文件形式,而是 antlr 这个语法分析器的文件形式,具体目录是在 smali/src/main/antlr3这个目录下,里面有 smaliParser.g 和 smaliTreeWalker.g 这两个文件,需要使用

    java -jar antlr3.jar xx.g

    这个命令将 这两个文件生成相应的java文件,然后将这两个java文件拷贝到 smali/src/main/java/org/jf/smali这个目录下

    这个时候还有最后一步,就是要处理一下 smali/src/main/jflex 这个目录下的

    smaliLexer.flex 这个文件了

    这个文件需要下载一个叫做 jflex-1.6.0.jar 的jar包

    下载地址在 http://jflex.de/download.html

    然后运行

    java -jar jflex-1.6.0.jar smaliLexer.flex

    这个命令,生成了 smaliFlexLexer.java 这个文件

    同样需要将 smaliFlexLexer.java 文件拷贝到 smali/src/main/java/org/jf/smali 这个目录下

    这个时候如果你在建立的项目将源码中的test代码也导入的话,不出意外会出现一个错误,错误文件是 lexerTest.java 里面大概 163行吧,修改成下面的代码即可

    //modify by sunzeduo 2014-6-23

    InputStreamReader reader = new InputStreamReader(smaliStream);

    就是有些jar包升级了,测试代码没有及时修改过来,导致的出现的问题,这个问题很好修改。

    ok 解决完了编译问题,现在在eclipse中的样子就是如图2的样子了

    aa508e93d61bab2827b8a2eff3818129.png

    展开全文
  • Smali代码一些知识.docx

    2021-05-07 10:13:55
    smali你必须掌握的一些知识.逆向分析必备
  • 这可以用于调试和分析现有的android应用程序。此shell脚本按原样提供,不提供任何形式的保证,并且仅用于教育目的。 要使用,指向一个SMALI文件: $python smaliparser.py -if ./path/to/SecureSharedPreferences...
  • 类 内部类 内部类有自己独立的smali文件,命名方式为“[外部类]$[内部类].smali” 示例 .class public Lcom/yiji/test/MainActivity$SNChecker; .super Ljava/lang/Object; .source "MainActivity.java" # ...

    文件头

    .class [修饰关键字]

    .super

    .source

    示例

    .class public Lcom/yiji/test/MainActivity;

    .super Landroid/app/Activity;

    .source "MainActivity.java"

    字段

    # static fields

    .field static [修饰关键字] :

    # instance fields

    .field [修饰关键字] :

    示例

    # static fields

    .field public static final ARGS_KEY:Ljava/lang/String;

    # instance fields

    .field private btnOk:Landroid/widget/Button;

    方法

    # direct methods

    .method [修饰关键字]

    [.parameter]

    [.prologue]

    [.line]

    .end method

    # virtual methods

    .method [修饰关键字]

    [.parameter]

    [.prologue]

    [.line]

    .end method

    .locals 局部变量个数

    .parameter 参数个数,每条指令声明一个参数

    .prologue 代码开始

    .line 行号

    接口

    # interfaces

    .implements

    注解

    # annotations

    .annotation [注解属性]

    [注解字段=值]

    .end annotation

    示例

    # instance fields

    .field public sayWhat:Ljava/lang/String;

    .annotation runtime Lcom/droider/anno/MyAnnoField;

    info = "Hello my friend"

    .end annotation

    .end field

    对应java代码

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

    public String sayWhat;

    内部类

    内部类有自己独立的smali文件,命名方式为“[外部类]$[内部类].smali”

    示例

    .class public Lcom/yiji/test/MainActivity$SNChecker;

    .super Ljava/lang/Object;

    .source "MainActivity.java"

    # annotations

    .annotation system Ldalvik/annotation/EnclosingClass;

    value = Lcom/yiji/test/MainActivity;

    .end annotation

    .annotation system Ldalvik/annotation/InnerClass;

    accessFlags = 0x1

    name = "SNChecker"

    .end annotation

    # instance fields

    .field private sn:Ljava/lang/String;

    .field final synthetic this$0:Lcom/yiji/test/MainActivity;

    # direct method

    .method public constructor (Lcom/yiji/test/MainActivity;Ljava/lang/String;)V

    ...

    .end method

    # virtual methods

    .method public isRegistered()Z

    ...

    .end method

    其中包含字段this0、直接方法init()this0是指向外部类的引用,0表示层数,如下

    public class Outer { //this$0

    public class FirstInner { // this$1

    public class SecondInner { // this$2

    public class ThreadInner {

    }

    }

    }

    }

    synthetic属性表明是编译器合成

    # direct methods

    .method public constructor (Lcom/yiji/test/MainActivity;Ljava/lang/String;)V

    .locals 0

    .parameter # 第一个参数MainActivity引用

    .parameter # 第二个参数sn

    .progolue

    iput-object p1, p0, Lcom/yiji/test/MainActivity$SNChecker;->this$0:Lcom/yiji/test/MainActivity; # 将MainActivity引用赋值给this$0

    invoke-direct {p0}, Ljava/lang/Object;->()V # 调用默认构造函数

    iput-object p2, p0, Lcom/yiji/test/MainActivity$SNCheck;->sn:Ljava/lang/String; # 赋值sn

    .end method

    这段代码使用了两条“.parameter”指令,却用到了p0-p2共3个寄存器,因为对非静态方法,会隐含p0寄存器指向this引用。

    监听器

    btn.setOnClickListener(new android.view.View.OnClickListener() {

    @Override

    public void onClick(View v) {

    ...

    }

    });

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

    .locals 2

    .parameter "savedInstanceState"

    ...

    iget-object v0, p0, Lcom/yiji/test/MainActivity;->btn:Landroid/widget/Button;

    new-instance v1, Lcom/yiji/test/MainActivity$1; # 新建MainActivity$1实例

    invoke-direct {v1, p0}, Lcom/yiji/test/MainActivity$1;->(Lcom/yiji/test/Mainactivity;)V # 初始化MainActivity$1实例

    invoke-virtual {v0, v1}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V # 设置按钮点击事件

    MainActivity$1.smali文件

    .class Lcom/yiji/test/MainActivity$1

    .super Ljava/lang/Object;

    .source "MainActivity.java"

    # interfaces

    .implements Landroid/view/View$OnClickListener;

    # annotations

    .annotation system Ldalvik/annotation/EnclosingMethod;

    value = Lcom/yiji/test/MainActivity;->onCreate(Landroid/os/Bundles;)V

    .end annotation

    .annotation system Ldalvik/annotation/InnerClass;

    accessFlag = 0x0

    name = null

    .end annotation

    # instance fields

    .field final synthetic this$0:Lcom/yiji/test/MainActivity;

    # direct methods

    .method constructor (Lcom/yiji/test/MainActivity;)V

    ...

    .end method

    # virtual methods

    .method public onClick(Landroid/view/View;)V

    ...

    .end method

    注解类

    MemberClasses注解

    在MainActivity.smali中有如下代码:

    # annotations

    .annotation system Ldalvik/annotation/MemberClasses;

    value = {

    Lcom/yiji/test/MainActivity$SNChecker;

    }

    .end annotations

    MemberClasses是编译时自动加上的,查看MemberClasses注解类源码,如下:

    @Retention(RetentionPolicy.RUNTIME)

    @Target(ElementType.ANNOTATION_TYPE)

    @interface MemberClasses { }

    可以看出MemberClasses是“系统注解”,记录一个内部类列表。

    EnclosingMethod注解

    在MainActivity$1.smali中有一段代码如下:

    # annotations

    .annotation system Lcom/dalvik/annotation/EnclosingMethod;

    value = Lcom/yiji/test/MainActivity;->onCreate(Landroid/os/Bundle;)V

    .end annotation

    EnclosingMethod注解用来说明MainActivity$1类的作用范围,其中的Method说明它作用于一个方法,而value表明它位于MainActivity的onCreate()方法中。

    EnclosingClass注解

    在MainActivity$SNChecker.smali文件中,有如下代码:

    # annotations

    .annotation system Ldalvik/annotation/EnclosingClass;

    value = Lcom/yiji/test/MainActivity;

    .end annotation

    EnclosingClass表明MainActivity$SNChecker作用于一个类,value表明这个类是MainActivity。

    InnerClass注解

    .annotation system Ldalvik/annotation/InnerClass;

    accessFlags = 0x1

    name = "SNChecker"

    .end annotation

    InnerClass表明是一个内部类,name表示内部类的名称,accessFlags访问标志,声明如下:

    enum {

    kDexVisibilityBuild = 0x00, /* annotation visibility */

    kDexVisibilityRuntime = 0x01,

    kDexVisibilitySystem = 0x02,

    };

    AnnotationDefault注解

    如果注解在声明时提供了默认值,那么会用到AnnotationDefault注解,示例:

    # annotations

    .annotation system Ldalvik/annotation/AnnotationDefault;

    value = .subannotation Lcom/yiji/test/anno/MyAnnoClass;

    value = "MyAnnoClass"

    .end subannotation

    .end annotation

    可以看出MyAnnoClass类有一个默认值”MyAnnoClass”。

    Signature注解

    用于验证方法的签名

    .method pubilc onItemClick(Landroid/widget/AdapterView;Landroid/view/View;IJ)V

    .locals 6

    .parameter

    .parameter "v"

    .parameter "position"

    .parameter "id"

    .annotation system Ldalvik/annotation/Signature;

    value = {

    "(",

    "Landroid/widget/AdapterView",

    ";",

    "Landroid/view/View;",

    "IJ)V"

    }

    .end annotation

    ...

    .end method

    Throws注解

    如果方法抛出异常则生成相应的Throws注解

    .method public final get()Ljava/lang/Object;

    .locals 1

    .annotation system Ldalvik/annotation/Throws;

    value = {

    Ljava/lang/InterruptedException;

    Ljava/util/concurrent/ExcutionException;

    }

    .end annotation

    ...

    .end method

    其他注解

    - SuppressLint注解:去掉代码检查器的警告信息

    - TargetApi注解:去掉代码版本检查的错误信息

    - SdkConstant注解:被标记为@hide,指定sdk中可以被导出的常量

    - Widget注解:被标记为@hide,表明是UI类

    安卓广播

    转载请注明出处:http://blog.csdn.net/zhouli_csdn/article/details/45645743广播是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的广

    android之Java+html+javascript混合开发

    android开发,除了使用原生态的开发方式之外,还可以使用java+html+javascript混合开发的方式来开发,这样可以节省大量的开发时间,同时还可以使不同设

    Android开发--仿腾讯新闻客户端(1)内容列表界面

    好久没有更新博客了。最近由于工作比较忙,再加上忙于社交。导致一直没好好静下来研究Android。这次给大家分享仿腾讯新闻内容列表界面。其实,这

    展开全文
  • 面向Android安全性的Smali混淆代码分析.pdf
  • smali-2.4.0.rar

    2020-11-09 19:22:35
    smali最早是由Jasmin提出,随后jesusfreke开发了最有名的smali和baksmali工具将其发扬光大,几乎dex上所有的静态分析工具都是在这个项目的基础上建立的。 反编译dex:java -jar baksmali-2.4.0.jar d classes.dex ...
  • 静态分析android程序之阅读smali代码

    千次阅读 2022-03-11 14:47:38
    静态分析是探索 Android 程序内幕的一种最常见方法,与动态调试一起,能帮助分析人员解决分析时遇到的各类问题 0x02 简介 静态分析(Static Analysis):在不运行代码的情况下,用词法分析、语法分析等技术手段...

    0x01 前言

    静态分析是探索 Android 程序内幕的一种最常见方法,与动态调试一起,能帮助分析人员解决分析时遇到的各类问题

    0x02 简介

    • 静态分析(Static Analysis):在不运行代码的情况下,用词法分析、语法分析等技术手段对程序文件扫描,生成反汇编代码,通过阅读反汇编代码掌握程序功能的一种技术。

    • 然而在实际分析上,想要完全不运行程序是不太可能,通常是要先运行目标程序,从中寻找程序的突破口

      生成反汇编代码的工具称反汇编工具或反编译工具,工具越强大,反汇编效果越好,能事半功倍

    0x03 静态分析 Android 程序的方法

    它有两种方法:

    • 方法一:阅读反汇编生成的Dalvik字节码,可以用IDA Pro分析dex文件,或者使用文本编辑器阅读baksmali反编译生成的smali文件;

    • 方法二:阅读反汇编生成的java源码,可以使用dex2jar生成jar文件,然后再使用jd-gui阅读jar文件的代码。

    快速定位Android程序的关键代码

    六种方法定位关键代码:

    • 信息反馈法:先运行目标程序,然后根据程序运行时给出的反馈信息作为突破口寻找关键代码。

    • 特征函数法:跟信息反馈法类似。

    • 顺序查看发:从软件的启动代码开始,逐行的向下分析,掌握软件的执行流程。

    • 代码注入法:手动修改apk文件的反汇编代码,加入Log输出,配合LogCat查看程序执行到特定点时的状态数据。

    • 栈跟踪法:输出运行时的栈跟踪信息,然后查看栈上的函数调用序列来理解方法的执行流程。

    • 方法剖析:热点分析和性能优化。

    0x04 阅读 smali 代码

    那么,问题来了,什么是smali?

    不要急,让我为大家一一道来:

    要想了解smali,就得先理清APK、Dalvik字节码和smali文件之间的关系

    APK文件

    首先是apk,即安卓程序的安装包。Apk是一种类似于Symbian Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。

    而apk文件实际上就是一个MIME为ZIP的压缩包,只不过后缀名进行了更改

    我们直接修改成(.zip)压缩包格式后缀名,打开并解压后就可以看到内部的文件结构,就像下面这样

     

    而每个文件夹都有各自不同的作用,大家可以了解下

    • assets文件夹:保存一些额外的资源文件,如游戏的声音文件,字体文件等等,在代码中可以用AssetManager获取assets文件夹的资源。

    • lib文件夹:存放用C/C++编写的,用NDK编译生成的so文件,供java端调用。

    • META-INF文件夹:存放apk签名信息,用来保证apk包的完整性和系统的安全。

      在IDE编译生成一个apk包时,会对里面所有的文件做一个校验计算,并把计算结果存放在META-INF文件夹内,apk在安装的时候,系统会按照同样的算法对apk包里面的文件做校验,如果结果与META-INF里面的值不一样,系统就不会安装这个apk,这就保证了apk包里的文件不能被随意替换。比如拿到一个apk包后,如果想要替换里面的一幅图片,一段代码, 或一段版权信息,想直接解压缩、替换再重新打包,基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度,有助于保护系 统的安全。

    • res文件夹:存放资源文件,包括icon,xml文件

    • AndroidManifest.xml文件:应用程序配置文件,每个应用都必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等信息。

    • classes.dex文件:传统 Class 文件是由一个 Java 源码文件生成的 .Class 文件,而 Android 是把所有 Class 文件进行合并优化,然后生成一个最终的 class.dex 文件。它包含 APK 的可执行代码,是分析 Android 软件时最常见的目标。由于dex文件很难看懂,可通过apktool反编译得到.smali文件,smali文件是对Dalvik虚拟机字节码的一种解释(也可以说是翻译),并非一种官方标准语言。通过对smali文件的解读可以获取源码的信息。

    • resources.arsc文件:二进制资源文件,包括字符串等。

    • smali:smali是将Android字节码用可阅读的字符串形式表现出来的一种语言,可以称之为Android字节码的反汇编语言。利用apktool或者Android Killer,反编classes.dex文件,就可以得到以smali为后缀的文件,这些smali文件就是Dalvik的寄存器语言。

      简单的说,smali就是Dalvik VM内部执行的核心代码,andorid逆向分析的关键点。

    Dalvik字节码

    概念:Dalvik是google专门为Android操作系统设计的一个虚拟机,经过深度的优化。虽然Android上的程序是使用java来开发的,但是Dalvik和标准的java虚拟机JVM还是两回事。Dalvik VM是基于寄存器的,而JVM是基于栈的;Dalvik有专属的文件执行格式dex(dalvik executable),而JVM则执行的是java字节码。Dalvik VM比JVM速度更快,占用空间更少。   

    总结来说

    • Dalvik是andrord虚拟机,即Dalvik VM

    • Dalvik字节码是他执行的语言

    • Dalvik的专属文件格式(.dex),就像上面apk文件中的class.dex

    • Dalvik VM是基于寄存器的,基于寄存器的意思是,所有操作都必须经过寄存器来进行。

    如果我们直接通过分析Dalvik的字节码,我们是不能看到原来的代码逻辑的,这时需要借助如Apktool或Android Killer工具来帮助查看。但是,注意的是最终我们修改APK需要操作的文件是.smali文件。

    smali文件

    概念:smali语言是Davlik的寄存器语言,语法上和汇编语言相似,它拥有特定的格式与语法,smali 语言是对 Dalvik 虚拟机字节码的一种解释。它是逆向分析app的重中之重,一般我们逆向都是在smali文件里进行修改代码,进而实现我们想要的结果。

    smali文件,我们直接通过解压apk文件是看不到的,需要通过apptool或Android Killer等具备反编译功能工具(网上很多)反编译apk,就可以得到以smali为后缀的文件。

    而它三者的关系就像

    你们也许会疑惑,图上这不才俩吗?Dalvik去哪了?

    从某种方面上讲,这整个框框就是Dalvik,整个过程需要在框里才能运行,脱离了框框,它就。。。understand?,它无处不在。

    好了,我们接下来就详细讲下smali文件

    smali文件结构

    smali文件和java中的类都是一一对应的,它有自己的一套语法,指令都是以“.”开头,常用的一些指令如下:

    指令

    说明

    .class

    包名+类名

    .super

    父类类名

    .source

    源文件名称

    .implements

    接口实现

    .field

    定义字段

    invoke-super

    调用父函数

    invoke-direct

    调用函数

    invoke-static

    调用静态函数

    new-instance

    创建实例

    iput-object

    对象赋值

    iget-object

    调用对象

    return-void

    函数返回void

    const/high16 v0,0x7fo3

    把0x7fo3赋值给v0

    .method/.end method

    方法的开始与结束

    .locals

    方法内使用的v开口的寄存器个数

    .prologue

    表示方法中代码的开始处

    .line

    对应java中的行数

    .param

    指定了方法的参数

    .paramter

    和.paramter含义相同

    .annotation/.end annotation

    注解的开始和结束

    smali数据类型

    Dalvik字节码和Java一样,都只有两种数据类型:基本类型和引用类型,8种基本数据类型,对象和数组是引用类型,Dalvik字节码和Jvm中对数据类型的描述是一致的,

    • 基础数据类型:Z,B,S,C,I,L,F,D为基本数据类型,从上表可以看出,Dalvik字节码基本类型的描述符基本上是java基本类型的首字母,除了boolean对应为Z外

    • 对象类型:L加上类或者接口的全称表示对象类型,即Lpackage/objectName,如String类型描述符为Ljava/lang/String,包com.biyou下面的test类的类型描述符为Lcom/biyou/test

    • 数组类型:基本类型的数组为”[“加上基本类型描述符来表示,一维数组前面是一个”[“,多一个维度前面多加一个”[“,比如int类型,一维是:[I,二维是:[[I,依次类推。

      对象类型的数组为”[“加上对象类型表示符来表示,如String类型表示为:[Ljava/lang/String。

    java数据类型和Dalvik字节码的数据类型一一对应,对应关系如下表:

    java类型

    smali描述符

    备注

    boolean

    Z

    布尔型

    byte

    B

    字节型

    short

    S

    短整数型(16位)

    char

    C

    字符型

    int

    I

    整数型

    long

    L

    长整数型(64位)

    float

    F

    浮点型

    double

    D

    双精度型(64位)

    void

    V

    空类型,仅用作返回类型

    L

    对象类型

    [

    数组类型

    .mali文件示例

    我们就以  MainActivity.smali 为例

    头文件:

    • .class 与  .super 指令会指明 smali 文件所保存的类的完整签名,和类的父类的完整签名。像上述文件类(Lcom/example/junior/MainActivity)

    • 像public,protected,private就是所谓的访问权限修饰符,非权限修饰符则指的是final,abstract,static,两者都可以为空。

    • 另外如果原java代码有混淆,那一般.class里面的类名和.source的源文件名则不同,以下是经过混淆的

    字段声明

    • smali文件的字段的声明使用".field"指令,字段有静态字段和实例字段两种:

      1、静态字段格式:

      .field 访问权限 static 修饰关键字  字段名  字段类型

      .field public static HELLO:Ljava/lang/String 2、实例字段格式:.field 访问权限 修饰关键字 字段名  字段类型

      .field prviate button:Landroid/widget/Button

    注释:

    • smali 文件中会自动生成一些注释,:“# instance fields”和“# virtual methods”

    • smali 文件只支持单行注释,注释可放在一行开头,也可放在一行的任何地方,使用 # 标识注释的开始,井号后的部分都是注释

    注解:

    • 若类中包含 Java 注解,在 smali 文件中会以“# annotations”注释加以说明,接着会以 .annotation 指令开始,以 .end annotation 指令结束(声明一个注解)。.annotation 指令后跟着注解的类型和完整的签名,若类中有多个注解,则会有多个指令对

    方法:

    • DEX 中的类包含类自己实现的实例方法“# direct methods”(用privat修饰的)和继承自父类的虚方法“# virtual methods”(用public和protected修饰的)。每个方法以 .method 指令开始,以 .end method 指令结束,.method 指令后跟着方法的访问权限和完整的签名

      图中第199行表示方法的开始处,修饰符是static,访问权限是private,方法名是 assertMainThread, 参数为Ljava/lang/String;,V代表无返回值。

    • 在一个方法中,除了真实执行的机器指令,还有其他指令,列举如下:

      .locals :声明当前方法中使用的寄存器数目。对 DEX 中的每个方法,都可通过静态分析知道其使用了多少个寄存器。这样做的好处是,虚拟机执行 DEX 中类的方法时可提前为方法准备栈空间

      .param :指定方法中的参数名,以便程序的调试。经过 Proguard(混淆工具)处理的 DEX 可能不含该信息

    • .prologue :表示下面的部分是 DEX 指令

      .line :保存 DEX 中的方法在 Java 源文件中的行号信息,以便调试。经过 Proguard 处理的 DEX 可能不含该信息

    接口实现

    • 若一个类实现了接口,会在smali 文件中使用“ .implements ”指令指出,上述图中第六行

      表明实现了Executor这个接口

    if判断语句

    类型

    解释

    等价

    if-eq vA, VB, cond_**

    如果vA等于vB则跳转到cond_**

    if(vA==vB)

    if-ne vA, VB, cond_**

    如果vA不等于vB则跳转到cond_**

    if (vA!=vB)

    if-lt vA, VB, cond_**

    如果vA小于vB则跳转到cond_**

    if(vA<vB)

    if-le vA, VB, cond_**

    如果vA小于等于vB则跳转到cond_**

    if(vA<=vB)

    if-gt vA, VB, cond_**

    如果vA大于vB则跳转到cond_**

    if(vA>vB)

    if-ge vA, VB, cond_**

    如果vA大于等于vB则跳转到cond_**

    if(vA>=vB)

    ——

    ——

    ——

    if-eqz vA, :cond_**

    如果vA等于0则跳转到cond_**

    if(vA==0)

    if-nez vA, :cond_**

    如果vA不等于0则跳转到cond_**

    if(vA!=0)

    if-ltz vA, :cond_**

    如果vA小于0则跳转到cond_**

    if(vA<0)

    if-ltz vA, :cond_**

    如果vA小于等于0则跳转到cond_**

    if(vA<=0)

    if-gtz vA, :cond_**

    如果vA大于0则跳转到cond_**

    if(vA>0)

    if-gez vA, :cond_**

    如果vA大于等于0则跳转到cond_**

    if(vA>=0)

    switch 分支语句

    • 实例:SwitchCase

    • 实例代码:GitHub

    • 用 AndroidKiller 反编译实例 SwitchCase,然后打开反编译后的工程目录中的 smali/com/droider/switchcase/MainActivity.smali 文件,找到 packedSwitch() 的代码:

      上述实例每句均带有注释,基本上都做好了分析,大家可对照注释一一学习

    0x05 应用——smali插桩

    插桩的原理:静态的修改apk的samli文件,然后重新打包。

    1. 使用上面的方法得到一个apk的smali文件

    2. 在关键部位添加自己的代码,需要遵循smili语法,例如在关键地方打log,输出关键信息

    3. 重新进行打包签名

    0x06 总结

    写得这篇文章,主要是smali的基础知识层面进行阐述,知识点比较多,适合安卓逆向入门级人员,希望对大家有所帮助。

    展开全文
  • 本期斗哥将带来Anoid逆向之动态分析smali篇。0X01 smali语言简述smali语言是Dalvik的反汇编语言因Android虚拟机Dalvik不是执行java虚拟机JVM编译后生成的class文件,而是执行再重新整合打包后生成的dex文件,dex文件...
  • smali函数分析

    2019-10-07 19:08:46
    smali中的函数和成员变量也分为两种,分别为 direct 和 virtual 两者的区别  1.direct method 是指private函数  2.virtual method 是指 protected和 public 函数  3.所以在调用函数时,有invoke-direct,...
  • smali中的函数和成员变量一样也分为两种类型,分别为direct和virtual之分。 那么direct method和virtual method有什么区别呢? 简单来说,direct method就是private函数,其余的public和protected函数都属于virtual ...
  • 微信6.7.3smali代码研究

    2018-10-17 09:56:47
    微信6.7.3smali第一版,代码研究,用于分析微信业务逻辑。
  • 用吾爱破解工具包中的android逆向助手,尝试把hello.dex反编译成hello.smali, 发现逻辑关系有点不太清晰,尝试把dex转成jar文件,用Java Decompiler查看,得到: 发现flag竟是16,这这这……也是醉了
  • Android逆向笔记之smali代码分析

    千次阅读 2017-03-15 21:59:48
    前言:书本中对crackme02.apk的破解是分析关键词进行破解的,而本文使用另外的Smali分析方式,对样本进行分析。 样本:《Android软件安全与逆向分析》crackme02.apk 工具:AndroidKiller v1.3.1.0(AK) && Android ...
  • 在反向分析APK时,我们通常使用apktool( )对APK进行反编译,然后获取smali代码。 尽管某些工具(例如dex-to-jar)可以将smali代码转换为更具可读性的Java代码,但如果该方法过于复杂或令人困惑,则这些工具可能...
  • smali文件格式分析

    千次阅读 2018-03-14 23:11:28
    smali文件是apktool将dex文件解析成更直观易读的一种文件形式。除了apktool之外,baksmali工具也可以将dex文件转为smali文件。 今天就来学习一下smali文件的格式,让我们可以读懂smali代码。 编辑生成简单的待...
  • Smali基础语法

    2022-02-07 16:54:46
    一、Smali含义 Smali是Davlik的寄存器语言,语法上和汇编语言类似. Davlik是基于寄存器的,就是说smali里的所有操作都必须经过寄存器来进行. 二.Smali基本类型 B—byte C—char D—double F—float I—int S—...
  • 实验吧smali文件分析

    2020-12-30 22:52:51
    0x01首先我们得到了一个hello.dex文件,要把它反编译为smali文件,使用工具baksmali,cmd命令: java -jar baksmali-2.0.3.jar -o class/ Hello.dex ,就在当前目录下生成了一个文件夹,里边有一个hello.smali 代码如下...
  • 基于smali的Android静态检测方法,胡鸽,徐国爱,随着移动互联网的发展,移动应用软件的安全问题也日渐突出。本文对当前Android静态分析技术进行了概述,对Android应用软件反编译获取�
  • 我们来分析一下这段smali代码 代码头部 创建了一个Hello类 .class public LHello; 该类继承于object .super Ljava/lang/Object; 原文件名称为Hello.java .source "Hello.java" 构造方法,该段未在java代码中...
  • android逆向分析之从smali到java

    万次阅读 2016-10-28 16:26:26
    通过上一篇android逆向分析(一),在dex2jar的前提下,我们获取到了源码,在apktool的前提下,我们可以获取到资源和smali文件,本篇主要讲述smali几个最基本的语法和smali转java。 本片通过ServerListActivity....
  • Smali和逆向分析

    2017-09-06 13:25:29
    这篇文章其实2个月前就想写了,但我知道并不好写,就懒得写了,所以拖到现在~其实接触smali这门语法是件蛮偶然的事,接触后发现,次奥,这货在某些领域太有用了,至于为什么我想看完这篇文章应该都明白了。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,924
精华内容 1,569
热门标签
关键字:

smali分析

友情链接: ssmCMS.zip