转载请标明出处:
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界面,点击效果和原生其实是一样的。


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


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

  • 1.1
  • 1.2



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



(3). MainActivity 类名也改变了



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



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



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

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




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

更多相关文章

  1. adb shell 是什么,如何进入?
  2. Android有效获取状态栏(StatusBar)高度的方法
  3. Android中使用Handler&Looper更新UI范例
  4. Android(安卓)之数据的传递与传回
  5. Android(安卓)上实现非root的 Traceroute -- 非Root权限下移植可
  6. Android实现直接播放麦克风采集到的声音
  7. Android网络连接判断与相关处理
  8. Android如何调用系统相机拍照
  9. Android读取文本文件中内容的方法

随机推荐

  1. 读书目录
  2. Android(安卓)CountDownTimer
  3. android关于View的截图
  4. Android编程心得-在任意类中获取当前屏幕
  5. Android(安卓)点击EditText以外区域,隐藏
  6. 21.Android系统属性build.prop文件(笔记)
  7. android获取网络图片的用法
  8. Android(安卓)颜色渲染(五) LinearGradie
  9. OpenGL ES基础篇
  10. 一步一步 安装Ubutu11.10 图文教程