java smali_如何把java代码转换成smali代码

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值