讀完this有關Android中代碼混淆的有趣文章,我試圖將其用於研究目的,但將這項技術應用到classes.dex文件後,我遇到了崩潰。Android中的垃圾文字注入
接下來就是我試圖應用這一技術後,運行該代碼:
0006e8: |[0006e8] com.example.root.bji.MainActivity.paintGUI:()V
0006f8: 1202 |0000: const/4 v2, #int 0 // #0
0006fa: 1a01 0000 |0001: const-string v1, "" // [email protected]
0006fe: 1200 |0003: const/4 v0, #int 0 // #0
000700: 1303 1400 |0004: const/16 v3, #int 20 // #14
000704: 3244 0900 |0006: if-eq v4, v4, 000f // +0009
000708: 2600 0300 0000 |0008: fill-array-data v0, 0000000b // +00000003
00070e: 0003 0100 1600 0000 1212 0000 0000 ... |000b: array-data (15 units)
00072c: 0000 |001a: nop // spacer
00072e: 0000 |001b: nop // spacer
... more NOPs ...
000742: 0000 |0025: nop // spacer
000744: 0000 |0026: nop // spacer
000746: 1503 087f |0027: const/high16 v3, #int 2131230720 // #7f08
...
給你一些情況下,我要保持清醒一些幽會像在0x6f8 0值到V2寄存器(「const/4 v2,0」=> 12 02),它將在此方法結束時的GUI中顯示(在0x746及更高版本中);並使用這種混淆技術,「隱藏」v2寄存器的修改,在0x716(「const/4 v2,1」=> 12 12)處將值2設置爲v2寄存器。 如果您按照0x704處的代碼執行,那麼分支將完成到0x716,其中「const/4 v2,1」位於fill-data-array-payload內部。
而且我所面臨的問題是,當我運行的代碼崩潰(我已經從4.3到5.1試了一下),當碰撞發生什麼logcat的告訴我是:
W/dalvikvm(13874): VFY: invalid branch target 9 (-> 0xf) at 0x6
W/dalvikvm(13874): VFY: rejected Lcom/example/root/bji/MainActivity;.paintGUI()V
W/dalvikvm(13874): VFY: rejecting opcode 0x32 at 0x0006
W/dalvikvm(13874): VFY: rejected Lcom/example/root/bji/MainActivity;.paintGUI()V
W/dalvikvm(13874): Verifier rejected class Lcom/example/root/bji/MainActivity;
W/dalvikvm(13874): Class init failed in newInstance call (Lcom/example/root/bji/MainActivity;)
D/AndroidRuntime(13874): Shutting down VM
對於我在日誌中理解的內容,操作系統拒絕了「if-eq」跳轉,因爲偏移指向了(我嘗試了其他分支指令,但結果相同)。代碼工作的唯一方式是如果我指向fill-array-data-payload外的偏移量,但是沒有應用混淆技術:P。
任何人都試過類似這種技術的東西,或者對抗這個分支驗證拒絕?
謝謝fadden和JesusFreke。在更改班級中的預驗證標誌之後,它像4.1虛擬設備上的魅力一樣工作! – ma11p