Smali与Java文件的相互转换与运行
Reading Time:The full text has 403 words, estimated reading time: 3 minutes
Creation Date:2023-10-17
Previous Article:瑞数vmp-代码格式化后无法正常运行原因分析
Next Article:Dalvik虚拟机解释语言:Smali
BEGIN
Java代码转Smali代码
假设有java源文件test.java
- 通过javac将java文件转换成class文件: 执行
javac test.java
生成Test.class
文件 - 通过dx.jar将class文件转换成dex文件: 执行
dx --dex --output=./Test.dex Test.class
生成Test.dex
文件 - 通过baksmali将dex文件转换成smali文件: 执行
java -jar /path/to/baksmali-2.5.2.jar d Test.dex
后可看到out/Test.smali
文件即为生成的smali文件
- 其中dx命令用的文件是
~/Library/Android/sdk/build-tools/30.0.3/dx
,可将该目录加入到系统环境变量PATH中
Smali代码转Java代码
- 通过smali.jar将smali文件转换成dex文件: 执行
java -jar /path/to/smali-2.5.2.jar a ./out -o Test.dex
- 通过dex2jar将dex文件转化成class文件:执行
d2j-dex2jar.sh ./Test.dex
生成Test-dex2jar.jar
文件 - 解压
Test-dex2jar.jar
文件:unzip Test-dex2jar.jar
生成Test.class
文件, - 使用命令:
javap -p Test.class
打印反编译后的源码文件或者使用JD-GUI
工具查看
工具下载
smali工具:https://bitbucket.org/JesusFreke/smali/downloads/ 🔗
dex-tools:https://github.com/pxb1988/dex2jar/releases 🔗
jd-gui: https://github.com/java-decompiler/jd-gui/releases 🔗
jd-gui在Mac上安装需要注意:
- 下载并解压出
JD-GUI.app
文件 - 将
JD-GUI.app
文件移动到/Applications/
目录下,此时运行软件会提示java找不到 - 命令行运行
echo $JAVA_HOME/bin/java | pbcopy
,此时java路径已经在剪切板中了 - 编辑
vim /Applications/JD-GUI.app/Contents/MacOS/universalJavaApplicationStub.sh
,删除JAVACMD判断赋值语句并在之后的256行添加JAVACMD="/Users/rnet/.jenv/versions/1.8/bin/java"
后保存退出,再次运行正常
Dalvik虚拟机中运行Smali代码
- 通过Smali代码转Java代码代码中的第1步生成的dex文件上传到手机模拟器sd卡目录:
adb push Test.dex /sdcard
- 进入adb shell:
adb shell
- 运行dex文件:
dalvikvm -cp /sdcard/Test.dex Test
,其中命令最后的Test是类名,如果是包则用包名替代
FINISH
Previous Article:瑞数vmp-代码格式化后无法正常运行原因分析
Next Article:Dalvik虚拟机解释语言:Smali