Android kotlin和java反编译后的smali 有什么区别?

转载请标明出处:
http://blog.csdn.net/DJY1992/article/details/72488456
本文出自:【奥特曼超人的博客】



kotlin反编译后的smali 有什么区别?

以前有使用过Kotlin,后来觉得不习惯就放弃了,编译速度也让我有点蛋蛋的忧伤,直到今天谷歌承认之后,才对它有了点希望。
逆向的同学比较关心一个问题,“Kotlin编译出来的smail和java编译出来的一样吗?”,我忽然也很好奇,以前知道是不一样的,但是具体有哪些改变,也不是很清楚,也没深究速度效率和底层方面会有什么不相同,今天就带大家一起来了解下,具体有 哪些不同和它的运行方式 是怎样的。

了解安装和使用的可以查看上篇文章: Android AndroidStudio 详解Kotlin的安装和使用(附下载demo)

直接进入主题,首先放入Convert之后的代码:

/**
 * 测试 Kotlin
 * @author Karl-dujinyang
 */
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initView()//初始化
        testValue()//赋值和事件
    }

    private fun testValue() {
        btnWs!!.setOnClickListener {
            tvWs!!.text = "I'm immqy"
            edtWs!!.setText("Karl-dujinyang")
        }
    }

    private var btnWs: Button? = null
    private var tvWs: TextView? = null
    private var edtWs: EditText? = null

    private fun initView() {
        btnWs = this.findViewById(R.id.btn_hw) as Button
        tvWs = this.findViewById(R.id.tx_hw) as TextView
        edtWs = this.findViewById(R.id.edt_hw) as EditText
    }
}

很常见,定义的Button,Textview,Edittext,还有给它们赋值和定义方法,来看看生成的apk界面,点击效果和原生其实是一样的。
Android kotlin和java反编译后的smali 有什么区别?_第1张图片 Android kotlin和java反编译后的smali 有什么区别?_第2张图片


ok,我们先来编译这个包,看下底层的运行是如何操作的。


(1). 编译后的目录结构不同 :smail 会编译出两个smail_classes2 ,可以看到 kotlin 编译到 unknown里 ,细心的同学会发现里面有个 install-run.zip ,最主要的是里面包含了slice_0-classes.dex ~ slice_9-classes.dex ,这里没太多关注里面的东西,接着往下走

  • 1.1 Android kotlin和java反编译后的smali 有什么区别?_第3张图片
  • 1.2 Android kotlin和java反编译后的smali 有什么区别?_第4张图片



(2). MainActivity 包名路径改变了

Android kotlin和java反编译后的smali 有什么区别?_第5张图片



(3). MainActivity 类名也改变了

Android kotlin和java反编译后的smali 有什么区别?_第6张图片



(4). 发现编译后执行字节都是不同的,里面到Lcom/android/tools/fd/runtime/AppInfo;->usingApkSplits

Android kotlin和java反编译后的smali 有什么区别?_第7张图片



(5). 我们来看下 smail_classes2 中,有个关键的类,是Server.smail,顾名思义,服务
android/tools/fd/runtime/Server$SocketServerThread 下 执行了socketServerThread,可以从图中看到,它执行了 InstantRun ,可以大胆猜测,它是去执行了 unknown 里的 install-run 。

Android kotlin和java反编译后的smali 有什么区别?_第8张图片



(6). 最后来看下install-run.zip 压缩包里面有些什么,似乎也没什么东西,supportV4和V7包,还有kotlin-stdlib,annotations注解,剩下的估计是封装切割 0~9 的classes.dex了。

Android kotlin和java反编译后的smali 有什么区别?_第9张图片

我们可以看到,用了Kotlin编译后,里面的类和对象,都是给了dex,这样如果项目很大,那我们查看起来也有一定的困难度,所以从某些方面来说,以我们熟悉的方式去破解它,不是那么方便,但是……。




|| 版权声明:本文为博主杜锦阳原创文章,转载请注明出处。

你可能感兴趣的:(android,java,smail,Kotlin,编译原理,Android,技术汇总,安卓-黑客的世界)