如何把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 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 <init>()V
    .registers 1

    .prologue
    .line 3
    invoke-direct {p0}, Ljava/lang/Object;-><init>()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

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: bad class file 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)
        ... 11 more
1 error; aborting

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

时间: 2024-10-11 23:17:43

如何把java代码转换成smali代码的相关文章

Java 转换成ObjectC代码

现在很多app开发中,服务器都是用Java开发,数据交互的时候,与Android很容易实现,无论是xml还是json,都能轻松的转换成对象,这可苦了IOS的程序员,他们要根据数据格式写自己的ObjectC类,服务器一旦修改,就不能解析,不能像Android一样,共用一套class. Google就是一家为程序员谋福利的公司,他们开发了一工具J2ObjC可以将Java类转换成ObjectC代码 1.安装eclipse插件 https://raw.github.com/hemantasapkota/

Java基本数据转换成Json代码

JSON是一种轻量级的数据交换格式,非常适合于服务器与 JavaScript 的交互.是移动开发中数据客户端和服务器端数据交互的不二选择; 尤其是现在HTML5的流行,更显着使用Json 完成数据交互的重要性. 在这里, 我将演示一下Java基本数据转换为Json代码 Json必需包 json-lib-2.3-jdk15.jar commons-lang-2.4.jar commons-logging-1.0.4.jar ezmorph-1.0.6.jar commons-collections

android smali代码注入 实战一

有同学在通服里面干活,最近一直忙着4g基站搭建的干活,测试设备(android)测量移动网络数据,没有自动保存记录的功能,只能手动记录各种测试参数,不知道测试软件供应商是怎样想的,竟然不提供的这样的功能! 要我帮忙把测试数据自动导入excel表格中,我硬着头皮去尝试下.网上有smali的语法和注入的介绍,但参考价值不大,分享下自己的smali注入的过程和心得(这里smali语法就不讲了). 案例 1.需求 需要提取数据界面如下: 提取数据字段信息: 地点address 小区识别码 cellId,

Dalvik指令分析(一) 字节码转换为smali代码

有过android应用反编译或者再打包的朋友都有使用过apktool的经验,apktool能将dex文件的 字节码转换为smali代码,这个工具是怎么做到对dex进行解析并生成smali代码的呢?这就需要对 dex文件的格式很熟悉.需要掌握dalvik指令的字节码格式,并能翻译成对应的smali代码. 我准备写一系列的文章来分析dex文件的格式.dalvik字节码的格式.以及dex to smali的方法, 基于此可以做很多的应用,比如安全扫描.应用加固等等! Dalvik指令介绍请参考官方文档

打造smali代码库辅助分析

打造smali代码库辅助分析 在分析Android应用程序的时候,我们往往会插入代码重打包apk来辅助我们分析的工作 一个比较取巧的方法就是先用java写好代码以及相关的调用之后, 然后直接扣出代码 然后可以制作成各种代码模版,放在Android Killer中使用(代码模版管理器) Android Killer 自带3种代码模版 1. LoadLibrary const-string v0, "so name" invoke-static {v0}, Ljava/lang/Syste

Smali代码语法

Smali是什么? 简介 Smali支持注解.调试信息.行数信息等基本Java的基本特性,可以说是很接近Java编译在JVM上的中间语言了,一般用来做Android程序的逆向工程 由于Smali是用于Dalvik和Art(Android虚拟机)的反汇编程序实现 APK文件>dex文件>smali文件>修改代码 所以smali语言是Dalvik的反汇编语言 B---byteC---charD---doubleF---floatI---intJ---longS---shortV---void

java打包成window service服务[转]

1 解释 java project  我说的是main方法作为程序入口的java工程,有别于 web project. 这样的工程 一般都是web project的附属扫描程序或一些独立的执行程序,如数据同步程序等.     把这样的project 要部署到生产机上去运行,这样就涉及到两个问题:         1 打包问题,我们一般不会把整个工程文件夹给放上去,一般做法是打一个jar包.        2 执行问题  最好的做法就是这些main方法程序的工程 对客户来说是透明的 就要求工程 发

java桶式排序算法代码下载

原文:java桶式排序算法代码下载 代码下载地址:http://www.zuidaima.com/share/1550463272176640.htm 桶式排序: * 桶式排序不再是基于比较的了,它和基数排序同属于分配类的排序, * 这类排序的特点是事先要知道待排 序列的一些特征. * 桶式排序事先要知道待排 序列在一个范围内,而且这个范围应该不是很大的. * 比如知道待排序列在[0,M)内,那么可以分配M个桶,第I个桶记录I的出现情况, * 最后根据每个桶收到的位置信息把数据输出成有序的形式.

java 输入和输出 代码示例

此处省略介绍, package org.rui.io.inout; import java.io.BufferedReader; import java.io.FileReader; /** * 缓冲输入文件 * @author lenovo * */ public class BufferedInputFile { public static String read(String filename) throws Exception { BufferedReader br=new Buffer