如何将 smali 文件i转换成java文件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将 smali 文件i转换成java文件?相关的知识,希望对你有一定的参考价值。

用dex2jar将 classes.dex 转 jar 时 报错了,就通过apktool转成了smali 。如何将 smali 文件i转换成java文件?
根本就不行,就是因为把smali转化为dex文件,然后再用 dex2jar转化一次报错,我才提问的

可以先把smali转化为dex文件,然后再用 dex2jar转化一次。我之前也遇到过跟你一样的情况就是这么处理的。祝你好运!
-----------------------------------------------------------------------------------------------------
安卓精英团为你解答
安卓精英团欢迎各位精英加入
参考技术A 你可以下载一个DJ Java decompiler 安装好后 就用DJ打开你的smali文件所在位置 把下面文件格式的选项选为所有文件 然后任选一个smali文件打开 再点击“另存为” 这样保存的就是java格式了追问

这种方法是把文件的扩展名由.smali 变成了.java ,但是里面的内容还是 smali 语言的,根本就不是java语言的。

参考技术B 学习了学习了追问

你学习什么了?学习学习,
根本就不行,就是因为把smali转化为dex文件,然后再用 dex2jar转化一次报错,我才提问的

Android逆向基础知识Smali

什么是Smali:

我们用工具反编译一些APP的时候,会看到一个smali文件夹,里面其实就是每个Java类所对应的smali文件。Android虚拟机Dalvik并不是执行java虚拟机JVM编译后生成的class文件,而是执行再重新整合打包后生成的dex文件,dex文件反编译之后就是smali代码,可以说,smali语言是Dalvik的反汇编语言

JAVA和Smali数据类型对比:

   JAVA                    Smali
V void Z boolean B byte S short C char I int J long F float D double 引用类型 L 对象 [ 数组

语法:

.field  定义变量

.method  方法

.parameter  方法参数

.prologue  方法开始

.line 12  此方法位于第12行

invoke-super  调用父函数

const/high16  v0, 0x7fo3  把0x7fo3赋值给v0

invoke-direct  调用函数

return-void  函数返回void

.end method  函数结束

new-instance  创建实例

iput-object  对象赋值

iget-object  调用对象

invoke-static  调用静态函数
smali跳转语句

“if-eq vA, vB, :cond_**” 如果vA等于vB则跳转到:cond_**

“if-ne vA, vB, :cond_**” 如果vA不等于vB则跳转到:cond_**

“if-lt vA, vB, :cond_**” 如果vA小于vB则跳转到:cond_**

“if-ge vA, vB, :cond_**” 如果vA大于等于vB则跳转到:cond_**

“if-gt vA, vB, :cond_**” 如果vA大于vB则跳转到:cond_**

“if-le vA, vB, :cond_**” 如果vA小于等于vB则跳转到:cond_**

“if-eqz vA, :cond_**” 如果vA等于0则跳转到:cond_**

“if-nez vA, :cond_**” 如果vA不等于0则跳转到:cond_**

“if-ltz vA, :cond_**” 如果vA小于0则跳转到:cond_**

“if-gez vA, :cond_**” 如果vA大于等于0则跳转到:cond_**

“if-gtz vA, :cond_**” 如果vA大于0则跳转到:cond_**

“if-lez vA, :cond_**” 如果vA小于等于0则跳转到:cond_**

DEMO:

java代码
        private boolean show(){
                boolean tempFlag = ((3-2)==1)? true : false;
                if (tempFlag) {
                    return true;
                }else{
                    return false;
                }
            }

转换smali代码
.method private show()Z
    .locals 2

    .prologue           //方法开始
    .line 22
    const/4 v0, 0x1     // v0赋值为1

    .line 24
    .local v0, tempFlag:Z
    if-eqz v0, :cond_0            // 判断v0是否等于0, 不符合条件向下走, 符合条件执行cond_0分支

    .line 25
    const/4 v1, 0x1            // 符合条件分支

    .line 27
    :goto_0
    return v1

    :cond_0
    const/4 v1, 0x0            // cond_0分支

    goto :goto_0
.end method

参考:

http://blog.csdn.net/lostinai/article/details/48975661

http://blog.csdn.net/sjim_/article/details/50443860


以上是关于如何将 smali 文件i转换成java文件?的主要内容,如果未能解决你的问题,请参考以下文章

怎样把smali文件转换为java文件

直接将 .java 转换为 .smali。可能的?

将 .Java 文件转换为 .Smali 文件

JAVA转换成smali语法

JAVA如何将二进制数转换成文件?

java 中如何将一个字符串转换成一个整数数组