zoukankan      html  css  js  c++  java
  • 如何把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-sdkuild-tools23.0.1lib,找到该包后执行以下命令

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

    3、把dex转化成smali文件

    这时候会使用到另外一个工具baksmali,该工具位于android-sdkplatform-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

  • 相关阅读:
    SP笔记:交叉实现七行并成一行
    HTML tag 学习
    操作哈希表
    Efficient bipedal robots based on passivedynamic walkers
    Pushing People Around
    ZEROMOMENT PONTTHIRTY FIVE YEARS OF ITS LIFE

    Active Learning for RealTime Motion Controllers
    Accelerometerbased User Interfaces for the Control of a Physically Simulated Character
    Dynamic Response for Motion Capture Animation
  • 原文地址:https://www.cnblogs.com/gordon0918/p/5466514.html
Copyright © 2011-2022 走看看