如何把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 .prologue
.line
invoke-direct {p0}, Ljava/lang/Object;-><init>()V return-void
.end method .method public static main([Ljava/lang/String;)V
.registers
.parameter .prologue
.line
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
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:)
at com.android.dx.command.dexer.Main.processFileBytes(Main.java:)
at com.android.dx.command.dexer.Main.access$(Main.java:)
at com.android.dx.command.dexer.Main$FileBytesConsumer.processFileBytes(
Main.java:)
at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.j
ava:)
at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java
:)
at com.android.dx.command.dexer.Main.processOne(Main.java:)
at com.android.dx.command.dexer.Main.processAllFiles(Main.java:)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:)
at com.android.dx.command.dexer.Main.run(Main.java:)
at com.android.dx.command.dexer.Main.main(Main.java:)
at com.android.dx.command.Main.main(Main.java:)
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:
)
at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:
)
at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary
(DirectClassFile.java:)
at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.jav
a:)
at com.android.dx.command.dexer.Main.parseClass(Main.java:)
at com.android.dx.command.dexer.Main.access$(Main.java:)
at com.android.dx.command.dexer.Main$ClassParserTask.call(Main.java:
)
at com.android.dx.command.dexer.Main.processClass(Main.java:)
... more
error; aborting
原因不明,大概是jdk版本不对,然后把baksmali.jar和dx.jar两个包拷贝到ubuntu上,执行上述三个步骤,运行成功,ubuntu上安装的jdk版本是1.7
如何把java代码转换成smali代码的更多相关文章
- [Android Security] 如何把java代码转换成smali代码
copy :https://www.cnblogs.com/gordon0918/p/5466514.html 1.概述 Smali是Android系统中Dalvik虚拟机指令语言,在apk逆向过程中 ...
- JavaScript DOM高级程序设计 3.6 实例 将HTML代码转换成DOM代码(附源码)--我要坚持到底!
作为一名Web开发者,最讨厌的事情就是重复性任务,摆脱乏味的日常重复性事物的一种方法,是借助可重用的对象或者说与你现在建立的ADS库类似的库,另外一种让事情变得有意思,且能够加速开发进程的方式是编写能 ...
- 用Python写一个将Python2代码转换成Python3代码的批处理工具
之前写过一篇如何在windows操作系统上给.py文件添加一个快速处理的右键功能的文章:<一键将Python2代码自动转化为Python3>,作用就是为了将Python2的文件升级转换成P ...
- C#将html代码转换成文本代码
/// <summary> /// 去除HTML标记 /// </summary> /// <param name="strHtml">包括HT ...
- [RN] React Native代码转换成微信小程序代码的转换引擎工具
React Native代码转换成微信小程序代码的转换引擎工具 https://github.com/areslabs/alita
- (转载)JAVA动态编译--字节代码的操纵
在一般的Java应用开发过程中,开发人员使用Java的方式比较简单.打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行Java 程序就可以了.这种开发模式背后的过程是:开发人员编写的 ...
- 打造smali代码库辅助分析
打造smali代码库辅助分析 在分析Android应用程序的时候,我们往往会插入代码重打包apk来辅助我们分析的工作 一个比较取巧的方法就是先用java写好代码以及相关的调用之后, 然后直接扣出代码 ...
- apk反编译(4)Smali代码注入
转自 : http://blog.sina.com.cn/s/blog_5674d18801019i89.html 应用场景 Smali代码注入只能应对函数级别的移植,对于类级别的移植是无能为力的.具 ...
- android smali代码注入 实战一
有同学在通服里面干活,最近一直忙着4g基站搭建的干活,测试设备(android)测量移动网络数据,没有自动保存记录的功能,只能手动记录各种测试参数,不知道测试软件供应商是怎样想的,竟然不提供的这样的功 ...
随机推荐
- linux目录权限小记
r : 拥有读取目录结构列表的权限 x:拥有进入此目录的权限 w: 1: 建立新的档案和目彔: 2删除已经存在的档案和目录(无论该档案的权限为何!) 3能够重命名档案和目录: 4 能够移动目录里面的 ...
- oracle commit之后的数据回滚
当你晕晕乎乎的执行了commit之后,突然间意思到自己点错了,那说明你和我碰到了一样的问题. 瞬间感觉大冷天头顶冒汗,那就说明你的感觉对了.废话少说,下面是我的办法: 下面的例子都是以Test表为例. ...
- NSUserDefaults的使用方法
NSUserDefaults对象是用来保存,恢复应用程序相关的偏好设置,配置数据等等,用户再次打开程序或开机后这些数据仍然存在.默认系统允许应用程序自定义它的行为去迎合用户的喜好.你可以在程序运行的时 ...
- 8 个实用的 Linux netcat 命令示例
Netcat 或者叫 nc 是 Linux 下的一个用于调试和检查网络工具包.可用于创建 TCP/IP 连接,最大的用途就是用来处理 TCP/UDP 套接字. 这里我们将通过一些实例来学习 netca ...
- uva 498 - Polly the Polynomial
UVa 498: Polly the Polynomial | MathBlog #include <cstdio> #include <cstdlib> using name ...
- 转载:[Java]读取文件方法大全
转载网址:http://www.cnblogs.com/lovebread/archive/2009/11/23/1609122.html 1.按字节读取文件内容 2.按字符读取文件内容 3.按行读取 ...
- CFLAGS/CPPFLAGS/CXXFLAGS in Makefile介绍
先来看一张关于Makefile中的常见预定义变量. CFLAGS 表示用于 C 编译器的选项,CXXFLAGS 表示用于 C++ 编译器的选项.这两个变量实际上涵盖了编译和汇编两个步骤.大多数程序和库 ...
- HTML&CSS基础学习笔记1.6-html的文本操作标签
文本也许是HTML里最常见的元素了,所以我们有必要对HTML的文本操作标签做下认识. 1. <em>,<i>内的文字呈现为倾斜效果: 2. <strong>,< ...
- pyqt5表格qtablewidget
表格用到控件QTableWidget,还有一个类似的叫QTableView的. 设置单元格里的内容用方法:setItem(0,0,str) 第一个0表示第一行, 第二个0表示第一列, 第三个参数是写入 ...
- 把zlog封装成模块,隐藏zlog
mylog.h #ifndef _MY_LOG_H #define _MY_LOG_H int init(char *filename); void *get_category(char * cate ...