JavaVMにはバイトコード検証器(Java bytecode verifier)と呼ばれるクラスファイルが正しく作成されたものか判断する機構が備わっている
検査する内容
バイトコード検証機能はオペランドスタックの挙動が意図した挙動を示すかチェックを行う
- オペランドスタックに積まれた命令がすべて正しく取り出されているか
- push/popが同じ回数呼び出されているかチェックする。
- pushを5回/popを8回行うとスタックアンダーフローが発生する
- オペランドスタックに積まれた値がpush時とpop時で同じ型を表しているか
- 一部の捜査では異なる型のpush/popを許可しているが原則禁止
バイトコード検証機能の有効/無効
デフォルトではバイトコード検証機能は有効になっている
下記のオプションで有効範囲を選択可能
ネットワーク経由でロードされたクラスに対して検証を行う
java -Xverify:remote ApplicationName
無効にする場合
java -Xverify:none ApplicationName
全てのクラスを強制検査する場合
java -Xverify:all ApplicationName
Androidの場合
adbを利用する場合
有効にする場合
adb shell setprop dalvik.vm.dexopt-flags v=a
無効にする場合
adb shell setprop dalvik.vm.dexopt-flags v=n
dalvikVMもjavaVM同様Xverifyオプションで有効/無効が設定可能