1. 程式人生 > >Android kotlin和java反編譯後的smali 有什麼區別?

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,這樣如果專案很大,那我們檢視起來也有一定的困難度,所以從某些方面來說,以我們熟悉的方式去破解它,不是那麼方便,但是……。




|| 版權宣告:本文為博主杜錦陽原創文章,轉載請註明出處。