Android kotlin和java反編譯後的smali 有什麼區別?
kotlin反編譯後的smali 有什麼區別?
以前有使用過Kotlin,後來覺得不習慣就放棄了,編譯速度也讓我有點蛋蛋的憂傷,直到今天谷歌承認之後,才對它有了點希望。
逆向的同學比較關心一個問題,“Kotlin編譯出來的smail和java編譯出來的一樣嗎?”,我忽然也很好奇,以前知道是不一樣的,但是具體有哪些改變,也不是很清楚,也沒深究速度效率和底層方面會有什麼不相同,今天就帶大家一起來了解下,具體有 哪些不同和它的執行方式 是怎樣的。
直接進入主題,首先放入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,這樣如果專案很大,那我們檢視起來也有一定的困難度,所以從某些方面來說,以我們熟悉的方式去破解它,不是那麼方便,但是……。
|| 版權宣告:本文為博主杜錦陽原創文章,轉載請註明出處。