1

コードを難読化するために、apk の dex ファイルを変更しようとしています。

Eclipse で次のコードをコンパイルします。

boolean test = false; 
SmsManager sm = SmsManager.getDefault();

if (test){ // always false
    test = true;  // this branch is never taken 
} else {
    String messageBody = "sms";
    sm.sendTextMessage("5556", null, messageBody, null, null);
}

したがって、「else ブランチ」のみが実行されます。もう 1 つのブランチはデッド コードです。次に、Eclipse を使用してコードを apk にエクスポートします。

その後、apktools で apk を開き、dex ファイルを取得すると、次のバイトコードが得られます。

CODE:3EE80                      const/4                    v2, 0
CODE:3EE82 206F 001C 0087       invoke-super               {this, p0}, <void Activity.onCreate(ref) imp. @ _def_Activity_onCreate@VL>
CODE:3EE88 0115 7F03            const/high16               v1, 0x7F030000
CODE:3EE8C 206E 12C9 0017       invoke-virtual             {this, v1}, <void MainActivity.setContentView(int) imp. @ _def_MainActivity_setContentView@VI>
CODE:3EE92 0612                 const/4                    v6, 0
CODE:3EE94 0071 0FD3 0000       invoke-static              {}, <ref SmsManager.getDefault() imp. @ _def_SmsManager_getDefault@L>
CODE:3EE9A 000C                 move-result-object         v0
CODE:3EE9C 0638 0003            if-eqz                     v6, loc_3EEA2
CODE:3EEA0 1612                 const/4                    v6, 1
CODE:3EEA2
CODE:3EEA2 031A 143A            const-string               v3, aSmsI # "sms"
CODE:3EEA6 011A 00BE             const-string              v1, a5556 # "5556"
CODE:3EEAA 2407                  move-object               v4, v2
CODE:3EEAC 2507                  move-object               v5, v2
CODE:3EEAE 0674 0FD4 0000        invoke-virtual/range      {v0..v5}, <void SmsManager.sendTextMessage(ref, ref, ref, ref, ref) imp. @ _def_SmsManager_sendTextMessage@VLLLLL>
CODE:3EEB4 000E                  return-void
CODE:3EEB4                       Method End

0x3eea0 の if/else コンストラクトのデッド コードを変更して、オーバーラップさせ、「else ブランチ」のコードの一部を非表示にします。

CODE:3EEA0 0218 031A 143A 011A+ const-wide               v2:v3, 0xBE011A143A031A
CODE:3EEAA 2407                 move-object                v4, v2
CODE:3EEAC 2507                 move-object                v5, v2
CODE:3EEAE 0674 0FD4 0000       invoke-virtual/range       {v0..v5}, <void SmsManager.sendTextMessage(ref, ref, ref, ref, ref) imp. @ _def_SmsManager_sendTextMessage@VLLLLL>
CODE:3EEB4 000E                 return-void
CODE:3EEB4                      Method End

次に、dex ファイルのチェックサムとハッシュを変更します。apktools で apk を閉じ、jarsigner で署名します。

adb を使用して、エミュレートされたデバイスに apk をインストールします。すべて成功です。

しかし、アプリケーションを起動しようとするとクラッシュし、デバイスに次のエラーが表示されます:「残念ながら、myApps が停止しました」。

logcat は私にこれを与えます:

09-06 08:31:13.126: E/AndroidRuntime(874): FATAL EXCEPTION: main
09-06 08:31:13.126: E/AndroidRuntime(874): java.lang.VerifyError: trust/vuln/myApps/MainActivity
09-06 08:31:13.126: E/AndroidRuntime(874):  at java.lang.Class.newInstanceImpl(Native Method)
09-06 08:31:13.126: E/AndroidRuntime(874):  at java.lang.Class.newInstance(Class.java:1130)
09-06 08:31:13.126: E/AndroidRuntime(874):  at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
09-06 08:31:13.126: E/AndroidRuntime(874):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2128)
09-06 08:31:13.126: E/AndroidRuntime(874):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
09-06 08:31:13.126: E/AndroidRuntime(874):  at android.app.ActivityThread.access$600(ActivityThread.java:141)
09-06 08:31:13.126: E/AndroidRuntime(874):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
09-06 08:31:13.126: E/AndroidRuntime(874):  at android.os.Handler.dispatchMessage(Handler.java:99)
09-06 08:31:13.126: E/AndroidRuntime(874):  at android.os.Looper.loop(Looper.java:137)
09-06 08:31:13.126: E/AndroidRuntime(874):  at android.app.ActivityThread.main(ActivityThread.java:5103)
09-06 08:31:13.126: E/AndroidRuntime(874):  at java.lang.reflect.Method.invokeNative(Native Method)
09-06 08:31:13.126: E/AndroidRuntime(874):  at java.lang.reflect.Method.invoke(Method.java:525)
09-06 08:31:13.126: E/AndroidRuntime(874):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
09-06 08:31:13.126: E/AndroidRuntime(874):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-06 08:31:13.126: E/AndroidRuntime(874):  at dalvik.system.NativeStart.main(Native Method)
09-06 08:31:13.226: W/ActivityManager(288):   Force finishing activity com.vuln.myApps/.MainActivity

アプリ内でバイトコードが重複しているため、java.lang.VerifyError が発生していますか? とにかく、Android アプリケーションで重複するバイトコードを実装することはありますか?

4

1 に答える 1

1

Dalvik ベリファイアでは、命令の途中に分岐することはできません。あなたが試みていることは特に許可されていません。

質問に示されている例外の数行上にある logcat の出力を見ると、特定の問題点を示す一連の「VFY」メッセージが表示されるはずです。

于 2013-09-06T14:50:01.020 に答える