精华内容
下载资源
问答
  • 但是在学习Smali语法的过程中,有时候需要进行java代码和smali代码的对照,如果可以把java代码转换成smali代码,学习起来岂不是很方便。于是网上搜了一把,很失望,都是各种转smali为java的工具。后来想了想,java...

    1、概述

    Smali是Android系统中Dalvik虚拟机指令语言,在apk逆向过程中有许多工具可以把smali代码转化成java代码。但是在学习Smali语法的过程中,有时候需要进行java代码和smali代码的对照,如果可以把java代码转换成smali代码,学习起来岂不是很方便。于是网上搜了一把,很失望,都是各种转smali为java的工具。后来想了想,java变成smali不就是写android程序—>dex—>smali的过程嘛,然而java代码编译完是class文件,如何变成dex文件呢?后来在一本书中找到了答案,记录如下。

    2、java代码转smali代码

    把java代码转成smali代码共需要以下三个步骤

    1、编译java代码为class文件

    javac smaliTest.java

    这个比较简单,会生成smaliTest.class文件

    2、把class文件转成dex文件

    我们知道apk包里java代码最后生成的是class.dex文件,把class转化成dex文件就需要用到android SDK提供的一个工具dx,该jar包位于android-sdk\build-tools\23.0.1\lib,找到该包后执行以下命令

    java -jar dx.jar --dex --output=smaliTest.dex smaliTest.class

    3、把dex转化成smali文件

    这时候会使用到另外一个工具baksmali,该工具位于android-sdk\platform-tools\,找到该包后执行以下命令

    java -jar baksmali.jar smaliTest.dex

    OK,完成,此时会生成一个out目录,在out目录下的smaliTest.smali就是我们要看到的smali代码了

    3、示例程序

    java代码如下:

    public classsmaliTest {public static voidmain(String[] args){

    System.out.println("hello smali");

    }

    }

    smali代码如下

    .classLsmaliTest;

    .super Ljava/lang/Object;

    .source"smaliTest.java"# direct methods

    .method constructor()V

    .registers1.prologue

    .line3invoke-direct {p0}, Ljava/lang/Object;->()Vreturn-void.end method

    .methodpublic static main([Ljava/lang/String;)V

    .registers3.parameter

    .prologue

    .line5sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;const-string v1, "hello smali"invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

    .line6

    return-void.end method

    4、遇到的问题

    我的android环境是在windows下搭建的,jdk版本是1.8,在windows下执行第二步时出现如下错误

    UNEXPECTED TOP-LEVEL EXCEPTION:

    java.lang.RuntimeException: Exception parsing classes

    at com.android.dx.command.dexer.Main.processClass(Main.java:752)

    at com.android.dx.command.dexer.Main.processFileBytes(Main.java:718)

    at com.android.dx.command.dexer.Main.access$1200(Main.java:85)

    at com.android.dx.command.dexer.Main$FileBytesConsumer.processFileBytes(

    Main.java:1645)

    at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.j

    ava:170)

    at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java

    :144)

    at com.android.dx.command.dexer.Main.processOne(Main.java:672)

    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:574)

    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:311)

    at com.android.dx.command.dexer.Main.run(Main.java:277)

    at com.android.dx.command.dexer.Main.main(Main.java:245)

    at com.android.dx.command.Main.main(Main.java:106)

    Caused by: com.android.dx.cf.iface.ParseException: badclassfile magic (cafebab

    e) or version (0034.0000)

    at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:472)

    at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:4

    06)

    at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary

    (DirectClassFile.java:388)

    at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.jav

    a:251)

    at com.android.dx.command.dexer.Main.parseClass(Main.java:764)

    at com.android.dx.command.dexer.Main.access$1500(Main.java:85)

    at com.android.dx.command.dexer.Main$ClassParserTask.call(Main.java:1684)

    at com.android.dx.command.dexer.Main.processClass(Main.java:749)

    ...11more1 error; aborting

    原因不明,大概是jdk版本不对,然后把baksmali.jar和dx.jar两个包拷贝到ubuntu上,执行上述三个步骤,运行成功,ubuntu上安装的jdk版本是1.7

    展开全文
  • 这是smali2java下载,本人自己写的将smali反编译为java代码的工具,支持apkjar包直接反编译为java代码,适用于java代码未经编译优化,保留了源码行数变量名称的情况。软件介绍smali2java是将Android字节码用可...

    这是smali2java下载,本人自己写的将smali反编译为java代码的工具,支持apk和jar包直接反编译为java代码,适用于java代码未经编译优化,保留了源码行数和变量名称的情况。

    软件介绍

    smali2java是将Android字节码用可阅读的字符串形式表现出来的一种语言,可以称之为Android字节码的反汇编语言。使用baksmali或apktool可以将Android应用程序包(apk或jar)反编译为smali代码。

    软件特点

    smali2java工具基于apktool v1.5.0(baksmali v1.3.4)生成的smali文件,依赖于smali文件中的代码行数(.line关键字)和变量别名(.local关键字)等信息,可以最大程度还原原始的java代码。还原出的java代码将具有原始的变量命名,代码的顺序也与原始的java代码保持一致。因此,本工具也具有局限性,仅适用于带有行数和变量别名信息的smali文件(java编译器的编译选项可以在生成的字节码中剔除这些信息)。

    smali2java使用了apktool将Android字节码文件转换为smali文件。界面显示中使用了CCrystalTextView作为java语法高亮显示控件,

    相关介绍

    smali2java工具基于apktool v1.5.0(baksmali v1.3.4)生成的smali文件,依赖于smali文件中的代码行数(.line关键字)和变量别名(.local关键字)等信息,可以最大程度还原原始的java代码。还原出的java代码将具有原始的变量命名,代码的顺序也与原始的java代码保持一致。因此,本工具也具有局限性,仅适用于带有行数和变量别名信息的smali文件(java编译器的编译选项可以在生成的字节码中剔除这些信息)。

    软件截图

    ffbcab95aa9c76d0a450a823bfac71e8.png

    展开全文
  • 但是在学习Smali语法的过程中,有时候需要进行java代码和smali代码的对照,如果可以把java代码转换成smali代码,学习起来岂不是很方便。于是网上搜了一把,很失望,都是各种转smali为java的工具。后来想了想,java...

    1、概述

    Smali是Android系统中Dalvik虚拟机指令语言,在apk逆向过程中有许多工具可以把smali代码转化成java代码。但是在学习Smali语法的过程中,有时候需要进行java代码和smali代码的对照,如果可以把java代码转换成smali代码,学习起来岂不是很方便。于是网上搜了一把,很失望,都是各种转smali为java的工具。后来想了想,java变成smali不就是写android程序—>dex—>smali的过程嘛,然而java代码编译完是class文件,如何变成dex文件呢?后来在一本书中找到了答案,记录如下。

    2、java代码转smali代码

    把java代码转成smali代码共需要以下三个步骤

    1、编译java代码为class文件

    javac smaliTest.java

    这个比较简单,会生成smaliTest.class文件

    2、把class文件转成dex文件

    我们知道apk包里java代码最后生成的是class.dex文件,把class转化成dex文件就需要用到android SDK提供的一个工具dx,该jar包位于android-sdk\build-tools\23.0.1\lib,找到该包后执行以下命令

    java -jar dx.jar --dex --output=smaliTest.dex smaliTest.class

    3、把dex转化成smali文件

    这时候会使用到另外一个工具baksmali,该工具位于android-sdk\platform-tools\,找到该包后执行以下命令

    java -jar baksmali.jar smaliTest.dex

    OK,完成,此时会生成一个out目录,在out目录下的smaliTest.smali就是我们要看到的smali代码了

    3、示例程序

    java代码如下:

    public class smaliTest {

    public static void main(String[] args){

    System.out.println("hello smali");

    }

    }

    smali代码如下

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    .class LsmaliTest;

    .super Ljava/lang/Object;

    .source "smaliTest.java"

    # direct methods

    .method constructor ()V

    .registers 1

    .prologue

    .line 3

    invoke-direct {p0}, Ljava/lang/Object;->()V

    return-void

    .end method

    .method public static main([Ljava/lang/String;)V

    .registers 3

    .parameter

    .prologue

    .line 5

    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;

    const-string v1, "hello smali"

    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

    .line 6

    return-void

    .end method

    展开全文
  • Smali是什么?简介Smali支持注解、调试信息、行数信息等基本Java的基本特性,可以说是很接近Java编译在JVM上的中间语言了,一般用来做Android程序的...修改代码所以smali语言是Dalvik的反汇编语言B---byteC---charD-...

    Smali是什么?

    简介

    Smali支持注解、调试信息、行数信息等基本Java的基本特性,可以说是很接近Java编译在JVM上的中间语言了,一般用来做Android程序的逆向工程

    由于Smali是用于Dalvik和Art(Android虚拟机)的反汇编程序实现

    APK文件>dex文件>smali文件>修改代码

    所以smali语言是Dalvik的反汇编语言

    B---byte

    C---char

    D---double

    F---float

    I---int

    J---long

    S---short

    V---void

    Z---boolean

    [XXX---array

    Lxxx/yyy---object

    这里解析下最后两项,数组的表示方式是:在基本类型前加上前中括号“[”,例如int数组和float数组分别表示为:[I、[F;对象的表示则以L作为开头,格式是LpackageName/objectName;(注意必须有个分号跟在最后),例如String对象在smali中为:Ljava/lang/String;,其中java/lang对应java.lang包,String就是定义在该包中的一个对象。

    或许有人问,既然类是用LpackageName/objectName;来表示,那类里面的内部类又如何在smali中引用呢?答案是:LpackageName/objectName$subObjectName;。也就是在内部类前加“$”符号

    二、函数的定义

    函数的定义一般为:

    Func-Name (Para-Type1Para-Type2Para-Type3...)Return-Type

    参数与参数之间没有任何分隔符:

    1. foo ()V

    >>>>void foo()。

    2. foo (III)Z

    >>>>boolean foo(int, int, int)。

    3. foo (Z[I[ILjava/lang/String;J)Ljava/lang/String;

    >>>>String foo (boolean, int[], int[], String, long)

    Smali 格式结构

    .class [修饰关键字] .super .source

    1 .class public Lcom/disney/WMW/WMWActivity;#是com.disney.WMW这个package下的一个类

    2 .super Lcom/disney/common/BaseActivity;#继承自com.disney.common.BaseActivity

    3 .source "WMWActivity.java"#这是一个由WMWActivity.java编译得到的smali文件4

    5 # interfaces接口信息6 .implements Lcom/burstly/lib/ui/IBurstlyAdListener;#这个WMWActivity实现了一个com.burstly.lib.ui这个package下(一个广告SDK)的IBurstyAdListener接口。

    7

    8 # annotations内部类9 .annotation system Ldalvik/annotation/MemberClasses;10 value = {#有两个成员内部类11 Lcom/disney/WMW/WMWActivity$MessageHandler;,

    12 Lcom/disney/WMW/WMWActivity$FinishActivityArgs;13 }14 .end annotation15

    由此可以的出源java文件

    class WMWActivity extends BaseActivity implementsIBurstlyAdListener{//... 继承 接口

    classMessageHandler {//...

    }classFinishActivityArgs{//...

    }

    }

    # static fields静态域

    .field private static final PREFS_INSTALLATION_ID:Ljava/lang/String; = "installationId"# instance fields实例域

    .fieldprivate _activityPackageName:Ljava/lang/String;

    static fields和instance fields均为成员变量

    instance field 是对象的变量,每一个这个类的对象都会有一个该instance field

    #static fields

    .field static [修饰关键字] :

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

    #instance fields

    .field [修饰关键字] :

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

    1 #instance fields2 .field private btn:Landroid/widget/Button;

    第 1 行的“instance fields”是 baksmali 生成的注释,第 2 行表示一个私有字段 btn,它的类型为“Landroid/widget/Button;”。如果一个类中含有方法,那么类中必然会有相关方法的反汇编代码,Smali 文件中方法的声明使用“.method”指令。方法有直接方法与虚方法两种。直接方法的声明格式如下。

    #direct methods

    .method [修饰关键字]

    <.locals>[.parameter]

    [.prologue]

    [.line].end method

    举例:

    # direct methods private函数

    .methodstatic constructor ()V

    .locals3#在这个函数中最少要用到的本地寄存器的个数

    .prologue//...

    return-void.end method

    .methodpublic constructor ()V

    .locals3.prologue//...

    return-void.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 [注解属性][注解字段=值]

    .endannotation

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

    #instance fields

    .fieldpublic sayWhat:Ljava/lang/String;

    .annotation runtime LMyAnnoField;

    info="Hellomyfriend".end annotation

    .end field

    实例字段 sayWhat 为 String 类型,它使用了 MyAnnoField 注解,注解字段 info 值为“Hellomyfriend”。将其转换为 Java 代码为:

    @MyAnnoField(info="Hellomyfriend")public String sayWhat;

    。。。。。。。。。。。。。。。。。。。

    虚方法的声明与直接方法相同,只是起始处的注释为“virtual methods”。如果一个类实现了接口,会在 smali 文件中使用“.implements”指令指出。

    Lpackage/name/ObjectName;->MethodName(III)Z

    第一部分Lpackage/name/ObjectName;用于声明具体的类型,以便JVM寻找

    第二部分MethodName(III)Z,其中MethodName为具体的方法名,()中的字符,表示了参数数量和类型,即3个int型参数,Z为返回值的类型,即返回Boolean类型

    寄存器声明及使用

    .method privatetest(I)V

    .registers4# 声明总共需要使用4个寄存器const-string v0, "LOG" # 将v0寄存器赋值为字符串常量"LOG"move v1, p1 # 将int型参数的值赋给v1寄存器return-void.end method

    结合Dalvik常用的指令进行操作,即可实现一些需要的功能

    那么,如何确定需要使用的寄存器的个数?

    由于非static方法,需要占用一个寄存器以保存this指针,那么这类方法的寄存器个数,最低就为1,如果还需要处理传入的参数,则需要再次叠加,此时还需要考虑Double和Float这种需要占用两个寄存器的参数类型,举例来看:

    如果一个Java方法声明如下:

    myMethod(int p1, float p2, boolean p3)

    那么对应的Smali则为:

    method LMyObject;->myMethod(IJZ)V

    此时,寄存器的对应情况如下:

    寄存器名称     对应的引用

    p0     this

    p1     int型的p1参数

    p2, p3     float型的p2参数

    p4     boolean型的p3参数

    那么最少需要的寄存器个数则为:5

    如果方法体内含有常量、变量等定义,则需要根据情况增加寄存器个数,数量只要满足需求,保证需要获取的值不被后面的赋值冲掉即可,方法有:存入类中的字段中(存入后,寄存器可被重新赋值),或者长期占用一个寄存器

    Dalvik指令集

    如果需要使用Smali编写程序,还需要掌握常用的Dalvik虚拟机指令,其合集称为Dalvik指令集。这些指令有点类似x86汇编的指令,但指令更多,使用也非常简单方便。最详尽的介绍,可以参考Android官方的Dalvik相关文档:https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions

    一般的指令格式为:[op]-[type](可选)/[位宽,默认4位] [目标寄存器],[源寄存器](可选),比如:move v1,v2,move-wide/from16 v1,v2

    这里也列举一些常用的指令,并结合Smali进行说明:

    移位操作:

    此类操作常用于赋值

    ff1b893a051b3bd5870c10320f2f45fa.png

    - 返回操作:

    用于返回值,对应Java中的return语句

    0052d4279cd1efbc69eb8249deec1683.png

    - 常量操作:

    用于声明常量,比如字符串常量(仅声明,String a = “abc”这种语句包含声明和赋值)

    b71d514763c9955de399211c0987b2d5.png

    - 调用操作:

    用于调用方法,基本格式:invoke-kind {vC, vD, vE, vF, vG}, meth@BBBB,其中,BBBB代表方法引用(参见上面介绍的方法定义及调用),vC~G为需要的参数,根据顺序一一对应

    6f2749de14497e1837b70be23721c2ee.png

    - 判断操作:

    判断操作用来比较一个寄存器中的值,是否与目标寄存器中的值相等或不等,对应Java中的if语句,格式为:if-[test] v1,v2, [condition],其衍生操作还有专门与0进行比较的if-[test]z v1, [condition],其中[condition]为符合判断结果后的跳转条件,需要提前定义好。判断操作也通常和goto配合使用,用来实现循环或者if-else语句

    2ec29904d2095c69526f356e8552e316.png

    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

    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-lez 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)

    需要注意的是,在Java中编写的if语句,往往在对应的Smali中,会变成相反的判断逻辑,如下面所示:

    1 private voidtest() {2 int a = 0;3 int b = 1;4 String result;5 if (a >b) {6 result = "a great than b";7 } else{8 result = "a less than or equals b";9 }10 }

    上面的Java代码逻辑很简单——一个很简单的if语句,为了在Smali中看的更清楚,我只做了字符串赋值操作。下面是对应的Smali代码:

    1 .method privatetest()V2 .registers 4

    3

    4 .line 24

    5 const/4 v0, 0x0

    6

    7 .line 25

    8 .local v0, "a":I9 const/4 v1, 0x1

    10

    11 .line 27

    12 .local v1, "b":I13 if-le v0, v1, :cond_714

    15 .line 28

    16 const-string v2, "a great than b"

    17

    18 .line 28

    19 .local v2, "result":Ljava/lang/String;20 goto:goto_921

    22 .line 30

    23 .end local v2 # "result":Ljava/lang/String;24 :cond_725 const-string v2, "a less than or equals b"

    26

    27 .line 32

    28 .restart local v2 # "result":Ljava/lang/String;29 :goto_930 return-void

    31 .end method

    仔细观察可以发现:

    f2af968ee3ad542eef17481390f3d8c0.png

    if判断

    属性操作:

    属性操作的分为:取值(get)和赋值(put)

    目标类型分为:数组(array)、实例(instance)和静态(static)三种,对应的缩写前缀就是a、i、s

    长度类型分为:默认(什么都不写)、wide(宽,64位)、object(对象)、boolean、byte、char、short(后面几种就不解释了,和Java一致)

    指令格式:[指令名] [源寄存器], [目标字段所在对象寄存器], [字段指针],示例代码如下,操作是为int型的类成员变量mIntA赋值为100:

    1 const/16 v0, 0x64

    2

    3 iput v0, p0, Lcom/coderyuan/smali/MainActivity;->mIntA:I

    下面列出用于实例字段的指令,其中i都可以换成a或者s,分别用于操作数组字段或者静态字段

    ed18a1a8bd807e82d33ce8b66e8703fe.png

    举例:

    以下Java代码是进行的是最基本的类成员变量的赋值、取值操作

    privateString mStringA;private intmIntA;privateActivity mActivityA;public voidfieldTest() {

    mStringA= "Put String to mStringA";

    mIntA= 100;

    mActivityA= this;int len =mStringA.length();

    }

    对应的Smali代码如下:

    # instance fields

    .fieldprivate mActivityA:Landroid/app/Activity;

    .fieldprivatemIntA:I

    .fieldprivate mStringA:Ljava/lang/String;

    # virtual methods

    .methodpublicfieldTest()V

    .registers2.line55

    const-string v0, "Put String to mStringA"iput-object v0, p0, Lcom/coderyuan/smali/MainActivity;->mStringA:Ljava/lang/String;

    .line56

    const/16 v0, 0x64iput v0, p0, Lcom/coderyuan/smali/MainActivity;->mIntA:I

    .line57iput-object p0, p0, Lcom/coderyuan/smali/MainActivity;->mActivityA:Landroid/app/Activity;

    .line59iget-object v0, p0, Lcom/coderyuan/smali/MainActivity;->mStringA:Ljava/lang/String;

    invoke-virtual {v0}, Ljava/lang/String;->length()I

    move-result v0

    .line60.local v0,"len":Ireturn-void.end method

    根据Java和Smali代码的对比,值得注意的是,Smali获取类成员变量的方法,比较接近函数调用,只不过没有函数调用时的参数

    其他指令:

    65cc6f6a479f99fca0504c74c3b98338.png

    4a566bff8c1d25d2c88e08e84bd0565a.png

    参考:https://blog.csdn.net/yuanguozhengjust/article/details/80493963

    https://www.52pojie.cn/thread-687375-1-2.html

    展开全文
  • java_to_smali.bat

    2020-04-26 22:05:23
    该资源能够将java代码直接反编译为smali代码,方便进行smali语言学习修改,要求:(1)需要安装baksmali-2.4.0.jar,(2)拥有java环境
  • 但是在学习Smali语法的过程中,有时候需要进行java代码和smali代码的对照,如果可以把java代码转换成smali代码,学习起来岂不是很方便。于是网上搜了一把,很失望,都是各种转smali为java的工具。后来想了想,java...
  • Smali语言 调试技巧

    2018-07-19 11:53:13
    学习Smali语言的最终目的是为了能够看懂反编译后的中间产物Smali语法,其中我们除了可以静态分析之外 还可以动态调试。 静态调试工具有:S2S2J-v1.3 Androidstudio插件 java2SmaliSmali2JavaUI.exe 。 动态调试工...
  • 1、概述 Smali是Android系统中Dalvik虚拟机指令语言,在apk逆向过程中有许多...但是在学习Smali语法的过程中,有时候需要进行java代码和smali代码的对照,如果可以把java代码转换成smali代码,学习起来岂不是很...
  • Android逆向不可不知的smali语言

    千次阅读 2019-11-12 09:49:02
    smali语言比较简单,如果你会java和Android相关知识,就可以通过修改smali语言来改变java的代码,进而可以修改apk文件。 2.smali语法 前三行指明了类名,父类名,和源文件名。 类名以“L”开头相信熟悉Jni的...
  • apk 反编译之后生成.smali...smali baksmali 是针对DEX执行文件格式的汇编器反汇编器。smali 语言解释了Dalvik 虚拟机字节码的一种解释,寄存器语言。 流程相当于.java->javac ->.class->dx编译->....
  • smali2java 1.0.0.558

    2014-08-04 14:21:43
     smali2java工具基于apktool v1.5.0(baksmali v1.3.4)生成的smali文件,依赖于smali文件中的代码行数(.line关键字)变量别名(.local关键字)等信息,可以最大程度还原原始的java代码。还原出的java代码将具有...
  • Smali和逆向分析

    2018-01-20 12:26:14
    Smali是Dalvik的寄存器语言,它与Java的关系,简单理解就是汇编之于C。假如你对汇编有足够的驾驭能力,那你可以通过修改汇编代码来改变C/C++代码的走向。当然,学过汇编的都清楚,汇编比BrainFuck还难学,更不用说去...
  • Java语言的逆向比较简单,只说一些关键思路小技巧。下面以QQ音乐为例,讲述Android APP逆向的基本过程。静态分析将APK反编译成比较方便理解的代码(如smali、Java代码等),进行静态分析,了解代码的流程设计逻辑...
  • Java语言的逆向比较简单,只说一些关键思路小技巧。下面以QQ音乐为例,讲述Android APP逆向的基本过程。静态分析 将APK反编译成比较方便理解的代码(如smali、Java代码等),进行静态分析,了解代码的流程设计...
  • assets: 资源目录1,assets res 都是资源目录但有所区别: res 目录下的资源文件在编译时会自动生成索引文件(R.java),在Java代码中用R.xxx.yyy来引用; 而asset 目录下的资源文件不需要生成索引,在Java 代码...
  • 什么是smali语言? smali语言是是Dalvik的反汇编语言,是最终虚拟机识别的语言。也就是说无论App怎么混淆,怎么加密,smali语言都是不能改变的,我们可以改smali从而实现改源码的功能! 下面给大家介绍一下Smali的...
  • Java语言的逆向比较简单,只说一些关键思路小技巧。下面以QQ音乐为例,讲述Android APP逆向的基本过程。静态分析 将APK反编译成比较方便理解的代码(如smali、Java代码等),进行静态分析,了解代码的流程设计...
  • Java语言的逆向比较简单,只说一些关键思路小技巧。下面以QQ音乐为例,讲述Android APP逆向的基本过程。静态分析 将APK反编译成比较方便理解的代码(如smali、Java代码等),进行静态分析,了解代码的流程设计...
  • smail语言java工具

    2020-08-28 17:20:36
    smali语言是Davlik的寄存器语言,语法上汇编语言相似,Dalvik VM与JVM的最大的区别之一就是Dalvik VM是基于寄存器的。基于寄存器的意思是,在smali里的所有操作都必须经过寄存器来进行。
  • Android虚拟机Dalvik并不是执行java虚拟机JVM编译后生成的class文件,而是执行再重新整合打包后生成的dex文件,dex文件反编译之后就是smali代码,可以说,smali语言是Dalvik的反汇编语言 JAVA和Smali数据类型对比:...
  • Smali代码语法

    2019-03-12 20:40:00
    Smali是什么? 简介 Smali支持注解、调试信息、行数信息等基本Java的基本特性,可以说是很接近Java编译在JVM上的中间语言了,一般用来做Android程序的逆向工程 ...所以smali语言是Dalvik的反汇编语言 B---by...
  • Smali是Dalvik的寄存器语言,它与Java的关系,简单理解就是汇编之于C。假如你对汇编有足够的驾驭能力,那你可以通过修改汇编代码来改变C/C++代码的走向。当然,学过汇编的都清楚,汇编比BrainFuck还难学,更不用说去...
  • smali语法中文.doc

    2020-06-29 15:28:03
    smali baksmali 则是针对 DEX 执行文件格式的汇编器反汇编器, 反汇编后 DEX 文件会产生.smali 后缀的代码文件, smali 代码拥有特定的格式与语法, smali 语言是对 Dalvik 虚拟机字节码的一种解释。
  • smali中文手册.zip

    2020-03-16 20:49:33
    smali baksmali 则是针对 DEX 执行文件格式的汇编器反汇编器, 反汇编后 DEX 文件会产生.smali 后缀的代码文件, smali 代码拥有特定的格式与语法, smali 语言是对 Dalvik 虚拟机字节码的一种解释。
  • 通常基于Java语言开发程序都是通过调用javac编译器将源代码编译成.class文件,这种文件能够被JVM识别,加载并执行的文件格式(除了常见的java源代码生成的class文件,其他的Scalar、PythonGroovy等语言都可以生成...

空空如也

空空如也

1 2 3 4
收藏数 68
精华内容 27
关键字:

java语言和smali语言

java 订阅