SlideShare a Scribd company logo
DoActionからJava VMバイトコー
       ドに変換する話

     恵森 将太郎(@emorins)
何やるか



     DoActionから
  Java VMバイトコード
        に変換
どうやってやるか
        SWFの解析
             ↓

      DoActionタグの解析
             ↓

      Actionタグの解析
             ↓
     Actionタグから対応するJavaVM
     バイトコードに変換
             ↓
     classファイルの生成
     Java VMで実行
最終的な目標

・ActionScriptでJavaアプリの開発 
・swfからJavaアプリへの変換
あるいは今回はJava VMですが、Dalvik VMバイトコードにして、

・swfからAndroidアプリケーションへの変換
・ActionScriptでAndroidアプリの開発など
今日具体的にやること




簡単な加算演算と変数への
代入を変換
ActionScriptコード


i = 4;
i = 2 + 3;


Flash lite 1.1 (swf v4)
DoActionタグのContents


     009603000069009603
     000034001d960300
     0069009603000035
     001d00
アクション

ActionPush
値をスタックにpush

 ACTIONRECORDHEADER
   オペコード:0x96
   Length

 Type
    0 = 文字列リテラル
    1 = 浮動小数点数リテラル 

 値
アクション

ActionSetVariable
スタックから値をpop、次に変数をpopし、変数に値をセット

 ACTIONRECORDHEADER
   オペコード:0x1d
アクション


0: ActionPush: i
1: ActionPush: 4
2: ActionSetVariable:
3: ActionPush: i
4: ActionPush: 5
5: ActionSetVariable:
スタックの流れ



   4        →         → 5            →
    i                       i

 0,1             2         3              4
 i,4をpush       順に変数名、    i,5をpush       順に変数名、
                値をpopし、                  値をpopし、
                セット                      セット
Javaコード

class Main{
   public static void main(String[] args){
     int i = 4;
     i = 2 + 3;
   }
}
演算しているところのバイト列



     073C083CB1
Javaバイトコード
% javap -c Main

Compiled from "Main.java"
class Main extends java.lang.Object{
Main();
 Code:
  0: aload_0
  1: invokespecial #1; //Method java/lang/Object."<init>":()V
  4: return

public static void main(java.lang.String[]);
  Code:
  0: iconst_4
  1: istore_1
  2: iconst_5
  3: istore_1
  4: return
}
命令セット

iconst_<i>
int 定数をオペランド・スタックへpush

オペコード:iconst_4=0x7, iconst_5=0x8


istore_<n>
オペランド・スタックの先頭から(int型)のvalueをpopし、
ローカル変数nにセット

オペコード:iconst_1=0x3c
スタックの流れ



          →             →            →
   4                          5
  0             1            2            3
 4をpush       先頭からpop       5をpush       先頭からpop
              し変数に代入                     し変数に代入
評価器がスタックマシンでどっちも似てるね
変換する

 ActionPush: i はいらないね
 ActionPush: 4 はiconst_4に変換
 ActionSetVariableで、istore_1


あとはローカル変数テーブルとか用意しないと駄目だけど割愛
変換したバイトデータを.classで保存
ちゃんとJava VMバイトコードに変換できているか確認
% javap -c Main
Compiled from "Main.java"
class Main extends java.lang.Object{
Main();
 Code:
  0: aload_0
  1: invokespecial #1; //Method java/lang/Object."<init>":()V
  4: return

public static void main(java.lang.String[]);
 Code:
 0: iconst_4
 1: istore_1
 2: iconst_5
 3: istore_1
 4: return

}
ご清聴ありがとうございました

More Related Content

PDF
ActionScriptを使わないFlash勉強会 #1(前日版)
PPTX
Mvpvm pattern
PPTX
T90 きっと怖くないmvvm & mvpvm
PDF
講座Java入門
PDF
Java8のstreamをダラダラまとめてみる
PDF
社内Java8勉強会 ラムダ式とストリームAPI
PPTX
LINQ 概要 + 結構便利な LINQ to XML
PDF
オブジェクト指向できていますか?
ActionScriptを使わないFlash勉強会 #1(前日版)
Mvpvm pattern
T90 きっと怖くないmvvm & mvpvm
講座Java入門
Java8のstreamをダラダラまとめてみる
社内Java8勉強会 ラムダ式とストリームAPI
LINQ 概要 + 結構便利な LINQ to XML
オブジェクト指向できていますか?

What's hot (19)

PDF
C++0x 言語の未来を語る
PDF
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
PDF
知って得するC#
PPTX
Java8勉強会
PDF
クロージャデザインパターン
PDF
JavaScript入門-基礎編
PPTX
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
PPT
ジェネリクスの基礎と クラス設計への応用
PDF
Emcpp item31
PPTX
T93 com入門
PDF
JavaのGenericsとは?
PDF
Xtend30分クッキング やきに駆動
PDF
Xtend30分クッキング
PPTX
競技プログラミングのためのC++入門
PDF
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
PDF
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
PPTX
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
PDF
JavaScript 講習会 #1
PDF
Scalaでプログラムを作りました
C++0x 言語の未来を語る
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
知って得するC#
Java8勉強会
クロージャデザインパターン
JavaScript入門-基礎編
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
ジェネリクスの基礎と クラス設計への応用
Emcpp item31
T93 com入門
JavaのGenericsとは?
Xtend30分クッキング やきに駆動
Xtend30分クッキング
競技プログラミングのためのC++入門
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
JavaScript 講習会 #1
Scalaでプログラムを作りました
Ad

Viewers also liked (13)

PDF
Hacking swf
PDF
Billet defects pinhole and blowhole formation prevention and evolution
PDF
Android Development: Build Android App from Scratch
PPTX
SWF LOVE (ASを使わないFlash勉強会 #1)
PPTX
Chapter2 (JF302)
PPTX
Production of iron and steel
PPTX
Iron & steel
PPT
Secondary steel making processes
PPTX
PPTX
Types of iron and steel
PPTX
PPT
Casting defects
PDF
Presentation on steel
Hacking swf
Billet defects pinhole and blowhole formation prevention and evolution
Android Development: Build Android App from Scratch
SWF LOVE (ASを使わないFlash勉強会 #1)
Chapter2 (JF302)
Production of iron and steel
Iron & steel
Secondary steel making processes
Types of iron and steel
Casting defects
Presentation on steel
Ad

Similar to DoActionからJava VMバイトコードに変換する話 (20)

PDF
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
PDF
InvokeDynamic at #shikadriven 2012
PDF
JVMの中身を可視化してみた
PDF
Dalvikバイトコードリファレンスの読み方 改訂版
PPT
d-kami x86-2
PDF
Android道第1回公開用
PPTX
JJUG CCC 2016 fall バイトコードが君のトモダチになりたがっている
PDF
Javaで作る超簡易x86エミュレータ
PDF
d-kami x86-1
PDF
Java SE 7 InvokeDynamic in JRuby
PPTX
Enshu8
PDF
Dalvik仮想マシンのアーキテクチャ 改訂版
PDF
V6 unix in okinawa
PDF
Mbed2013
PDF
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
PDF
Var handles jjug_ccc_spring_2018
PPTX
jvmlang.daitokai 1.0.0 MinCamlJを作ってみた
PDF
いでよ、電卓!
KEY
Actor&stm
PPTX
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
InvokeDynamic at #shikadriven 2012
JVMの中身を可視化してみた
Dalvikバイトコードリファレンスの読み方 改訂版
d-kami x86-2
Android道第1回公開用
JJUG CCC 2016 fall バイトコードが君のトモダチになりたがっている
Javaで作る超簡易x86エミュレータ
d-kami x86-1
Java SE 7 InvokeDynamic in JRuby
Enshu8
Dalvik仮想マシンのアーキテクチャ 改訂版
V6 unix in okinawa
Mbed2013
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
Var handles jjug_ccc_spring_2018
jvmlang.daitokai 1.0.0 MinCamlJを作ってみた
いでよ、電卓!
Actor&stm
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc

DoActionからJava VMバイトコードに変換する話