-
java smali_如何把java代码转换成smali代码
2021-02-12 13:22:09但是在学习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安卓版_smali2java
2021-03-07 03:28:33这是smali2java下载,本人自己写的将smali反编译为java代码的工具,支持apk和jar包直接反编译为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编译器的编译选项可以在生成的字节码中剔除这些信息)。
软件截图
-
android smali java_[Android Security] 如何把java代码转换成smali代码
2021-02-12 21:21:25但是在学习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代码如下
.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
-
java smali代码 解读_Smali代码语法
2021-03-15 17:16:29Smali是什么?简介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进行说明:
移位操作:
此类操作常用于赋值
- 返回操作:
用于返回值,对应Java中的return语句
- 常量操作:
用于声明常量,比如字符串常量(仅声明,String a = “abc”这种语句包含声明和赋值)
- 调用操作:
用于调用方法,基本格式:invoke-kind {vC, vD, vE, vF, vG}, meth@BBBB,其中,BBBB代表方法引用(参见上面介绍的方法定义及调用),vC~G为需要的参数,根据顺序一一对应
- 判断操作:
判断操作用来比较一个寄存器中的值,是否与目标寄存器中的值相等或不等,对应Java中的if语句,格式为:if-[test] v1,v2, [condition],其衍生操作还有专门与0进行比较的if-[test]z v1, [condition],其中[condition]为符合判断结果后的跳转条件,需要提前定义好。判断操作也通常和goto配合使用,用来实现循环或者if-else语句
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
仔细观察可以发现:
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,分别用于操作数组字段或者静态字段
举例:
以下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获取类成员变量的方法,比较接近函数调用,只不过没有函数调用时的参数
其他指令:
参考: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环境 -
如何把java代码转换成smali代码
2016-05-06 17:50:00但是在学习Smali语法的过程中,有时候需要进行java代码和smali代码的对照,如果可以把java代码转换成smali代码,学习起来岂不是很方便。于是网上搜了一把,很失望,都是各种转smali为java的工具。后来想了想,java... -
Smali语言 调试技巧
2018-07-19 11:53:13学习Smali语言的最终目的是为了能够看懂反编译后的中间产物Smali语法,其中我们除了可以静态分析之外 还可以动态调试。 静态调试工具有:S2S2J-v1.3 Androidstudio插件 java2SmaliSmali2JavaUI.exe 。 动态调试工... -
[Android Security] 如何把java代码转换成smali代码
2018-04-23 15:39:001、概述 Smali是Android系统中Dalvik虚拟机指令语言,在apk逆向过程中有许多...但是在学习Smali语法的过程中,有时候需要进行java代码和smali代码的对照,如果可以把java代码转换成smali代码,学习起来岂不是很... -
Android逆向不可不知的smali语言
2019-11-12 09:49:02smali语言比较简单,如果你会java和Android相关知识,就可以通过修改smali语言来改变java的代码,进而可以修改apk文件。 2.smali语法 前三行指明了类名,父类名,和源文件名。 类名以“L”开头相信熟悉Jni的... -
apk 反编译总结之smali 语言
2019-09-18 14:31:24apk 反编译之后生成.smali...smali 和baksmali 是针对DEX执行文件格式的汇编器和反汇编器。smali 语言解释了Dalvik 虚拟机字节码的一种解释,寄存器语言。 流程相当于.java->javac ->.class->dx编译->.... -
smali2java 1.0.0.558
2014-08-04 14:21:43smali2java工具基于apktool v1.5.0(baksmali v1.3.4)生成的smali文件,依赖于smali文件中的代码行数(.line关键字)和变量别名(.local关键字)等信息,可以最大程度还原原始的java代码。还原出的java代码将具有... -
Smali和逆向分析
2018-01-20 12:26:14Smali是Dalvik的寄存器语言,它与Java的关系,简单理解就是汇编之于C。假如你对汇编有足够的驾驭能力,那你可以通过修改汇编代码来改变C/C++代码的走向。当然,学过汇编的都清楚,汇编比BrainFuck还难学,更不用说去... -
安卓逆向与java_Java语言的逆向(Android APP)
2021-02-28 10:33:57Java语言的逆向比较简单,只说一些关键思路和小技巧。下面以QQ音乐为例,讲述Android APP逆向的基本过程。静态分析将APK反编译成比较方便理解的代码(如smali、Java代码等),进行静态分析,了解代码的流程和设计逻辑... -
java gui反编译_Java语言的逆向(Android APP)
2020-12-02 01:34:26Java语言的逆向比较简单,只说一些关键思路和小技巧。下面以QQ音乐为例,讲述Android APP逆向的基本过程。静态分析 将APK反编译成比较方便理解的代码(如smali、Java代码等),进行静态分析,了解代码的流程和设计... -
初识 APK、Dalvik字节码以及Smali语言
2019-09-19 14:11:48assets: 资源目录1,assets 和 res 都是资源目录但有所区别: res 目录下的资源文件在编译时会自动生成索引文件(R.java),在Java代码中用R.xxx.yyy来引用; 而asset 目录下的资源文件不需要生成索引,在Java 代码... -
Android_逆向开发_Smali基础语法和介绍!
2019-03-01 16:11:05什么是smali语言? smali语言是是Dalvik的反汇编语言,是最终虚拟机识别的语言。也就是说无论App怎么混淆,怎么加密,smali语言都是不能改变的,我们可以改smali从而实现改源码的功能! 下面给大家介绍一下Smali的... -
apk逆向思路_Java语言的逆向(Android APP)
2021-01-09 07:36:50Java语言的逆向比较简单,只说一些关键思路和小技巧。下面以QQ音乐为例,讲述Android APP逆向的基本过程。静态分析 将APK反编译成比较方便理解的代码(如smali、Java代码等),进行静态分析,了解代码的流程和设计... -
apk逆向分析工具_Java语言的逆向(Android APP)
2020-10-27 03:12:37Java语言的逆向比较简单,只说一些关键思路和小技巧。下面以QQ音乐为例,讲述Android APP逆向的基本过程。静态分析 将APK反编译成比较方便理解的代码(如smali、Java代码等),进行静态分析,了解代码的流程和设计... -
smail语言转java工具
2020-08-28 17:20:36smali语言是Davlik的寄存器语言,语法上和汇编语言相似,Dalvik VM与JVM的最大的区别之一就是Dalvik VM是基于寄存器的。基于寄存器的意思是,在smali里的所有操作都必须经过寄存器来进行。 -
Android逆向基础知识Smali
2019-04-12 09:21:49Android虚拟机Dalvik并不是执行java虚拟机JVM编译后生成的class文件,而是执行再重新整合打包后生成的dex文件,dex文件反编译之后就是smali代码,可以说,smali语言是Dalvik的反汇编语言 JAVA和Smali数据类型对比:... -
Smali代码语法
2019-03-12 20:40:00Smali是什么? 简介 Smali支持注解、调试信息、行数信息等基本Java的基本特性,可以说是很接近Java编译在JVM上的中间语言了,一般用来做Android程序的逆向工程 ...所以smali语言是Dalvik的反汇编语言 B---by... -
[Android Security] Smali和逆向分析
2018-04-23 16:24:00Smali是Dalvik的寄存器语言,它与Java的关系,简单理解就是汇编之于C。假如你对汇编有足够的驾驭能力,那你可以通过修改汇编代码来改变C/C++代码的走向。当然,学过汇编的都清楚,汇编比BrainFuck还难学,更不用说去... -
smali语法中文.doc
2020-06-29 15:28:03smali 和 baksmali 则是针对 DEX 执行文件格式的汇编器和反汇编器, 反汇编后 DEX 文件会产生.smali 后缀的代码文件, smali 代码拥有特定的格式与语法, smali 语言是对 Dalvik 虚拟机字节码的一种解释。 -
smali中文手册.zip
2020-03-16 20:49:33smali 和 baksmali 则是针对 DEX 执行文件格式的汇编器和反汇编器, 反汇编后 DEX 文件会产生.smali 后缀的代码文件, smali 代码拥有特定的格式与语法, smali 语言是对 Dalvik 虚拟机字节码的一种解释。 -
Smali简介和实现类外调用父类方法
2018-07-04 17:30:36通常基于Java语言开发程序都是通过调用javac编译器将源代码编译成.class文件,这种文件能够被JVM识别,加载并执行的文件格式(除了常见的java源代码生成的class文件,其他的Scalar、Python和Groovy等语言都可以生成...